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

表结构回顾

在这里插入图片描述

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;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值