SQL两表练习

已知2张基本表:部门表:dept (部门号,部门名称);员工表emp(员工号,员工姓名,年龄,入职时间,收入,部门号)

1:dept表中有4条记录:

部门号 部门名称

101 财务

102 销售

103 IT技术

104 行政

2:emp表中有6条记录:

员工号 员工姓名 年龄 入职时间 收入 部门号

1789 张三 35 1980/1/1 4000 101

1674 李四 32 1983/4/1 3500 101

1776 王五 24 1990/7/1 2000 101

1568 赵六 57 1970/10/11 7500 102

1564 荣七 64 1963/10/11 8500 102

1879 牛八 55 1971/10/20 7300 103

#dept 左连接查询

SELECT * FROM dept d LEFT JOIN emp e on d.dept1=e.dept2

#dept 右连接查询

SELECT * FROM dept d RIGHT JOIN emp e on d.dept1=e.dept2

注:左连接查询和右连接查询的区别在域dept表中104 行政数据为显示

1.列出每个部门的平均收入及部门名称;

SELECT dept_name 部门名称 ,AVG(incoming) 平均收入 from dept d RIGHT JOIN emp e on d.dept1=e.dept2 GROUP BY dept_name

2.财务部门的收入总和;

SELECT SUM(incoming) 收入总和 from dept d left JOIN emp e on d.dept1=e.dept2 WHERE dept_name = '财务'

3.It技术部入职员工的员工号

SELECT sid 员工号 from dept d left JOIN emp e on d.dept1=e.dept2 WHERE dept_name = 'IT技术' ;

4.财务部门收入超过2000元的员工姓名

SELECT name 员工姓名 from dept d left JOIN emp e on d.dept1=e.dept2 where incoming > 2000 and dept_name = '财务'

5.找出销售部收入最低的员工的入职时间

SELECT worktime_start 入职时间 from dept d RIGHT JOIN emp e on d.dept1=e.dept2

where dept_name = '销售' AND incoming =(SELECT MIN(incoming)FROM dept d RIGHT JOIN emp eon d.dept1=e.dept2 where dept_name = '销售')

6.找出年龄小于平均年龄的员工的姓名,ID和部门名称

SELECT name 姓名 , sid ID, dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 where age<(SELECT AVG(age) FROM emp)

#扩展6.找出每个部门年龄小于或等于平均年龄的员工的姓名,ID和部门名称

SELECT name 名字 ,sid ID ,dept_name 部门名称 FROM emp e left JOIN dept d on e.dept2=d.dept1 LEFT JOIN (SELECT dept2 ,avg(age)a FROM emp GROUP BY dept2)b on e.dept2=b.dept2 WHERE e.age <= b.a

7.列出每个部门收入总和高于9000的部门名称

SELECT dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 GROUP BY dept_name HAVING sum(incoming)>9000

8.查出财务部门工资少于3800元的员工姓名

SELECT name 姓名 from emp left JOIN dept on emp.dept2=dept.dept1 where incoming < 3800 and dept_name = '财务'

9.求财务部门最低工资的员工姓名

SELECT name from emp left JOIN dept on emp.dept2=dept.dept1 WHERE incoming =( SELECT min(incoming) from emp left JOIN dept on emp.dept2=dept.dept1 where dept_name = '财务')

10.找出销售部门中年纪最大的员工的姓名

SELECT name from emp left JOIN dept on emp.dept2=dept.dept1 WHERE age= (SELECT max(age) from emp left JOIN dept on emp.dept2=dept.dept1 where dept_name = '销售' ) and dept_name ='销售'

11.求收入最低的员工姓名及所属部门名称

SELECT name 名字 ,dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 where incoming=(SELECT min(incoming) FROM emp left JOIN dept on emp.dept2=dept.dept1)

12.求李四的收入及部门名称

SELECT incoming 收入, dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 where name = '李四';

13.求员工收入小于4000元的员工部门编号及其部门名称

SELECT DISTINCT(dept1) 部门编号,dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 where incoming < 4000

14.列出每个部门中收入最高的员工姓名,部门名称,收入,并按照收入降序

SELECT name 名字 ,dept_name 部门名称 ,incoming 收入 from emp left JOIN dept on emp.dept2=dept.dept1 where (dept_name,incoming) in (SELECT dept_name, max(incoming) FROM emp left JOIN dept on emp.dept2=dept.dept1 GROUP BY dept_name) ORDER BY incoming DESC

15.求出财务部门收益最高的俩位员工的姓名,工号,收益

select name 姓名,sid 工号,incoming 收入 from emp e right join dept d on e.dept2 = d.dept1

where incoming in (select * from (select incoming from emp e right join dept d on e.dept2 = d.dept1 where dept_name = '财务' order by incoming desc limit 2)a) and dept_name = '财务'

16.查询财务部低于平均收入的员工号与员工姓名

SELECT sid工号,name姓名 from emp left JOIN dept on emp.dept2=dept.dept1 WHERE incoming < (SELECT avg(incoming) FROM emp) and dept_name='财务'

17.列出部门员工数大于1个的部门名称

SELECT dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 GROUP BY dept_name having count(dept_name) >1

18.列出部门员工收入不超过7500,且大于3000的员工年纪及部门编号

SELECT age 年龄, dept1 部门编号 FROM dept d RIGHT JOIN emp e on d.dept1=e.dept2 WHERE incoming >3000 and incoming <=7500

19.求入职于20世纪70年代的员工所属部门名称

SELECT dept_name 部门名称 FROM emp left JOIN dept on emp.dept2=dept.dept1 where worktime_start like "197%"

20.查找张三所在的部门名称

SELECT dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 WHERE name = '张三'

21.列出每一个部门中年纪最大的员工姓名,部门名称

SELECT name 名称 ,dept_name 部门名称 FROM emp left JOIN dept on emp.dept2=dept.dept1 WHERE (emp.dept2,age) in (SELECT dept2 ,max(age) from emp GROUP BY emp.dept2)

22.列出每一个部门的员工总收入及部门名称

SELECT sum(incoming)部门总收入,dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 GROUP BY dept_name

23.列出部门员工收入大于7000的员工号,部门名称

SELECT sid 员工号 ,dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 WHERE incoming > 7000

24.找出哪个部门还没有员工入职

SELECT dept_name 部门名称 from dept left JOIN emp on dept.dept1=emp.dept2 WHERE name is NULL

25.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表

SELECT dept1 部门号,worktime_start 入职时间 from dept RIGHT JOIN emp on dept.dept1=emp.dept2 ORDER BY dept1 DESC , worktime_start ASC

26.求出财务部门工资最高员工的姓名和员工号

SELECT name 名字,sid 员工号 from emp left JOIN dept on emp.dept2=dept.dept1 WHERE dept_name = '财务' and incoming =(select max(incoming) from emp e right join dept d on e.dept2 = d.dept1 where dept_name = '财务')

27.求出工资在7500到8500之间,年龄最大的员工的姓名和部门名称

SELECT name 名字, dept_name 部门名称 from emp left JOIN dept on emp.dept2=dept.dept1 WHERE incoming BETWEEN 7500 and 8500 and age=(SELECT max(age) FROM emp left JOIN dept on emp.dept2=dept.dept1)

28.修改员工工资最高的员工姓名,改成‘董事长’,并将他的所在部门改成'董事办'

update (select max(incoming)m from emp)a left join emp e on e.incoming =a.m left join dept d on e.dept2 = d.dept1 set name = '董事长',dept_name = '董事办'

SELECT * FROM dept d LEFT JOIN emp e on d.dept1=e.dept2

SELECT * FROM dept d RIGHT JOIN emp e on d.dept1=e.dept2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值