博客
关于我
数据库实验—7
阅读量:101 次
发布时间:2019-02-26

本文共 2293 字,大约阅读时间需要 7 分钟。

数据库实验-7

嵌套查询

在SQL中,一个select from where语句作为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having子句中成为嵌套查询。

示例

以下代码示例展示了嵌套查询的概念:

select Sname from Studentwhere Sno in (    select Sno from SC    where Cno = '2');
  • 上层语句为外查询。
  • 下层查询为内层查询。

嵌套查询的注意事项

  • SQL语句允许多层嵌套查询。
  • 子查询的select语句不能使用order by子句。
  • order by子句只能对最终查询结果进行排序。

带有IN词的子查询

示例3.55:查询与“刘晨”在同一个系学习的学生

-- 解法一select Sno, Sname, Sdept from Studentwhere Sdept = 'CS';-- 解法二(自身链接)select S1.Sno, S1.Sname, S1.Sdept from Student S1, Student S2where S1.Sdept = S2.Sdept and S2.Sname = '刘晨';

解释

  • 本题中可以使用两种方法实现。
  • 第二种方法通过自身链接实现,通过连接两个Student表来筛选条件。

子查询的相关性

  • 如果子查询的查询条件依赖于父查询,则称为相关子查询。
  • 例如,子查询的where条件依赖于父查询中的某个字段。

带有比较运算的子查询

示例3.57:找出每个学生超过他自己选修课程平均成绩的课程号

select Sno, Cno from SCwhere Grade > (    select avg(Grade) from SC    where Sno = x.Sno);

解释

  • xSC表的别名,表示一个元组变量。
  • 内层查询计算学生所有选修课程的平均成绩。
  • 这类查询为相关子查询,因为子查询的结果依赖于父查询中的Sno

带有any(some)或all谓词的子查询

any与all的含义

  • any:子查询结果中的某个值满足条件。
  • all:子查询结果中的所有值满足条件。

示例3.58:查询非计算机科学中比计算机科学系任意一个学生年龄小的学生姓名和年龄

select Sname, Sage from Studentwhere Sage < any(    select sage from Student    where Sdept = 'CS') and Sdept != 'CS';

解释

  • any表示子查询结果中的某个值满足条件。
  • 用于筛选非计算机科学系且年龄小于某一值的学生。

示例3.59:查询非计算机科学系中比计算机科学所有学生年龄都小的学生姓名及其年龄

select Sname, Sage from Studentwhere Sage < all(    select sage from Student    where Sdept = 'CS') and Sdept != 'CS';

解释

  • all表示子查询结果中的所有值都满足条件。
  • 用于筛选非计算机科学系且年龄小于所有计算机科学系学生年龄的学生。

带有EXISTS谓词的子查询

EXITS谓词的特点

  • 带有EXISTSNOT EXISTS谓词的子查询不会返回任何数据。
  • 只产生逻辑真值“true”或“false”。
  • 示例3.60:查询所有选修了一号课程的学生姓名

    select Sname from Studentwhere exists(    select * from SC    where Sno = Student.Sno and Cno = '2');

    解释

    • exists子查询用于判断是否存在满足条件的记录。
    • 返回满足条件的学生姓名。

    示例3.61:查询没有选修1号课程的学生姓名

    select Sname from Studentwhere not exists(    select * from SC    where Sno = Student.Sno and Cno = '1');

    解释

    • not exists用于判断是否存在满足条件的记录。
    • 返回没有选修1号课程的学生姓名。

    量词的实现

    示例3.62:查询选修了全部课程的学生姓名

    select Sname from Studentwhere not exists(    select * from Course    where not exists(        select * from SC        where Sno = Student.Sno and Cno = Course.Cno    ));

    解释

    • not exists用于判断是否存在满足条件的记录。
    • 用于筛选选修了全部课程的学生。

    示例3.63:查询至少选修了学生201215122选修的全部课程的学生号码

    select distinct Sno from SCwhere not exists(    select * from SC    where Sno = '201215122' and    not exists(        select * from SC        where Sno = SCX.Sno and        SC.Cno = SCY.Cno    ));

    解释

    • not exists用于判断是否存在满足条件的记录。
    • 用于筛选至少选修了指定学生全部课程的学生号码。

    转载地址:http://irck.baihongyu.com/

    你可能感兴趣的文章
    python谷歌翻译,2021年9月10日亲测可用,一次可以翻译十万,强烈star
    查看>>
    Python UI自动化测试数据驱动实战
    查看>>
    Python UI自动化测试集成UnitTest
    查看>>
    Python UI自动化测试集成UnitTest
    查看>>
    python unicode-escape
    查看>>
    Python unittest mock:是否可以在测试时模拟方法默认参数的值?
    查看>>
    Python unittest单元测试框架 TestSuite测试套件
    查看>>
    PYTHON调离线语音合成并实时播放
    查看>>
    python unittest高级特性!
    查看>>
    Python unittest:如何将标准输出消息临时重定向到缓冲区并测试其内容?
    查看>>
    Python urllib/Requests下载文件失败,但浏览器下载失败
    查看>>
    Python urllib2 文件上传问题
    查看>>
    Python urllib2.open 连接由对等错误重置
    查看>>
    python urllib2详解及实例
    查看>>
    Python url请求提示certificate verify failed unable to get local issuer certificate
    查看>>
    Python UTC 日期时间对象的 ISO 格式不包括 Z(祖鲁语或零偏移)
    查看>>
    python valueerror object2_python遇到错误记录
    查看>>
    python vars的作用
    查看>>
    Python vcrpy库:HTTP请求记录和重放
    查看>>
    Python virtualenv
    查看>>