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

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

数据库实验-7

嵌套查询

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

示例

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

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

嵌套查询的注意事项

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

带有IN词的子查询

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

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

解释

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

子查询的相关性

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

带有比较运算的子查询

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

select Sno, Cno from SC
where 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 Student
where Sage < any(
select sage from Student
where Sdept = 'CS'
) and Sdept != 'CS';

解释

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

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

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

解释

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

带有EXISTS谓词的子查询

EXITS谓词的特点

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

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

    解释

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

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

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

    解释

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

    量词的实现

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

    select Sname from Student
    where 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 SC
    where 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中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>
    MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
    查看>>
    MySQL中的GROUP_CONCAT()函数详解与实战应用
    查看>>
    MySQL中的IO问题分析与优化
    查看>>