「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。
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
这就是今天要分享的内容,微信搜 Python新视野,每天带你了解更多有用的知识。更有整理的近千套简历模板,几百册电子书等你来领取哦!另外还有Python小白交流群,如果有兴趣可以通过上面的方式联系我哦!