SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no
解答:
方法1)外部表联结
左外部联结(LEFT JOIN)- 包含左边表的所有列
SELECT e.first_name,e.last_name,d.dept_no
FROM employees as e
LEFT JOIN dept_emp as d
on e.emp_no = d.emp_no
WHERE d.dept_no is not null
右外部联结(RIGHT JOIN)- 包含右边表的所有列
SELECT e.first_name,e.last_name,d.dept_no
FROM employees as e
RIGHT JOIN dept_emp as d
on e.emp_no = d.emp_no
方法2)内部联结
SELECT e.first_name, e.last_name, d.dept_no
FROM employees AS e
INNER JOIN dept_emp AS d
ON e.emp_no = d.emp_no
方法3)使用where子查询
通过WHERE子句筛选已经分配部门的员工
SELECT e.first_name,e.last_name,d.dept_no
FROM dept_emp as d,employees as e
WHERE d.emp_no = e.emp_no
SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
解答:
注意是大表(数据量多的)在前,使用外连接
select
last_name,first_name,dept_no
from employees a left join dept_emp b
on a.emp_no=b.emp_no
SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
解答:
拿到题目后,我们不要着急一次性写出代码,先将题目进行分解。
1、按照员工号进行分组,先算出表中的薪水记录条数,这里使用到
group by、count
两个复合函数。
具体的SQL语句:
select emp_no,count(emp_no) as countNo
from salaries
group by emp_no;
注意,这里一定进行分组,不然就是统计整张表的记录,这不是我们想要的。
2、查询到上述的记录后,我们就已经知道了每一个员工在表中的薪水记录条数,那么,接下来我们该如何去得
到我们想要的数据。我们再看回看一下题目:查找薪水记录超过15次的员工号emp_no,从上面的查询语
句中,我们已经获得了每一个员工的记录条数,按照我们往常的思路,查找XXX记录,条件是其XXX大于XX,
我们都会在SQL语句后面补上where XXX > XX。这道题我们能否也这样做呢?
答案是肯定的。
我们将上述查询到的结果看做是一张临时表,注意:这里的思路转换非常很重要。
select emp_no,count(emp_no) as t from salaries group by emp_no as s;
那么,原题目将被转换为:从临时表中,找到 countNo 大于 15 的员工号及记录条数,这个显然就是一条
很简单的查询语句。
select emp_no,t
from (select emp_no,count(emp_no) t from salaries group by emp_no) s
where s.t > 15;
我的写法(直接使用Having 在GROUP BY后面作为筛选条件)