一、概述
本文包含九道多表查询相关练习题,有一些难度较大,建议读者在复习完前面数据库的内容后再来阅读本文
二、题目所用表
EMP
E# | ENAME | AGE | SEX | ECITY |
0001 | 李华 | 58 | 男 | 南京 |
0002 | 李丽 | 23 | 女 | 上海 |
0003 | 王建国 | 52 | 男 | 温州 |
0004 | 陈颖 | 32 | 女 | 北京 |
0005 | 刘晓华 | 29 | 男 | 上海 |
0006 | 韩梅梅 | 42 | 女 | 安徽 |
WORKS
E# | C# | SALARY |
0001 | C001 | 2500 |
0002 | C001 | 3500 |
0003 | C002 | 2500 |
0004 | C002 | 7500 |
0006 | C002 | 1300 |
0003 | C003 | 1100 |
0005 | C003 | 6200 |
0006 | C001 | 1200 |
COMP
C# | CNAME | CITY |
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 > 1000、EMP.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 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的员工编号
四、结语
如果有任何问题欢迎在评论区留言评论