5.2 SELECT 的执行顺序
FROM ..., ...-> ON -> (LEFT/RIGNT JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
由于GROUP BY分组操作的执行在WHERE之后,所以不能使用WHERE过滤分组后的数据;
由于SELECT的执行时间在WHERE之后,所以在WHERE中不能使用SELECT中字段的别名。
6. 聚合函数练习
6.1 题目
#1.where子句可否使用组函数进行过滤? #2.查询公司员工工资的最大值,最小值,平均值,总和 #3.查询各job_id的员工工资的最大值,最小值,平均值,总和 #4.选择具有各个job_id的员工人数 # 5.查询员工最高工资和最低工资的差距(DIFFERENCE) # 6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 # 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序 # 8.查询每个工种、每个部门的部门名、工种名和最低工资
6.2 解答
1.where子句可否使用组函数进行过滤?
不能,使用组函数对数据进行过滤只能使用HAVING
2.查询公司员工工资的最大值,最小值,平均值,总和
# 2.查询公司员工工资的最大值,最小值,平均值,总和 SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees;
3.查询各job_id的员工工资的最大值,最小值,平均值,总和
# 3.查询各job_id的员工工资的最大值,最小值,平均值,总和 SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees GROUP BY job_id;
4.查询各个job_id的员工人数
# 4.查询各个job_id的员工人数 SELECT job_id, COUNT(*) FROM employees GROUP BY job_id;
5.查询员工最高工资和最低工资的差距(DIFFERENCE)
# 5.查询员工最高工资和最低工资的差距(DIFFERENCE) SELECT MAX(salary) - MIN(salary) "DIFFERENCE" FROM employees;
6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
# 6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内 SELECT manager_id, MIN(salary) min_salry FROM employees # 没有管理者的员工不计算在内 WHERE manager_id IS NOT NULL GROUP BY manager_id # 其中最低工资不能低于6000 HAVING min_salry > 6000;
7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
# 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序 SELECT d.department_name, d.location_id, # 由于有些部门没有员工,由于连接表的方式为左连接, # 没有员工的部门也存在一条记录,使用COUNT(*),统计记录数 # 没有员工的部门会统计出来1,所以不使用COUNT(*)使用COUNT(e.employee_id) # 统计每个部门的员工 COUNT(e.employee_id), # 没有员工的部门,salary为null,计算出来为null AVG(e.salary) avg_sal FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id # 出现在SELECT子句中的字段必须也要出现在GROUP BY子句中 GROUP BY d.department_name, d.location_id ORDER BY avg_sal DESC;
8.查询每个工种、每个部门的部门名、工种名和最低工资
# 8.查询每个工种、每个部门的部门名、工种名和最低工资 # 由于有些部门没有员工所以这些部门的工种以及对应的最低工资为null SELECT e.job_id, d.department_name, MIN(e.salary) FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id GROUP BY e.job_id, d.department_name;