Test 1
有一个员工表,employees
简况如下:
有一个部门表,dept_emp
简况如下:
请你查找所有已经分配部门的员工的 last_name
和 first_name
以及 dept_no
,也包括暂时没有分配具体部门的员工,以上例子如下:
解题思路
考察知识点
左联结,右联结。
根据题目的要求查询的结果集中要包含所有员工的信息,那么再将表进行连接时就需要注意主从表的选择,应将 employees
作为主表,即保留 employees
表中的全部数据,即便在从表中没有对应的数据。下面是 左联结
的解法。
SELECT e.last_name, e.first_name, d.dept_no FROM employees AS e LEFT JOIN dept_emp AS d ON e.emp_no = d.emp_no 复制代码
右联结
SELECT e.last_name, e.first_name, d.dept_no FROM dept_emp AS d RIGHT JOIN employees AS e ON e.emp_no = d.emp_no 复制代码
Test 2
有一个薪水表,salaries
简况如下:
请你查找薪水记录超过 15 次的员工号 emp_no
以及其对应的记录次数 t
,以上例子输出如下:
解题思路
考察知识点
GROUP BY
,HAVING
。
根据题目要求,首先明确查询的结果中包含 emp_no
,以及变动次数 t
。使用 count
函数和 group by
分组可以统计变动次数。
SELECT emp_no, count(salary) t FROM salaries GROUP BY emp_no HAVING t > 15 复制代码
拓展:上面只统计了薪水记录超过15的员工信息,如果要统计涨薪超过 15 次员工 emp_no
和次数 t
,那么就要注意,真正的涨薪都是正数,并且第二次开始才算一次涨幅,所以可以参考下面的写法。
SELECT s1.emp_no, COUNT(s1.salary) AS t FROM salaries AS s1 INNER JOIN salaries AS s2 ON s1.emp_no = s2.emp_no AND s1.to_date = s2.from_date WHERE s1.salary < s2.salary GROUP BY s1.emp_no HAVING t > 15