表结构回顾
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;