持续创作,加速成长!这是我参与「掘金日新计划 · 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.00 | 3200.00 | 5000.00 | 10000.00 |
练习三
查询各job_id的员工工资的最大值,最小值,平均值,总和
分析,这里需要对job_id进行分组。
SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees
GROUP BY job_id;
| job_id | MAX(salary) | MIN(salary) | AVG(salary) | SUM(salary) |
|---|---|---|---|---|
| 1 | 6800.00 | 6800.00 | 6800.00 | 13600.00 |
| 2 | 3200.00 | 3200.00 | 3200.00 | 6400.00 |
练习四
查询各job_id的员工人数
分析,这里需要对job_id进行分组。使用COUNT(*)计数。
SELECT job_id, COUNT(*)
FROM employees
GROUP BY job_id;
| job_id | COUNT(*) |
|---|---|
| 1 | 1 |
| 2 | 1 |
练习五
查询员工工资的最大值和最小值的差距
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_id | MIN(salary) |
|---|---|
| 101 | 6800.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_name | location_id | COUNT(employee_id) | AVG(salary) |
|---|---|---|---|
| IT | 100 | 2 | 5000.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_name | job_id | MIN(salary) |
|---|---|---|
| IT | 1 | 6800.00 |
| IT | 2 | 3200.00 |
聚合函数的练习就做完了,今天先学习到这里,明天继续。