--在SQL语句中,一个select-from-where语句称为一个查询块.--将一个查询块嵌入在另一个查询块的where子句或者Having短语或者from子句的条件中的查询为嵌套查询;--选修1号课程的学生姓名以及学号--方式一:使用嵌套查询--1>首先,可以在选修表中查询出选修了1号课程的 学生学号select Sno
from SC
where Cno='1';--2>然后,可以在学生表中查询出该学号的对应的 学生学号以及学生姓名select Student.Sno,Sname
from Student
where Sno in('201215121','201215122');--将上面的两条查询语句合并成一个嵌套查询select Student.Sno,Sname --->外层查询或者父查询
from Student
where Sno in
(select Sno --->内层查询或者子查询
from SC
where Cno='1'
);--方式二:使用连接查询--选修1号课程的学生姓名以及学号select Student.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno and Cno='1';--方式三:使用内连接查询select Student.Sno,Sname
from Student innerjoin SC
on Student.Sno=SC.Sno
where Cno='1';--SQL语言支持多层嵌套查询,即一个子查询中还可以嵌套其他的子查询--需要特别指出的是:子查询的select语句不能够使用order by子句,--order by子句只能对最后的查询结果排序,嵌套查询可以使多个简单查询构成复杂的查询--带有In谓词的子查询:在嵌套查询中,子查询的结果往往是一个单值或者是单值的集合,--所以In谓词是嵌套查询中最经常使用的查询谓词--查询与"刘晨"在同一个系学习的学生学号以及姓名--1>确定"刘晨"所在的系别.select Sdept
from Student
where Sname='刘晨';--2>确定该系别的学生姓名和学生学号,学生系别select Sname,Sno,Sdept
from Student
where Sdept='CS';--将上面分步进行的SQL语句合并成嵌套查询select Sno,Sname,Sdept
from Student
where Sdept in
(select Sdept
from Student
where Sname='刘晨'
);--子查询的查询条件不依赖于父查询,成为不相干子查询,一种求解方法就是由里及外处理--先执行子查询,子查询的结果用于建立其父查询的查找条件.得到如下的查询select Sno,Sname,Sdept
from Student
where Sdept in('CS');--方式二:使用自身连接查询--自身连接使用场景:(1)所有需要查询的数据都在一个表中(2)但是一次简单查询无法得出结果--查询与"刘晨"在同一个系学习的学生学号以及姓名,所在系别selectSecond.Sno,Second.Sname,Second.Sdept
from Student First,Student SecondwhereFirst.Sname='刘晨'andFirst.Sdept=Second.Sdept;--方式三:使用内连接查询selectSecond.Sno,Second.Sname,Second.Sdept
from Student Firstinnerjoin Student SecondonFirst.Sdept=Second.Sdept andFirst.Sname='刘晨';--由此可见实现同一个查询请求可以有多种实现方式,不同的实现方式的效率是不同的,甚至差别可能会--很大,这就需要数据库编程人员应该掌握的数据库性能调优技术.--查询选修了课程名为"信息系统"的学生学号和学生姓名--本查询涉及到三个表的属性,首先,我们可以在课程表中查询课程名为"信息系统"这门课程的课程号select Cno
from Course
where Cname='信息系统';--->Cno=3--然后,可以根据查询到的课程号在SC表中找到选修了这个课程号的学生的学号select Sno
from SC
where Cno='3';--->Sno='201215121'或者Sno='201215122'--最后,根据这个学号在Student表中找到我们需要的学生姓名和学生学号select Sno,Sname
from Student
where Sno in('201215121','201215122');--将上面的三条SQL语句合并成一条嵌套的查询语句--方式一:使用嵌套查询SQLselect Student.Sno,Student.Sname
from Student
where Sno in
(select Sno
from SC
where Cno in
(select Cno
from Course
where Cname='信息系统'
)
);--方式二:使用内连接查询SQLselect Student.Sno,Student.Sname
from Student innerjoin SC
on Student.Sno=SC.Sno,Course innerjoin SC
on Course.Cno=SC.Cno
where Course.Cname='信息系统';--去掉重复的行selectdistinct Student.Sno,Student.Sname
from Student innerjoin SC
on Student.Sno=SC.Sno,Course innerjoin SC
on Course.Cno=SC.Cno
where Course.Cname='信息系统';--方式三:使用内连接查询SQLselect Student.Sno,Student.Sname
from Student,Course,SC
where Student.Sno=SC.Sno and Course.Cno=SC.Cno and Cname='信息系统';--有些嵌套查询可以使用连接运算替代,有些不能够替代的,查询涉及到多个关系时,用嵌套查询求解层次--清楚,易于构造,具有结构化程序设计的优点.但是相比于连接运算,目前商用的关系数据库管理系统对--嵌套查询的优化做得还不够完善,所以在实际应用中,能够使用连接运算表达的查询尽量用连接运算