练习16-20:右连接、分组聚合、子查询

表结构回顾

练习16-20:右连接、分组聚合、子查询_第1张图片

16. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

由题意知,没有员工的部门也需要列出来,所以是右连接

SELECT
	e.*,
	d.dName
FROM emp e
RIGHT JOIN dept d
ON e.deptNo = d.deptNo;

练习16-20:右连接、分组聚合、子查询_第2张图片

17. 列出至少有5个员工的所有部门

获取每个部门的人数,筛出大于等于5的即可

SELECT
	deptNo,
	COUNT(*) AS emp_cnt
FROM emp
GROUP BY deptNo
HAVING emp_cnt >= 5;

在这里插入图片描述

18. 列出薪水比“SMITH”多的所有员工信息

查出SMITH的薪水,然后作为where条件的值,查出大于这个值的所有员工即可

SELECT 
	*
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE eName = 'SMITH');

练习16-20:右连接、分组聚合、子查询_第3张图片

19. 列出所有“CLERK”(办事员)的姓名及其部门名称,部门人数

第一步:拿到每个部门的人数
SELECT deptNo,COUNT(*) AS cnt FROM emp GROUP BY deptNo;
在这里插入图片描述

第二步:将部门人数和员工姓名放到同一行去

SELECT 
	e.*,
	t.cnt
FROM emp e
JOIN (SELECT deptNo,COUNT(*) AS cnt FROM emp GROUP BY deptNo) AS t
ON e.deptNo = t.deptNo;

练习16-20:右连接、分组聚合、子查询_第4张图片

第三步:继续关联部门表获得部门名称,然后筛选出工作为CLERK的员工

SELECT 
	e.eName,
	d.dName,
	t.cnt
FROM emp e
JOIN (SELECT deptNo,COUNT(*) AS cnt FROM emp GROUP BY deptNo) AS t
ON e.deptNo = t.deptNo
JOIN dept d
ON e.deptNo = d.deptNo
WHERE e.job = 'CLERK';

练习16-20:右连接、分组聚合、子查询_第5张图片

20. 列出最低薪水大于1500的各种工作及从事此工作的全部雇员人数

获得每个工作的最低薪水,由于本身就是对job分组,所有可以直接获得每个部门的人数,过滤掉最低薪水小于等于1500的即可

SELECT
	job,
	MIN(sal) AS min_sal,
	COUNT(*) AS total_cnt
FROM emp 
GROUP BY job
HAVING min_sal > 1500;

练习16-20:右连接、分组聚合、子查询_第6张图片

你可能感兴趣的:(#,MySQL练习34题,数据库)