子查询之二(不相关子查询与相关子查询)

1. 相关子查询

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行的条件关联,因此每一次执行一次外部查询,子查询都会重新计算一次,这样的子查询称为关联子查询.

相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询.

例1 : 查询部门人数>5的部门名称.

注 :

  • 外部查询每执行一行,就会执行一次子查询,判断该部门的人数是否>5.
  • 子查询使用了外部表,并进行了条件关联.

例2 : 在FROM子句中使用子查询. 将子查询当作临时表.

注 :

  • 在MySQL中,子查询在FROM子句中作为临时表时,必须给表起别名.如上的mytable.否则会报错.
  • 子查询中的SELECT子句中,AVG(salary)应作为表的字段出现,而不是作为聚合函数.所以必须给其起别名.且在MySQL中,不允许出现MIN(AVG(salary))这种写法.

2. EXISTS与NOT EXISTS关键字

关联子查询通常会与EXISTS操作符一起来使用.用来检查在子查询中是否存在满足条件的行.

如果在子查询中不存在满足条件的行,则

  • 条件返回FALSE.
  • 继续在子查询中查找

如果在子查询中存在满足条件的行,则

  • 不在子查询中查找.
  • 条件返回TRUE.

NOT EXISTS关键字则表示如果不存在满足条件的行,则返回TRUE.否则返回FALSE.

例 : 查询公司管理者的相关信息.

当然,也可以用自连接来完成.

3. 自连接与子查询的比较

上例中,子查询和自连接两种方法,使用自连接更好.

原因 :

  • 因为在需要DBMS的处理过程中,对于自连接的处理速度比子查询要快的多.
  • 子查询实质上是通过未知表进行查询后的条件判断,而自连接是通过已知表的自身数据表进行条件判断,因此在大部分DBMS中都对自连接处理做了优化.
相关推荐
新*4 小时前
Elasticsearch 7.17 的 SQL 到底能查到什么?一次踩坑记录
后端·sql·elasticsearch·查询
星恒随风7 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi9 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
aiks_yuan10 小时前
MySQL 死锁怎么排查:看懂 INNODB STATUS 死锁日志,先查后插为什么必死锁(MySQL 8.2 实测)
mysql
进击的荆棘13 小时前
MySQL——库的操作
数据库·mysql
计算机毕设定制辅导-无忧学长13 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
这个DBA有点耶1 天前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶1 天前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风1 天前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
杨凯凡2 天前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql