Concepts
What is subquery?
- query 中包含的query,会在query中最先执行,一般被
()包围. - subquery可以返回:
- 一行一列
- 多行一列
- 多行多列
- 在整个query执行完成后,subquery的执行结果就会作废,类似于temporary table.
Subquery Type
Noncorrelated Subqueries
定义: Subqueries are completely self-contained,subquery并不会引用包含其的query中的数据
scalar subquery: 用于数值判断
一列一行:
= <> > <一列多行的输入:
INNOT INALLALL:$compare_operator ALL($single_column_multiple_row)与一列多行的元素进行一一对比,当对所有行后满足condition时为true,如3 > ALL(0,1,2)为true,而1 > ALL(0,1,2)为falseANY:$compare_operator ANY($single_column_multiple_row)与一列多行的元素进行一一对比,当对任意某行后满足condition时为true,如3 > ALL(0,1,2)为true,而1 > ALL(0,1,2)也为true
多列
Correlated Subqueries
- 定义:reference columns from the containing statement.
- 运行过程
- code
SELECT c.first_name, c.last_name FROM customer c WHERE 20 = (SELECT count(*) FROM rental r WHERE r.customer_id = c.customer_id) - 过程
- 从customer中依次抽取每一个customer_id在subquery中进行对比。
- 然后再根据subquery输出的结果和总query的condition进行判断,将符合条件的结果输出。
- code
Performance Issue: 因为需要遍历,所以correlated subquery可能会导致性能问题。
EXISTSEXISTS($subquery)判断subquery中是否存在符合条件的row
Maniplating By Subqueries
UPDATEUPDATE $tbl_name $tbl_alias SET $tbl_alias.$fld_name = ($subqueries) WHERE $condition ($contain_subqueries);DELETEDELETE FROM $tbl_name WHERE $condition ($contain_subqueries);DELETE FROM 中不能使用table alias