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

    你可能感兴趣的文章
    MySQL最大建议行数 2000w,靠谱吗?
    查看>>
    MySQL有哪些锁
    查看>>
    MySQL服务器安装(Linux)
    查看>>
    mysql服务器查询慢原因分析方法
    查看>>
    mysql服务无法启动的问题
    查看>>
    MySQL杂谈
    查看>>
    mysql权限
    查看>>
    mysql条件查询
    查看>>
    MySQL条件查询
    查看>>
    MySQL架构与SQL的执行流程_1
    查看>>
    MySQL架构与SQL的执行流程_2
    查看>>
    MySQL架构介绍
    查看>>
    MySQL架构优化
    查看>>
    mysql架构简介、及linux版的安装
    查看>>
    MySQL查看数据库相关信息
    查看>>
    MySQL查看表结构和表中数据
    查看>>
    MySQL查询优化:LIMIT 1避免全表扫描
    查看>>
    MySQL查询优化之索引
    查看>>
    mysql查询储存过程,函数,触发过程
    查看>>
    mysql查询总成绩的前3名学生信息
    查看>>