子查询就是在查询语句中嵌套另一个查询,子查询支持多层嵌套。
子查询出现位置:
- form语句后当成数据表(实质是一个临时视图,so这种方法也被称为内视图);
- where条件后作为过滤条件的值。
Note:
- 子查询要用括号括起来;
- 把子查询作为数据表时(出现在from后),可为其起别名,作为前缀来限定数据列时,必须起别名【临时视图】。
- 作为过滤条件where时,将子查询放在比较运算符的右边,可增强查询的可读性;
- 作为过滤条件where时,单行子查询使用单行运算符,多行子查询使用多行运算符;
- 作为过滤条件where,如果子查询返回单行或单列值,则被当成一个标量值使用,即可使用单行记录比较符。
- ①若子查询返回多个值,则需要使用in、any、all等关键字。
- ②in可单独使用,效果同比较运算符的in,子查询返回的多个值将被当成一个值列表。
- ③any、all可与>、>=、<、<=、<>、=等运算符结合使用。与any(all)结合表示大于其中任意一个值(所有值)。
- ④=any 与 in 的作用相同。
- 作为where条件时,若子查询返回多行多列,则where应该有对应的数据列,并用圆括号将其组合起来。
# 子查询
#
# 作为数据表(临时视图)
SELECT *
FROM (SELECT * FROM student) s
WHERE s.id =6;
# 作为where条件,若子查询返回单行或单列值,则被当成一个标量值使用
SELECT *
FROM student
WHERE
grade >(
# 此子查询返回单行数据
SELECT math
FROM grades
WHERE id =1
);
# 若子查询返回多个值,则需要使用in、any、all等关键字
SELECT *
FROM student
WHERE
id IN(
# in可单独使用,效果同比较运算符的in,子查询返回的多个值将被当成一个值列表。
SELECT id
FROM grades
WHERE id =5 OR id =6
);
# =any
SELECT *
FROM student
WHERE
# =any等价于in
id =ANY(SELECT id FROM grades);
# >=all
SELECT *
FROM student
WHERE
id >=ALL(SELECT id FROM grades);
# 子查询返回多行多列,则where应该有对应的数据列,并用圆括号将其组合起来。
SELECT s.*
FROM student s
WHERE # 组合内的字段均须对应相等
(id, grade)=ANY(SELECT id, math FROM grades g);