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

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中都对自连接处理做了优化.
相关推荐
gAlAxy...1 天前
SpringMVC 响应数据和结果视图:从环境搭建到实战全解析
大数据·数据库·mysql
b***46241 天前
从 SQL 语句到数据库操作
数据库·sql·oracle
vx_dmxq2111 天前
【微信小程序学习交流平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·微信小程序·小程序·idea
q***07141 天前
Spring Boot 中使用 @Transactional 注解配置事务管理
数据库·spring boot·sql
m***92381 天前
【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串
数据库·sql·mysql
TracyCoder1231 天前
MySQL 实战宝典(八):Java后端MySQL分库分表工具解析与选型秘籍
java·开发语言·mysql
合作小小程序员小小店1 天前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
p***92481 天前
深入理解与实战SQL IFNULL()函数
数据库·sql·oracle
q***81641 天前
MySQL:数据查询-limit
数据库·mysql
p***92481 天前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql