数据库作业6:SQL Server的部分操作(嵌套查询)

三.嵌套查询

不相关子查询 :子查询的查询条件不依赖于父查询。即为“由里向外”处理,先执行子查询,子查询的结果用于建立父查询的查找条件。
相关子查询 :子查询的查询条件依赖于父查询。

1.带有IN谓词的子查询

【例3.55】查询与“刘晨”在同一个系学习的学生。
①.分步查询:
首先确定刘晨所在系名

SELECT Sdept  
FROM Student                            
WHERE Sname='刘晨';

查询结果为:MA;

然后查找所在系(MA)学习的学生

SELECT Sno, Sname, Sdept     
FROM Student                 
WHERE Sdept='MA'; 

查询结果为:
在这里插入图片描述
用完整的Student表作为对照:
在这里插入图片描述

②.嵌套查询:
将分布查询第一步查询嵌入第二步的查询条件中,构造嵌套循环:

SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept  IN
	 (SELECT Sdept
 	 FROM Student
 	 WHERE Sname='刘晨');

查询结果同上。
属于 不相关子查询 ,子查询的查询条件不依赖于父查询。

③.自身连接:

SELECT S1.Sno, S1.Sname,S1.Sdept
FROM  Student S1,Student S2
WHERE S1.Sdept = S2.Sdept  AND
      S2.Sname ='刘晨';

查询结果同上。

【例3.56】查询选修了课程名为“信息系统”的学生学号和姓名。
①.嵌套查询:

SELECT Sno,Sname  --③ :最后在Student关系中取出Sno和Sname
              
FROM Student                         
WHERE Sno  IN
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是20道SQL Server嵌套查询题: 1. 查询所有成绩大于平均成绩的学生信息。 ```sql SELECT * FROM students WHERE score > (SELECT AVG(score) FROM students) ``` 2. 查询所有没有选修数据库课程的学生信息。 ```sql SELECT * FROM students WHERE id NOT IN (SELECT student_id FROM course_selection WHERE course_name = '数据库') ``` 3. 查询选修了所有课程的学生信息。 ```sql SELECT * FROM students WHERE NOT EXISTS ( SELECT * FROM courses WHERE NOT EXISTS ( SELECT * FROM course_selection WHERE course_selection.course_name = courses.course_name AND course_selection.student_id = students.id ) ) ``` 4. 查询选修了“数据库课程的学生信息。 ```sql SELECT * FROM students WHERE id IN (SELECT student_id FROM course_selection WHERE course_name = '数据库') ``` 5. 查询选修了“数据库课程且成绩大于等于80分的学生信息。 ```sql SELECT * FROM students WHERE id IN ( SELECT student_id FROM course_selection WHERE course_name = '数据库' AND score >= 80 ) ``` 6. 查询选修了“数据库课程的男生信息。 ```sql SELECT * FROM students WHERE id IN ( SELECT student_id FROM course_selection WHERE course_name = '数据库' ) AND gender = '男' ``` 7. 查询选修了“数据库课程且成绩不及格的学生信息。 ```sql SELECT * FROM students WHERE id IN ( SELECT student_id FROM course_selection WHERE course_name = '数据库' AND score < 60 ) ``` 8. 查询选修了至少一门课程的学生信息。 ```sql SELECT * FROM students WHERE id IN (SELECT DISTINCT student_id FROM course_selection) ``` 9. 查询选修了所有课程且成绩均大于等于80分的学生信息。 ```sql SELECT * FROM students WHERE NOT EXISTS ( SELECT * FROM courses WHERE NOT EXISTS ( SELECT * FROM course_selection WHERE course_selection.course_name = courses.course_name AND course_selection.student_id = students.id AND score >= 80 ) ) ``` 10. 查询选修了“数据库课程的学生数量。 ```sql SELECT COUNT(DISTINCT student_id) FROM course_selection WHERE course_name = '数据库' ``` 11. 查询成绩排名在第3到第5名的学生信息。 ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY score DESC) AS rank FROM students ) AS t WHERE rank BETWEEN 3 AND 5 ``` 12. 查询选修了“数据库课程且成绩排名在前10名的学生信息。 ```sql SELECT * FROM ( SELECT students.*, ROW_NUMBER() OVER (ORDER BY score DESC) AS rank FROM students INNER JOIN course_selection ON students.id = course_selection.student_id WHERE course_selection.course_name = '数据库' ) AS t WHERE rank <= 10 ``` 13. 查询选修了“数据库课程且成绩排名在前10%的学生信息。 ```sql SELECT * FROM ( SELECT students.*, PERCENT_RANK() OVER (ORDER BY score DESC) AS rank FROM students INNER JOIN course_selection ON students.id = course_selection.student_id WHERE course_selection.course_name = '数据库' ) AS t WHERE rank <= 0.1 ``` 14. 查询每个课程的平均成绩。 ```sql SELECT course_name, AVG(score) AS average_score FROM course_selection GROUP BY course_name ``` 15. 查询每个学生的总成绩和平均成绩。 ```sql SELECT student_id, SUM(score) AS total_score, AVG(score) AS average_score FROM course_selection GROUP BY student_id ``` 16. 查询没有选修任何课程的学生信息。 ```sql SELECT * FROM students WHERE id NOT IN (SELECT DISTINCT student_id FROM course_selection) ``` 17. 查询每个学生选修课程数量。 ```sql SELECT student_id, COUNT(*) AS course_count FROM course_selection GROUP BY student_id ``` 18. 查询每个学生选修课程数量及其平均成绩。 ```sql SELECT course_selection.student_id, COUNT(*) AS course_count, AVG(score) AS average_score FROM course_selection INNER JOIN students ON course_selection.student_id = students.id GROUP BY course_selection.student_id ``` 19. 查询选修了“数据库课程的学生数量及其平均成绩。 ```sql SELECT COUNT(DISTINCT student_id) AS student_count, AVG(score) AS average_score FROM course_selection WHERE course_name = '数据库' ``` 20. 查询每个学生选修课程中,成绩最高的课程名称和成绩。 ```sql SELECT course_selection.student_id, courses.course_name, MAX(course_selection.score) AS max_score FROM course_selection INNER JOIN courses ON course_selection.course_name = courses.course_name GROUP BY course_selection.student_id, courses.course_name ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值