数据库中有关多表查询的综合练习(含详细解答)

📘本专栏文章主要是争对博主在学习《数据库原理及应用》课程时老师布置的课后练习题做出的解答,如果遇到相同的题目建议看着本文自己动手实践一遍,这样才能加深印象。
🎈如果想要了解数据库有关知识点的话,可以点击下方链接进行查看
🔑 本专栏地址【数据库练习题
🔑有关数据库的知识点请戳⏩【数据库知识点总结
🔑 另一个正在更新的专栏【拼图小游戏(Java)

一、概述

本文包含九道多表查询相关练习题,有一些难度较大,建议读者在复习完前面数据库的内容后再来阅读本文

二、题目所用表

EMP

E#ENAMEAGESEXECITY
0001李华58南京
0002李丽23上海
0003王建国52温州
0004陈颖32北京
0005刘晓华29上海
0006韩梅梅42安徽

WORKS

E#C#SALARY
0001C0012500
0002C0013500
0003C0022500
0004C0027500
0006C0021300
0003C0031100
0005C0036200
0006C0011200

COMP

C#CNAMECITY
C001联华公司上海
C002某公司深圳
C003学而思上海

三、题目及详细解答

1.检索超过50岁的男职工的工号和姓名

简单的查询,这里不多加赘述,直接上语句

SELECT E#,ENAME FROM EMP WHERE AGE > 50 AND SEX = '男';

在这里插入图片描述

2.设职工只能在一个公司工作,检索工资超过1000元的男职工工号和姓名

  • 这道题我们可以用子查询,也是一个简单的多表查询
  • EMP表中检索E#ENAME
  • WORKS检索工资超过1000元的员工且性别为男(子查询)
SELECT EMP.E#,ENAME FROM EMP WHERE E# IN (SELECT WORKS.E# FROM WORKS WHERE SALARY > 1000) AND SEX = '男';

在这里插入图片描述

3.设职工可在多个公司工作,检索在编号C002和C003兼职的职工工号和姓名

  • 这道题我们可以用子查询,也是一个简单的多表查询
  • 查询出公司编号为C002、C003的员工编号
  • 再到员工表中根据对应编号查找姓名
SELECT E#,ENAME FROM EMP WHERE  EMP.E# IN(SELECT DISTINCT E# FROM WORKS WHERE C# = 'C002' OR C# = 'C003' )

在这里插入图片描述

4.检索在“联华公司”工作、工资超过1000元的男性职工的工号和姓名

  • 这里要联合三个表格进行查询
  • 联合条件:EMP.E# = WORKS.E# AND WORKS.C# = COMP.C#
  • 三个筛选条件:COMP.CNAME = '联华公司'WORKS.SALARY > 1000EMP.SEX = '男'
SELECT EMP.E#,EMP.ENAME FROM EMP,WORKS,COMP WHERE EMP.E# = WORKS.E# AND WORKS.C# = COMP.C# AND COMP.CNAME = '联华公司' AND WORKS.SALARY > 1000 AND EMP.SEX = '男';

在这里插入图片描述

5.假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和工资总数,显示(E#,NUM,SUM_SALARY)分别表示工号、公司数目和工资总数

这道题是简单的查询,涉及到了起别名和聚合函数的知识点

SELECT E#,COUNT(C#),SUM(SALARY) AS SUM.SALARY FROM WORKERS GROUP BY E#;

在这里插入图片描述

6.工号为0002的职工在多个公司工作,检索至少在0002职工兼职的所有公司工作的职工工号

  • 这也是一道嵌套查询的题目
  • 子查询为:找出0002职工所在公司编号
  • 再检索该公司中所有员工工号并去重
SELECT DISTINCT WORKS.E# FROM WORKS WHERE C# IN (SELECT DISTINCT WORKS WHERE E# = '0002')

在这里插入图片描述

7.检索联华公司中低于本公司平均工资的职工工号和姓名

  • 这道题比较复杂,要联合三个表进行查询
  • 联合条件:EMP.E# = WORKS.E# AND WORKS.C# = COMP.C#
  • 低于本公司平均工资:首先要找出本公司的编号,再根据编号查询AVG(SALARY)
  • SELECT AVG(SALARY) FROM WORKS WHERE C# IN (SELECT C# FROM COMP WHERE CNAME = '联华公司')
SELECT EMP.E#,ENAME FROM EMP,COMP,WORKS 
WHERE EMP.E# = WORKS.E# AND WORKS.C# = COMP.C#
AND CNAME = '联华公司'
AND SALARY < (SELECT AVG(SALARY) FROM WORKS WHERE C# IN (SELECT C# FROM COMP WHERE CNAME = '联华公司'));

在这里插入图片描述

8.在每个公司中为50岁以上职工加薪100元

  • 数据更新操作及嵌套查询
  • 子查询内容为年龄大于50的员工的编号
UPDATE WORKS SET SALARY = SALARY + 100 WHERE E# IN (SELECT E# FROM EMP WHERE EMP.AGE > 50)

在这里插入图片描述
在这里插入图片描述

9.在EMP表和WOEKS表中删除年龄大于50岁的职工有关元组

  • 数据更新操作:删除
  • 子查询内容:年龄大于60的员工编号

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、结语

如果有任何问题欢迎在评论区留言评论

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alita11101_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值