表结构回顾

16. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
由题意知,没有员工的部门也需要列出来,所以是右连接
SELECT
e.*,
d.dName
FROM emp e
RIGHT JOIN dept d
ON e.deptNo = d.deptNo;

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');

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;

第三步:继续关联部门表获得部门名称,然后筛选出工作为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';

20. 列出最低薪水大于1500的各种工作及从事此工作的全部雇员人数
获得每个工作的最低薪水,由于本身就是对job分组,所有可以直接获得每个部门的人数,过滤掉最低薪水小于等于1500的即可
SELECT
job,
MIN(sal) AS min_sal,
COUNT(*) AS total_cnt
FROM emp
GROUP BY job
HAVING min_sal > 1500;

584

被折叠的 条评论
为什么被折叠?



