SQL嵌套查询
概述
一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
ORDER BY 语句不能出现在内容查询块里面!
带有IN谓词的子查询
--查询与“刘晨”在同一个系学习的学生
--可以分步来完成 先确定“刘晨”所在系
SELECT Sdept
FROM Student
WHERE Sname='刘晨'
--结果为CS
进行二次查询
SELECT *
FROM Student
WHERE Sdept='CS'
嵌套查询做法
SELECT *
FROM Student
WHERE Sdept IN(
SELECT Sdept
FROM Student
WHERE Sname='刘晨'
)
连接查询做法
SELECT S1.*
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept AND S2.Sname='刘晨'
带有比较运算符的子查询
当能准确知道内层查询返回单值时,可用比较运算符
--找出每个学生超过他自己选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC x
WHERE Grade >=(
SELECT AVG (GRADE)
FROM SC y
WHERE y.Sno=x.Sno
)
带有ANY或ALL谓词的子查询
使用any或者all谓词时必须使用比较运算,如> < =..
如>any表示大与某一个值,>all表示大于任何值
--查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(
SELECT Sage
FROM Student
WHERE Sdept='CS'
)
AND Sdept <> 'CS'
带有EXISTS谓词的子查询
不返回任何数据,只返回TURE或者FALSE,其中如何去使用EXISTS谓词实现全称量词为难点
//查询选修了全部课程的学生姓名
解析:SQL没有全称量词,可以对题目进行转换意思:查询这样的学生,没有一门课程是他不选修的
SELECT Sname
FROM Student
WHERE NOT EXISTS(
SELECT *
FROM Course
WHERE NOT EXISTS(
SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno=Course.Cno
)
)
//查询至少选择了选修了学生201215122选修的全部课程的学生号码
用p表示谓词"学生201215122选修了课程y"
用q表示谓词"学生x选修了课程y"
--不存在这样的课程y,学生20121511选修了y,而学生x没有选
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(
SELECT *
FROM SC SCY
WHERE SCY.Sno='201215122' AND
NOT EXISTS(
SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno
)
)