16.嵌套查询

带谓词in的嵌套查询

select Sname,Dno
from Students
where Sno in
(select Sno
from Reports
where Cno = 'C02')

可接受多层嵌套。
这里查询的结果是Cno为’C02’的Sno的Sname和Dno。
其中,( )括号中的代码称为子查询。括号外的称为父查询或外层查询。
注意:子查询的select语句不可以使用order by子句。

带有比较运算符的嵌套查询

select Sno,Sname,Dno
from Students
where Dno = 
(select Dno
from Students
where Sname = '小明')

这里子查询返回的是单个值。
因为这个比较简单,就不多做解释啦。

带谓词any或all的嵌套查询

使用谓词any或all时,必须同时使用比较运算符。
any或all与比较运算符联合使用的含义如下表:

谓词注释
> any大于子查询结果任何一个值
> all大于子查询结果最大值
< any小于子查询结果任何一个值
< all小于子查询结果最小值
<> any不等于子查询结果某个值
<> all不等于子查询结果任何一个值

还有其他的,>=,<=,=由于比较简单,这里不多做说明。
这里给出使用的例子:

 select Sno,Sname,Ssex,Birthday,Dno
 from Students
 where Dno <> 'D01'
 and year(Birthday) <= all
 (select year(Birthday)
 from Students
 where Dno = 'D01')

查询结果为:Dno不等于’D01’的学生比Dno为’D01’的所有学生生日的年份小或者与Dno为‘D01’的学生生日年份最小的学生相等的学生的Sno,Sname,Ssex,Birthday和Dno。

本查询也可以用集函数来实现:

select Sno,Sname,Ssex,Birthday,Dno
from Students
where Dno <> 'D01'
and year(Birthday) <= 
(select min(year(Birthday))
from Students
where Dno = 'D01')

一般来说,使用集函数实现子查询比直接用any或all查询效率要高。
下面给出谓词any、all与集函数、谓词in的等价对应关系

谓词any或all集函数或谓词in
> any> min
> all> max
< any< max
< all< min
>= any>= min
>= all>= max
<= any<= max
<= all<= min
= anyin
=all没有
<> any没有
<> allnot in

带谓词exists的嵌套查询(存在)

带谓词exists的子查询不返回任何数据,只产生逻辑值真(true)或假(false)

select Sname,Dno
from Students
where exists
(select *
from Reports
where Sno = Students.Sno and Cno = 'C01')

由exists引出的子查询,目标属性列表一般用“*”,因为带exists的子查询只返回逻辑值真假,不需要给出具体的列名。(exists一般用于存在,如果是任一的话,则使用两个not exists构成双重否定来实现。)
只要子查询结果非空,exists返回的就是true,否则为false。

(难点)not exists

比如现在要查询一个Sno(学生学号),他选修了所有的Cno(选修的课程号)

select Sname,Dno
from Students
where not exists
(select * 
from Courses
where not exists
(select *
from Reports
where Sno = Students.Sno
and Cno = Courses.Cno))

该例子也可以改写为:

select Sname,Dno
from Students
where Sno in
(select Sno
from Reports
group by Sno
having count(*) = 
(select count(*)
from Courses))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值