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

    你可能感兴趣的文章
    pandas 根据不是常量的第三列的值将值从一列复制到另一列
    查看>>
    pandas 根据值从多列中的一列查找
    查看>>
    Pandas 根据布尔条件选择行和列
    查看>>
    pandas 滚动窗口 - datetime64[ns] 未实现
    查看>>
    pandas 版本兼容特定的蟒蛇和NumPy配置吗?
    查看>>
    pandas 生成excel多级表头
    查看>>
    Pandas 的 DataFrame 详解-ChatGPT4o作答
    查看>>
    pandas 读取excel数据,以字典形式输出
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    pandas 重新采样到每月的特定工作日
    查看>>
    pandas :按移位分组和累加和(GroupBy Shift And Cumulative Sum)
    查看>>
    pandas :检测一个DF和另一个DF之间缺失的列
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.columns、get_dummies等用法
    查看>>
    pandas.DataFrame.copy(deep=True) 实际上并不创建深拷贝
    查看>>
    pandas.read_csv()的详解-ChatGPT4o作答
    查看>>
    PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
    查看>>
    pandas100个骚操作:再见 for 循环!速度提升315倍!
    查看>>