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

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中都对自连接处理做了优化.
相关推荐
m0_7482333612 分钟前
精准删除:掌握SQL中的DELETE语句
数据库·sql·oracle
m0_7482468729 分钟前
flask后端开发(8):Flask连接MySQL数据库+ORM增删改查
数据库·mysql·flask
猿小喵35 分钟前
MySQL缓存命中率
数据库·mysql·缓存
被程序耽误的胡先生1 小时前
复杂sql
java·数据库·sql
远川_Horizon1 小时前
Lab14_ Blind SQL injection with time delays
sql·web安全
GSDjisidi1 小时前
日本IT|SQL工程师的工作内容以及所需的技能·资格
数据库·sql
一小路一1 小时前
MySQL 数据库基础
数据库·mysql·oracle
路在脚下@1 小时前
数据库并发问题有那些以及解决办法
java·sql
安清h2 小时前
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之加入购物车和显示购物车列表
数据库·后端·mysql·spring·mybatis
m0_748240252 小时前
DVWA靶场通关——SQL Injection篇
数据库·sql