一、概念描述

在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询。例如:

SELECT Sname  /*外层查询或父查询*/
FROM Student
WHERE Sno IN(SELECT Sno  /*内层查询或子查询*/FROM SCWHERE Cno='2');

SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。

注意:子查询的SELECT语句中不能使用 ORDER BY 子句,因为 ORDER BY 子句只能对最终查询结果排序。

二、带有IN谓词的子查询

在嵌套查询中,子查询的结果往往是一个集合,所以谓词 IN 是嵌套查询中最经常使用的谓词。

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

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN(SELECT SdeptFROM StudentWHERE Sname='刘晨');

查询选修了课程名为“信息系统”的学生学号和姓名

SELECT Sno,Sname /*最后在Student关系中取出Sno和Sname*/
FROM Student
WHERE Sno IN(SELECT Sno  /*然后在SC关系中找出选修了3号课程的学生学号*/FROM SCWHERE Cno IN(SELECT Cno  /*首先在Course关系中找出“信息系统”的课程号,结果为3号*/FROM CourseWHERE Cname='信息系统'));

本查询同样可以用连接查询实现:

SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno ANDSC.Cno=Course.Cno ANDCourse.Cname='信息系统';

三、带有比较运算符的子查询

带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单个值时,可以用 >、<、=、>=、<=、!=、或<>等比较运算符。

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

SELECT Sno,Cno
FROM SC X
WHERE Grade >=(SELECT AVG(Grade)FROM SC yWHERE y.Sno=x.Sno);

四、带有ANY(SOME)或ALL谓词的子查询

子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。而使用ANY或ALL谓词时则必须同时使用比较运算符。其语义如下:

>ANY

大于子查询结果中的某个值

>ALL

大于子查询结果中的所有值

<ANY

小于子查询结果中的某个值

<ALL

小于子查询结果中的所有值

>=ANY

大于等于子查询结果中的某个值

>=ALL

大于等于子查询结果中的所有值

<=ALL

小于等于子查询结果中的所有值

<=ANY

大于等于子查询结果中的某个值

=ANY

等于子查询结果中的某个值

=ALL

等于子查询结果中的所有值(通常没有实际意义)

!=(或<>)ANY

不等于子查询结果中的某个值

!=(或<>)ALL

不等于子查询结果中的任何一个值

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

SELECT Sname,Sage
FROM Student
WHERE Sage<ANY (SELECT SageFROM StudentWHERE Sdept='CS')
AND Sdept <> 'CS';

查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<ALL(SELECT SageFROM StudentWHERE Sdept='CS')
AND Sdept <> 'CS';

提示:本查询同样可以用聚集函数实现

SELECT Sname,Sage
FROM Student
WHERE Sage <(SELECT MIN(Sage)FROM StudentWHERE Sdept='CS')
AND Sdept <>'CS';

在此把ANY、ALL与聚集函数的对应关系表示如下

五、带有 EXISTS 谓词的子查询

带有EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

查询所有选修了1号课程的学生姓名

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *FROM SCWHERE Sno=Student.Sno AND Cno='1');

使用存在量词EXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值。

查询没有选修1号课程的学生姓名

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *FROM SCWHERE Sno=Student.Sno AND Cno='1');

查询选修了全部课程的学生姓名

由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *FROM CourseWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno=Student.SnoAND Cno=Course.Cno));

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

SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS(SELECT *FROM SC SCYWHERE SCY.Sno='201215122' ANDNOT EXISTS(SELECT *FROM SC SCZWHERE SCZ.Sno=SCX.Sno ANDSCZ.Cno=SCY.Cno));

六、总结

此次学习和整理了有关SQL与嵌套查询相关的程序

  • 带有IN谓词
  • 带有比较运算符
  • 带有ANY或ALL
  • 带有EXISTS谓词

尤其应格外重视 ANY、ALL与聚集函数的对应关系,还有带EXISTS时逻辑上的判断。

SQL数据查询之——嵌套查询相关推荐

  1. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  2. SQL语言的数据查询之嵌套查询

    3. 嵌套查询 在SQL语言中,一个SELECT-FROM-WHERE语句被称为一个查询块.将一个查询块嵌套在另外一个查询块的WHERE子句或者HAVING短语的条件中的查询被称为嵌套查询.上层的查询 ...

  3. sql镶嵌查询_SQL数据查询之——嵌套查询

    一.概念描述 在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块.将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询.例如: ...

  4. SQL Server 数据库之嵌套查询

    嵌套查询 1. 概述 2. 普通子查询 2.1. 子查询执行后返回一个值时,可在子查询与父查询之间用比较运算符连接 2.2. 子查询执行后返回一组值时,不能直接用比较运算符连接子查询,可在比较运算符与 ...

  5. 3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    文章目录 0.前言 1.思维导图 2.Student/SC/Course表数据及结构 3.SELECT语句的一般格式 4.单表查询 (1)选择表中的若干列 ① 查询指定列 ② 查询全部列 ③ 查询经过 ...

  6. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

  7. SQL知识点小结(嵌套查询)

    嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询 SELECT Sname //外层查询/ ...

  8. mysql练习-数据查询之嵌套查询

    将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询. 涉及到多个表的查询,除了可以使用多表连接查询以外,还可以利用嵌套子查询来完成. 由于连接查询比较耗时,当表 ...

  9. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

    学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...

最新文章

  1. Qt中文手册 之 QTableWidgetItem
  2. 2019年集五福本周五上线!四种玩法你都会了吗?
  3. 强悍的远程桌面管理器
  4. python之路---09 初始函数 参数
  5. python判断字符大小写转换_Python 字符串大小写转换的简单实例
  6. js 序列化内置对象_内置序列化技术
  7. python字符串是什么_python字符串表示什么
  8. 访谈编码怎么做_怎么才能让口才得到提升
  9. Qt ToolBar工具栏里同时显示图标和文字
  10. css之max-width属性
  11. android a20 i2c 通信,Android程序运行分析——中等复杂程度的NTAG I2C Demo为例(二)...
  12. osgEarth gpx文件 16.feature_gpx.earth
  13. widevine level1测试视频的生成方法
  14. 多个485串联_让RS-485接口远离EMI风险!这有三个实用方案
  15. bat学习(二)快速批量建立指定三级文件夹
  16. 计算机键盘没有fn,键盘Fn键失灵怎么解决?键盘Fn键失灵的修复方法
  17. matlab工具箱计算最小生成树_数学建模【图与网络模型(图的基本概念与数据结构、最短路-最小生成树-网络最大流问题、Matlab图论工具箱、渡河问题、钢管的订购与运输)】...
  18. Docker Desktop 错误:必须在BIOS中启用 硬件辅助虚拟化和数据执行保护
  19. 小程序游戏开发三个引擎用哪个好呢 Cocos,Egret,Laya?
  20. APS高级排程在钣金冲压行业的应用

热门文章

  1. LINUX与UNIX SHELL编程指南 学习笔记
  2. java批处理_Java内存模型你应该知道
  3. 计算机的社会应用PPT,《电子计算机的发展与应用》ppt说课稿信息技术七上.ppt...
  4. php的数据结构_php数据结构有哪些
  5. 减速箱箱体尺寸是怎样计算的_手把手教你解剖减速机
  6. 表单的提交方式POST和GET
  7. mysql关系数据库_关系型数据库MySql简介
  8. Error running ‘Unnamed‘: Unable to open debugger port (127.0.0.1:xxxx)
  9. 微软软件推送服务器,微软将通过系统更新功能向大部分用户推送新版Microsoft Edge浏览器-...
  10. c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?