目录连接+嵌套查询练习S,C,SC关系表S,J,P,SPJ关系表简易S,C,SC关系表 连接+嵌套查询练习 S,C,SC关系表 设有学生-课程关系数据库,它由三个关系组成,它们的模式是: S(学号SNO,姓名SN,所在系DEPT,年龄AGE)、 C(课程号CNO,课程名CN,先修课号CPNO)、 SC(学号SNO,课程号CNO,成绩SCORE)。 请用SQL语句写出下列查询: (1)检索选修了课程号C1成绩为A的所有学生姓名。 SELECT SN FROM S WHERE SNO IN (SELECT SNO FROM SC WHERE CNO='C1' AND SCORE='A') 在SQL数据查询中,我们经常会遇到各种复杂的查询需求,这些查询通常涉及到多个表之间的关联和嵌套查询。本文将通过一系列的练习题来探讨如何利用SQL处理这些查询。 我们来看一个学生-课程关系数据库的例子,它由三个表构成:S(学生),C(课程),SC(学生选课)。在S表中,每个记录代表一个学生,包含学号(SNO)、姓名(SN)、所在系(DEPT)和年龄(AGE);在C表中,每个记录代表一个课程,包括课程号(CNO)、课程名(CN)和先修课号(CPNO);SC表作为关联表,存储学生选课信息,包括学号(SNO)、课程号(CNO)和成绩(SCORE)。 1. 查询所有选修了课程号为C1且成绩为A的学生姓名: ```sql SELECT SN FROM S WHERE SNO IN (SELECT SNO FROM SC WHERE CNO='C1' AND SCORE='A') ``` 这里使用了子查询和IN操作符,先查询SC表中C1课程且成绩为A的学生学号,然后在S表中查找这些学号对应的学生姓名。 2. 查询学号为S1的学生修读的所有课程名及先修课号: ```sql SELECT CN, CPNO FROM C WHERE CNO IN (SELECT CNO FROM SC WHERE SNO='S1') ``` 此查询通过SC表找出S1学生选修的课程号,然后在C表中查询这些课程的名称和先修课号。 3. 查询年龄为23岁的学生所修读的课程名: ```sql SELECT CN FROM C WHERE CNO IN (SELECT CNO FROM SC WHERE SNO IN (SELECT SNO FROM S WHERE AGE=23)) ``` 这个查询涉及两个子查询,首先找到所有年龄为23岁的学生学号,然后查询这些学号在SC表中的课程号,最后在C表中获取课程名称。 4. 查询至少修读了学号为S5的学生修读的一门课程的学生姓名: ```sql SELECT DISTINCT SN FROM S INNER JOIN SC ON S.SNO = SC.SNO WHERE Cno = ANY (SELECT Cno FROM SC WHERE Sno='S5') EXCEPT SELECT SN FROM S WHERE SNO='S5' ``` 使用INNER JOIN结合ANY关键字找出所有选修了S5学生课程的学生,然后用EXCEPT操作符排除S5学生本人。 接下来,我们看一个更复杂的数据库模型,涉及四个表:S(供应商),J(工程),P(零件),SPJ(供应商-零件-工程关系)。 5. 查询工程代码为J2的工程使用的所有零件名称和数量: ```sql SELECT PNAME, QTY FROM P INNER JOIN SPJ ON P.PNO = SPJ.PNO WHERE JNO = 'J2' ``` 这里通过INNER JOIN连接P和SPJ表,筛选出J2工程对应的零件及其数量。 6. 找出使用上海产零件的工程名称: ```sql SELECT JNAME FROM J WHERE JNO IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY='上海')) ``` 首先找出产地为上海的零件,然后找出使用这些零件的工程。 7. 找出没有使用天津产零件的工程号: ```sql SELECT JNO FROM J WHERE JNO NOT IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY='天津')) ``` 使用NOT IN操作符找出没有使用天津产零件的工程。 8. 求没有使用天津产红色零件的工程号: ```sql SELECT JNO FROM J WHERE JNO NOT IN (SELECT JNO FROM SPJ WHERE PNO IN (SELECT PNO FROM P WHERE CITY='天津' AND COLOR='红')) ``` 在原有基础上添加颜色条件,找出未使用天津产且颜色为红色的零件的工程。 9. 检索姓刘的学生选修的所有课程名与教师名: ```sql SELECT CN, TH FROM C, SC, S WHERE S.SNO = SC.SNO AND SC.CNO = C.CNO AND SN LIKE '刘%' ``` 直接使用三表联接,根据SN的LIKE条件筛选出姓刘的学生,并获取他们选修的课程名和教师名。 10. 检索没有选修数据库课程的学生的学号与姓名: ```sql SELECT SNO, SN FROM S WHERE SNO NOT IN (SELECT SNO FROM SC WHERE CNO IN (SELECT CNO FROM C WHERE CN LIKE '%数据库%')) ``` 首先找到所有包含“数据库”字样的课程号,然后找出未选修这些课程的学生学号和姓名。 通过这些练习,我们可以深入理解SQL中的连接查询、子查询、聚合函数、条件过滤等操作,这些技巧在实际数据库管理和数据分析工作中至关重要。
![](https://csdnimg.cn/release/download_crawler_static/13684898/bg1.jpg)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 4
- 资源: 922
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论10