2016.12.3
十四.子查询
包含在其他查询中的查询叫子查询。子查询可以和主查询相互关联并依赖于主查询,也可以完全的独立于主查询。子查询很多都可以用其他方法来表达。
14.1 子查询的类型
子查询不仅可以用于SELECT语句中,而且可以用在INSERT,UPDATE和DELECT语句中。
一般的SELECT语句如下:
SELECT columnlist
FROM tablelist
WHERE conditon
GROUP BY columnlist
HAVING condition
ORDER BY columnlist
可以把子查询插入到SELECT语句的任何子句中。声明和使用子查询的方式取决于子查询用于columnlist、tablelist还是confition中。一条SELECT语句可以有多条子查询。
可以用3种主要的方式来指定子查询
(1)当子查询用于tablelist时,它指定了一个数据源
(2)当是condition的一部分时,它是查询条件的一部分
(3)当时columnlist的一部分,它创建了一个单个的计算的列。
14.2 使用子查询作为数据源
它和创建一个视图并在SELECT语句中引用该视图的概念类似,但是区别在于视图是永久存放在数据库中的,而作为数据源的子查询是不保存的,它只是SELECT语句的一部分而临时存在。
SELECT columnlist
FROM tablelist
LEFT JOIN(
SELECT columnlist
FROM tablelist
WHERE condition
GROUP BY columnlist
)
ON condition
ORDER BY columnlist
14.3 在查询条件中使用子查询
将子查询放在WHERE IN后面的括号中。
SELECT columnlist
FROM tablelist
WHERE column IN(
SELECT columnlist
FROM tablelist
WHERE condition)
14.4 关联子查询
根据子查询是否和包含它的查询相关联,子查询分为非关联的和关联的两种。非关联查询只会计算和执行一次。关联子查询需要针对返回的每一行逐行计算,并且可能在每次执行子查询时得到不同的结果。关联的子查询是不能独立执行的。
SELECT columnlist
FROM table1
WHERE(
SELECT columnlist
FROM table2
WHERE table1.column1 = table2.column1)<value
上述就是一个关联子查询。因为子查询中的上下文没有table1的column1列。
14.5 EXISTS操作符
这个操作符让我们确定关联子查询中是否存在数据。
SELECT columnlist
FROM tablelist
WHERE EXISTS(
SELECT columnlist
FROM tablelist
WHERE condition)
如果关联子查询返回了任何数据,关键字EXISTS计算结果为真。
14.6 使用子查询作为一个计算的列
SELECT columnlist
subqueryresult
FROM table
ORDER BY columnlist
