数据库基础——SQL语言(下)

184 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

子查询

嵌套查询概述

  • 一个SELECT-FROM-WHERE语句称为一个查询块
  • 将一个查询块嵌套在另一个SELECT、INSERT、UPDATE、DELETE语句中的查询称为嵌套查询
  • 嵌套查询块也称为子查询或内层查询;而包含子查询的语句则称为主查询或外层查询。

image.png

带有IN谓词的子查询

  • 使用子查询进行基于集合的测试的语句的一般格式为:
  • where 表达式[NOT] IN(子查询)

该表达式的值与集合中的某个值相等,则此测试为true;如果该表达式与集合中所有的值均不相等,则返回false

  • 查询与“刘晨”在同一个系学习的学生。
  • 此查询要求可以分步来完成
    • ① 确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname= ' 刘晨 '
    • ② 查找所有在IS系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept= ' IS '
    • 将第一步查询嵌入到第二步查询的条件中
  • SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = ‘刘晨’ ) AND Sname != ‘刘晨’
  • 查询过程:先执行子查询(找到刘晨所在的系“IS”,然后在子查询的结果上查找所有在此系学习的学生。

带有比较运算符的子查询

通过比较运算符(= 、<>、<、>、<=、>=)将一个表达式的值与子查询返回的值进行比较 WHERE 表达式 比较运算符(子查询)

  • 使用子查询进行比较测试时,要求子查询语句必须是返回单值的查询语句。

假设一个学生只可能在一个系学习,并且必须属于一个系,则在下例可以用 = 代替IN : SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= ‘刘晨’);

带有ANY或ALL谓词的子查询

谓词语义

  • ANY(或SOME):某一个值
  • ALL:所有值

需要配合使用比较运算符

  • > ANY 大于子查询结果中的某个值
  • > ALL 大于子查询结果中的所有值
  • < ANY 小于子查询结果中的某个值
  • < ALL 小于子查询结果中的所有值
  • >= ANY 大于等于子查询结果中的某个值
  • >= ALL 大于等于子查询结果中的所有值
  • <= ANY 小于等于子查询结果中的某个值
  • <= ALL 小于等于子查询结果中的所有值
  • = ANY 等于子查询结果中的某个值
  • =ALL 等于子查询结果中的所有值(通常没有实际意义)
  • !=(或<>)ANY 不等于子查询结果中的某个值
  • !=(或<>)ALL 不等于子查询结果中的任何一个值

查询其他系中比信息科学系某一学生年龄小的学生姓名和年龄。 解:

SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= ' IS ') AND Sdept <> ‘IS ' ; /*父查询块中的条件 */

不相关子查询概念

用子查询进行基于集合的测试或比较测试时,是先执行子查询,然后再在子查询的结果基础之上执行外层查询。子查询只执行一次,子查询的查询条件不依赖于外层查询,将这样的子查询称为不相关子查询或嵌套子查询。

带有EXISTS谓词的子查询

  • 格式: WHERE [NOT] EXISTS (子查询)
    • 若内层查询结果非空,则外层的WHERE子句返回真值
    • 若内层查询结果为空,则外层的WHERE子句返回假值
  • 带有NOT EXISTS谓词的子查询与上相反

注意

处理过程为:先外后内;由外层的值决定内层的结果;内层执行次数由外层结果数决定。

相关子查询的概念

带EXISTS的子查询由于在子查询中要涉及与 外层表数据的关联,因此经常将这种形式的子查 询称为相关子查询。

相关子查询:子查询的查询条件依赖于父查询

首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE 子句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组。重复这一过程,直至外层表全部检查完为止

一般来说,多表连接查询的效率比子查询的效率要高,不相关子查询的效率比相关子查询的效率要好。