MySQL学习-函数(十七)

140 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

前言

上篇我们学习完了MySQL中的聚合函数。有兴趣的小伙伴可以阅读(# MySQL学习-函数(十六))。
下面继续针对MySQL中的聚合函数写一些练习题。

练习一

WHERE语句是否可以使用聚合函数进行过滤?
不可以使用,根据上一节SQL的执行顺序,就可以知道WHERE中不可以使用聚合函数过滤。

练习二

查询员工工资的最大值,最小值,平均值,总和

SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees;
MAX(salary)MIN(salary)AVG(salary)SUM(salary)
6800.003200.005000.0010000.00

练习三

查询各job_id的员工工资的最大值,最小值,平均值,总和
分析,这里需要对job_id进行分组。

SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees
GROUP BY job_id;
job_idMAX(salary)MIN(salary)AVG(salary)SUM(salary)
16800.006800.006800.0013600.00
23200.003200.003200.006400.00

练习四

查询各job_id的员工人数
分析,这里需要对job_id进行分组。使用COUNT(*)计数。

SELECT job_id, COUNT(*)
FROM employees
GROUP BY job_id;
job_idCOUNT(*)
11
21

练习五

查询员工工资的最大值和最小值的差距

SELECT MAX(salary) - MIN(salary)
FROM employees;
MAX(salary) - MIN(salary)
3600.00

练习六

查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
分析:根据管理者进行分组,并过滤掉没有管理者的数据。使用IS NOT NULL,这里使用WHERE进行过滤。并且对最低工资进行过滤,聚合函数需要HAVING进行过滤。

SELECT manager_id, MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) >= 6000;
manager_idMIN(salary)
1016800.00

练习七

查询所有部门的名字,location_id, 员工数量和平均工资,并按平均工资降序
分析:所有部门,需要考虑外连接。分组后,可能存在员工id为NULL的情况,这时候使用COUNT(*),由于它不计算NULL的情况,所以计算出来的结果会有错误。这里可以使用具体的字段来计算数量。

SELECT department_name, location_id, COUNT(employee_id), AVG(salary)
FROM department d LEFT JOIN employees e
ON d.'department_id' = e.'department_id'
GROUP BY department_name, location_id
department_namelocation_idCOUNT(employee_id)AVG(salary)
IT10025000.00

这样就可以查出正确的结果。

练习八

查询每个工种,每个部门的部门名、工种名和最低工资
分析:查询每个,就是查询所有,需要使用外连接。并且分组时,需要把不是聚合函数的字段全部进行分组。

SELECT department_name, job_id, MIN(salary)
FROM department d LEFT JOIN employees e
ON d.'department_id' = e.'department_id'
GROUP BY department_name, job_id
department_namejob_idMIN(salary)
IT16800.00
IT23200.00

聚合函数的练习就做完了,今天先学习到这里,明天继续。