sql server嵌套查询

一 带有IN谓词的子查询

1. 查询与“刘晨”在同一个系学习的学生
SELECT sno ,
sname
FROM student
WHERE sdept IN
(SELECT sdept
FROM student
WHERE sname='刘晨')

二. 带有比较运算符的子查询

1. 找出每个学生超过他自己选修课程平均成绩的课程号
SELECT sno,
cno
FROM sc x
WHERE grade >=
(SELECT avg(grade)
FROM sc y
WHERE y.sno=x.sno)

内层查询是求一个一个学生的平均成绩的,至于是哪个学生的成绩,要看参数x.sno的值

三. 带有ANY(SOME)或ALL谓词的子查询

1. 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT sname,
sage
FROM student
WHERE sage <any
(SELECT sage
FROM student
WHERE sdept='cs')
AND sdept <> 'cs'

比子查询中最大值小的

2. 查询非计算机科学系中比计算机科学系所有学生年龄小的学生姓名和年龄
SELECT sname,
sage
FROM student
WHERE sage <all
(SELECT sage
FROM student
WHERE sdept='cs')
AND sdept<>'cs'

比子查询中最大值大的

三. 带有EXISTS谓词的子查询

1. 查询所有选修了1号课程的学生的姓名
--方法一
SELECT sname
FROM student
WHERE exists
(SELECT *
FROM sc
WHERE student.sno=sc.sno
AND cno='1')

--方法二
SELECT sname
FROM student
WHERE sno in
(SELECT sno
FROM sc
WHERE cno='1')
2. 查询没有选修1号课程的学生的姓名
SELECT sname
FROM student
WHERE NOT exists
(SELECT *
FROM sc
WHERE student.sno=sc.sno
AND cno='1')