嵌套查询

  • 语法格式
  • 带有IN谓词的子查询
    • IN谓词实现交运算
    • IN谓词实现差运算
  • 带有比较运算符的子查询
    • 带有ANY谓词的子查询
    • 带有ALL谓词的子查询
  • 相关子查询
    • 引用子查询的值
    • 不引用子查询的值(EXISTS)
  • 基于派生表的查询

语法格式

SELECT 列名表达式
FROM 表名
WHERE 表达式 运算符 (SELECT 子查询)

其中运算符包含IN、关系运算符、ANY、ALL、EXISTS五类
【注意】
1.SQL允许多层嵌套查询
2.子查询中不能使用ORDER BY子句(但可以使用GROUP BY等分组查询)

带有IN谓词的子查询

带有IN谓词的子查询指父查询与子查询之间用IN进行连接,判断某个属性列值是否在子查询的结果中

例:查询与“刘晨”在同一个系学习的学生
#step 1:确定“刘晨”所在系名
SELECT Sdept
FROM Student
WHERE Sname = '刘晨'
#step 2:查找所有在IS系学习的学生
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept = 'IS'
#step 3:用子查询来实现将第一步查询嵌入到第二步查询中用以构造第二步查询的条件
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN(SELECT SdeptFROM StudentWHERE Sname = '刘晨')#同时我们这道题也可以用自连接查询完成
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sno = S2.Sno AND S2.Sname = '刘晨'#同时也可以像自身连接那样用别名将父查询和子查询的Student表区分开
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE S1.Sdept IN(SELECT SdeptFROM Student S2WHERE S2.Sname = '刘晨')

IN谓词实现交运算

例:查询选修课程1的学生集合与选修课程2的学生集合的交集
SELECT Sno
FROM SC
WHERE Cno = '1' AND Sno IN(SELECT SnoFROM SCWHERE Cno = '2')

IN谓词实现差运算

例:查询选修课程1的学生集合与选修课程2的学生集合的差集
SELECT Sno
FROM SC
WHERE Cno = '1' AND Sno NOT IN(SELECT SnoFROM SCWHERE Cno = '2')

带有比较运算符的子查询

带有比较运算符的子查询指父查询与子查询之间用比较运算符进行连接,当用户能确切知道内层查询返回的是单值时可以用>、<、=、>=、<=、!=、<>等比较运算符
【注意】
子查询一定要跟在比较符之后

例:查询选修课程为“信息系统”的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN  --选修该课程的学生并非只有一个,所以要用IN谓词(SELECT SnoFROM SCWHERE Cno = --信息系统课程号唯一因此可以用=完成(SELECT CnoFROM CourseWHERE Cname = '信息系统'))#以下是错误写法:
SELECT Sno,Sname
FROM Student
WHERE Sno IN  --选修该课程的学生并非只有一个,所以要用IN谓词(SELECT SnoFROM SCWHERE --子查询一定要跟在比较符之后(SELECT CnoFROM CourseWHERE Cname = '信息系统' = Cno)

带有ANY谓词的子查询

子查询返回多值时可以使用关系运算符与ANY或ALL谓词的各种组合方式

例:查询其他系中比IS系某一学生年龄小的学生姓名
#方法1
SELECT Sname
FROM Student
WHERE Sage < ANY --年龄比IS系某位同学小(SELECT SageFROM StudentWHERE Sdept = 'IS') AND Sdept <> 'IS' --所在系不是IS#方法2
SELECT Sname
FROM Student
WHERE Sage < (SELECT MAX(Sage) --通过集函数实现FROM StudentWHERE Sdept = 'IS') AND Sdept <> 'IS'

带有ALL谓词的子查询

例:查询其他系中比IS系所有学生年龄小的学生姓名
#方法1
SELECT Sname
FROM Student
WHERE Sage < ALL  --年龄小于所有IS系学生年龄(SELECT SageFROM StudentWHERE Sdept = 'IS') AND Sdept <> 'IS'#方法2
SELECT Sname
FROM Student
WHERE Sage <(SELECT MIN(Sage) --集函数实现,找出IS系最小年龄FROM StudentWHERE Sdept = 'IS') AND Sdept <> 'IS'

相关子查询

  • 不相关子查询:子查询独立执行,且只执行一次
  • 相关子查询:子查询的条件依赖于外部父查询中的某狗字段值,其不可单独执行,且要执行多次
    执行过程:
    (1)父查询每执行一次子查询都会被执行一次,并且每次父查询都将查询引用字段值传给子查询
    (2)如果子查询中任何元组与其匹配,父查询就返回元组
    (3)循环(1)(2)直至处理完父查询的每一个元组

引用子查询的值

将父查询中的列的值使用关系运算符与子查询中的值进行比较

例:查询成绩高于本人平均成绩的学号、课程号和成绩
SELECT Sno,Cno,Score
FROM SC X
WHERE Score > (SELECT AVG(Score)FROM SC YWHERE Y.Sno = X.Sno)

不引用子查询的值(EXISTS)

不引用子查询值的这类查询只是检查子查询是否返回了记录,需要使用EXISTS关键字,它只产生逻辑真值(TRUE)或逻辑假值(FALSE),即子查询的结果中至少包含一个元组则EXISTS子查询返回TRUE;子查询结果集合为空则EXISTS子查询返回FALSE

例:查询选修了全部课程的学生姓名
#SQL语言没有全称量词,因此必须利用谓词演算将带有全称量词的谓词转换为等价带有存在量词的谓词
针对这道题,我们应该查询这样的学生,不存在有一门课程是其不选修的
SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *  --由于返回的值是逻辑真值或逻辑假值而并非元组中某一列的值,因此直接写SELECT *即可FROM SCWHERE NOT EXISTS(SELECT *FROM CourseWHERE Cno = SC.Cno AND Student.Sno = SC.Sno))
例:查询至少选修了学生95002选修的全部课程的学号
#SQL语言也没有蕴含逻辑运算因此也需要利用谓词演算将一个逻辑蕴涵的谓词转换为带有存在量词的谓词
这道题语义为:不存在有这样一门课程y,学生95002选修了y但是学生x没有选修y
SELECT Sno
FROM Student
WHERE NOT EXISTS(SELECT *FROM SC SCYWHERE SCY = '95002' AND NOT EXISTS(SELECT *FROM SC SCXWHERE Student.Sno = SCX.Sno AND SCX.Cno = SCY.Cno))

基于派生表的查询

子查询也可以出现在FROM子句中即基于子查询生成的临时派生表进行查询

例:查询选课门数唯一的学生学号(若只有S1学号的学生选了2门课则S1应为结果之一)
#step 1 查询学生学号及其修读的课程门数
SELECT Sno,COUNT(Cno)
FROM SC
GROUP BY Sno
#step 2 查询门数唯一的课程号
SELECT CT
FROM(SELECT Sno,COUNT(Cno) AS CTFROM SCGROUP BY Sno) AS T1(Sno,CT)
GROUP BY CT
HAVING COUNT(*) = 1
#step 3 输出学生学号
SELECT T3.Sno
FROM(SELECT CTFROM(SELECT Sno,COUNT(Cno) AS CTFROM SCGROUP BY Sno) AS T1(Sno,CT)GROUP BY Sno) AS T2(CT), --门数唯一的课程号表T2(CT)(SELECT Sno,COUNT(Cno) AS CT FROM SC GROUP BY Sno) AS T3(Sno,CT) --学生及其选修课程门数表T3(Sno,CT)
WHERE T2.CT = T3.CT --将T2和T3做等值连接

本文到此就结束了,如有错误欢迎指出!

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

  1. SQL数据定义、查询、更新+空值的处理 实践学习报告

    本篇博客分享的是博主的各种数据操作-实践详细过程(以截图方式展示) 软件:Oracle  SQL  developer,希望对大家有所帮助咯! 目录 1.学生-课程数据库 2.1.数据定义理论 2.2 ...

  2. sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询

    sql 子查询 嵌套查询 In the real world, there are times when we need a particular set of data but we don't h ...

  3. 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询

    目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...

  4. 数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中)

    数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中) 上机练习2 1.              启动SQL Server 2008中的 SQL Server Management ...

  5. sql镶嵌查询_超实用的SQL语句之嵌套查询

    嵌套查询 什么是嵌套查询. 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内 ...

  6. mysql表子查询(嵌套查询)

    mysql表子查询(嵌套查询): 1.什么是子查询: 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询 -- 如何显示与 SMITH 同一部门的所有员工? -- 1.先查出sm ...

  7. MySQL 子查询 嵌套查询

    MySQL 子查询 嵌套查询 一.带IN关键字的子查询 二.带EXISTS关键字的查询 三.带ANY.SOME 关键字的子查询 四.带ALL 关键字的查询 自言自语 一.带IN关键字的子查询 使用IN ...

  8. 连接查询--嵌套查询

    连接查询–嵌套查询 一.单层嵌套查询 嵌套查询分为相关嵌套查询.不相关嵌套查询.区分条件是分离之后是否可以单独查询. 不相关嵌套查询:由里向外查询,先执行子查询,得到的结果用来构造外部查询的条件.子查 ...

  9. mysql 嵌套查询性能_mysql SQL优化之嵌套查询-遁地龙卷风

    (-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select ...

最新文章

  1. php根据时间搜索,yii2实现根据时间搜索的方法
  2. 好文|奔向宇宙,揭开太空机器人的神秘面纱
  3. RLC协议简单理解2-RLC窗口的维护
  4. (2)JavaScript数据类型
  5. CMake编译Widget UI Qt程序
  6. 为什么要强制弃坑Fastjson而主推Jackson?
  7. pythonweb开发-手把手教你写网站:Python WEB开发技术实战
  8. ajaxfileupload带多个参数上传方法
  9. Java Byte取值范围
  10. win10修改时间同步服务器,解决win10时间服务器同步问题|重置win10时间服务配置...
  11. 分布式通信协议RPC协议简介
  12. java输出string变量名_java – 从String获取名称变量
  13. python3 自定义排序_Python3中的自定义排序
  14. 30 万奖金等你来!第三届 Apache Flink 极客挑战赛暨 AAIG CUP 报名开始
  15. 上周热点回顾(10.15-10.21)
  16. julia: ubuntu下安装
  17. SSRF 服务器端请求伪造
  18. 【蓝牙学习笔记】Arduino设置蓝牙模块HC-06 CC2540 CC2541自动初始化
  19. 四川阆中2021中学高考成绩查询入口,2021年四川高考体检报告结果查询时间及查询网址入口...
  20. python涨跌柱表行业市盈率

热门文章

  1. SUN/FUJITSU 小型机 镜像硬盘更换方案
  2. mud使用mysql_MUD
  3. 数据万象内容审核 — 共建安全互联网,专项开展“清朗”直播整治行动
  4. 972真题 | 基于ChatGpt提供2021-2023年部分927真题分析题思路
  5. jfinal连接oracle_连接jfinal
  6. 您的代码听起来如何?根据您的代码生成音乐
  7. java zip解压
  8. SecureCRT和WinSCP的使用
  9. MT WOFF FONT解密
  10. 谈谈Java中的反射机制