1. 相关子查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行的条件关联,因此每一次执行一次外部查询,子查询都会重新计算一次,这样的子查询称为关联子查询.
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询.
例1 : 查询部门人数>5的部门名称.
注 :
- 外部查询每执行一行,就会执行一次子查询,判断该部门的人数是否>5.
- 子查询使用了外部表,并进行了条件关联.
例2 : 在FROM子句中使用子查询. 将子查询当作临时表.
注 :
- 在MySQL中,子查询在FROM子句中作为临时表时,必须给表起别名.如上的mytable.否则会报错.
- 子查询中的SELECT子句中,AVG(salary)应作为表的字段出现,而不是作为聚合函数.所以必须给其起别名.且在MySQL中,不允许出现MIN(AVG(salary))这种写法.
- 不仅可以在FROM子句中使用子查询,在SELECT中,除了GROUP BY和LIMIT,其他位置都可以使用子查询.
2. EXISTS与NOT EXISTS关键字
关联子查询通常会与EXISTS操作符一起来使用.用来检查在子查询中是否存在满足条件的行.
如果在子查询中不存在满足条件的行,则
- 条件返回FALSE.
- 继续在子查询中查找
如果在子查询中存在满足条件的行,则
- 不在子查询中查找.
- 条件返回TRUE.
NOT EXISTS关键字则表示如果不存在满足条件的行,则返回TRUE.否则返回FALSE.
例 : 查询公司管理者的相关信息.
当然,也可以用自连接来完成.
3. 自连接与子查询的比较
上例中,子查询和自连接两种方法,使用自连接更好.
原因 :
- 因为在需要DBMS的处理过程中,对于自连接的处理速度比子查询要快的多.
- 子查询实质上是通过未知表进行查询后的条件判断,而自连接是通过已知表的自身数据表进行条件判断,因此在大部分DBMS中都对自连接处理做了优化.