前言     




       数据存储到数据库后,如果不对其进行分析和利用,数据是没有价值的。最终用户对数据库中数据进行的操作大多是查询和修改,其中修改操作包括插入、删除和更改数据。SQL提供了功能强大的数据查询和修改的功能。查询,插入和删除。这种东西还是需要多练,现在总结下来,没事儿了可以练练。分享:数据库文件 ,以下举例的语句都是根据这个数据库文件来操作,如有需要,请自行下载练习。


       嵌套子查询是在内层查询中不关联外层查询的子查询,这种子查询要么返回一个单值,外层查询利用该单值进行比较运算,要么返回一个值得列表,外层查询利用该列表进行IN运算符的比较。


使用基于集合测试的嵌套子查询


       子查询返回的是一个值列表,外层查询通过运算符IN或NOT IN,对子查询返回的结果集进行比较。

其基本形式为:select <查询列表> from .....  where <列名> [not] in(select <列名> from  ........)

       包含子查询形式的查询语句是分步骤实现的,即先执行子查询,然后在子查询的结果基础上再执行外层查询(先内后外)。子查询返回的结果是一个集合,外层查询就是在这个集合上使用in运算符进行比较。如:

查询与“刘晨”在同一个系的学生的姓名,学号,系名:

select sno,sname,dept from student where dept in(select dept from student where sname='刘晨')

       查询结果:


sql server 嵌套if sql server 嵌套查询_嵌套


       如果不希望刘晨出现在结果中,则可以这样写:

select sno,sname,dept from student where dept in(select dept from student where sname='刘晨') and sname!='刘晨'

      查询结果:


sql server 嵌套if sql server 嵌套查询_嵌套_02


练习题


        查询选修了Java课程的学生的姓名和所在系

        分析:这个查询可以用以下三个步骤实现

                  1)在Course表中,找出Java对应的课程号

                  2)根据找到的Java课程号,在SC表中找出选了该课程的学生的学号

                  3)根据得到的学号,在Student表中找出对应学生的姓名和所在系

       

select sname,dept from student where sno in (select sno from sc where cno in (select cno from course where cname=‘JAVA’))


使用比较测试的嵌套子查询


      使用嵌套子查询进行比较测试时,要求子查询只能返回单个值。外层查询一般通过比较运算符(=、<>(或!=)、<、>、<=、>=),将外层查询中某个列的值与子查询返回的值进行比较。

 一般格式为:select <查询列表> from ....... where <列名> 比较运算符 (select <列名> from ......)

查询选了“C004” 课程且成绩高于此课程的平均成绩的学生的学号和该门课程成绩

select sno,grade from sc where cno = 'C004' and grade > (select AVG(grade) from sc where cno='C004')

      查询结果:


sql server 嵌套if sql server 嵌套查询_嵌套_03


使用Some和All的嵌套子查询


一般格式为:where <列名> 比较运算符 [Some | All] (子查询)

       Some:在进行比较运算时,只要子查询中有一行能使结果为真,则结果为真。

       All:在进行比较运算时,当子查询中所有行都使结果为真,结果为真

       查询至少有一次成绩大于或等于90的学生的姓名、所选课程号和成绩

select sname,cno,grade from student s ,sc c where s.Sno=c.Sno and s.Sno=some (select sno from sc where grade >=90)

       查询结果:


sql server 嵌套if sql server 嵌套查询_比较运算符_04