博客
关于我
数据库实验—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);

解释

  • x是SC表的别名,表示一个元组变量。
  • 内层查询计算学生所有选修课程的平均成绩。
  • 这类查询为相关子查询,因为子查询的结果依赖于父查询中的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谓词的特点

  • 带有EXISTS或NOT 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利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
    查看>>
    python利用excel分析过杀漏失
    查看>>
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校危化品管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校校园线上跳蚤市场的系统设计(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校疫情防控管理平台(程序+开题+论文)
    查看>>
    Python+Jenkins+Allure Report接口自动化测试持续集成
    查看>>
    python+locust电商全流程性能测试
    查看>>
    Python函数运行的可执行文件的终端输出如何以一般方式静音?
    查看>>