1.子查询分两种
(1)单行子查询:对外部的SQL要么不返回结果,要么只返回一行。单行子查询的一种特殊情况就是正好包含一列(标量子查询)
(2)多行子查询:向外部的SQL语句返回一行或多行
(3)多列子查询:向外部的SQL语句返回多列
(4)关联子查询:引用外部SQL中的一列或者多列,因为他们通过相同的列与外部的SQL进行关联,所以叫关联子查询
(5)嵌套子查询:位于另外一个子查询中
2.单行子查询
(1)子查询可以放到select语句的where、having或者from子句中
(2)在单行子查询中,可以使用其他的比较操作符
(3)标量子查询是只返回一行且包含一列的查询
(4)在外部的查询可以使用having对子查询的结果进行行组过滤
(5)在外部查询的from子句中也可以使用子查询(内联视图)
(6)单行子查询最多只能返回一行,且不能包含order by 子句。
3.多行子查询
(1)要处理返回多行的子查询,外部查询可以使用IN,ANY,ALL操作符。
(2)IN可以用来检查在值列表中是否包含指定的值。值列表也可以来自子查询的返回结果。NOT IN用来检查在值列表中是否不包含指定的值。
(3)ANY操作符可以用来将值与列表中的任何值进行比较,在查询中,在ANY操作符之前必须使用>,<,<=,>=操作符
(4)ALL操作符可以用来将值与列表中的所有值进行比较,在查询中,在ALL操作符之前必须使用>,<,<=,>=操作符
4.关联子查询
(1)关联子查询对于外部查询的每一行都会运行一次,非关联子查询只在运行外部查询之前运行一次,此外关联子查询可以解决空值的问题。
(2)在关联子查询中,外部查询中的每一行都被逐行传递给子查询,子查询一次读取外部查询中每一行的值,并将其应用到子查询,直到外部查询中的所有行都被处理完为止,然后返回整个查询的结果。
(3)exists操作符用于检查子查询返回行的存在性,虽然exists也可以在非关联子查询中使用,但是exists通常用于关联子查询;exists只是检查子查询返回行的存在性,因此子查询不必返回一列,可以只返回字面值,只要子查询返回一行或者多行,exists返回true;否则返回false
(4)not exists用于检查行是否不存在于子查询返回的结果中时使用
(5)exists比in的性能高,in要检查实际值,exists检查行的存在性
(6)not in和not exists区别:当值列表包含空值时,not exists返回true;not in返回false
4.子查询因子化
(1)子查询放在with子句中并且在with子句的外部引用这些子查询
比如:
WITH temp_table AS(
SELECT t.ID,t.sname,t.sex FROM student
)
SELECT * FROM temp_table
ORDER BY temp_table.ID