子查询
什么是子查询?
- 定义: 查询 A 写在查询 B 的内部, 成为 B 的一部分, A 就是子查询;
- 嵌套: 子查询内部还可以再有下一级子查询;
- 位置: 可出现在 WHERE、FROM 等子句中;
产生标量值的子查询怎样工作?
- 执行顺序: 先执行子查询;
- 返回: 子查询返回一个原子值;
- 使用: 该值作为外层查询条件中的一个比较对象;
SELECT name
FROM MovieExec
WHERE cert = (
SELECT producerC FROM Movies WHERE title = 'Star Wars'
);
关联子查询与普通子查询有什么区别?
- 普通子查询: 与外层无关, 只需计算一次;
- 关联子查询: 子查询中引用了外层查询的元组变量, 因此要对外层每个元组计算一次;
- 例子: 下面查询中
Old.title来自外层表MoviesOld;
SELECT title
FROM MoviesOld
WHERE year < ANY (
SELECT year FROM Movies WHERE title = Old.title
);
FROM 子句中的子查询要注意什么?
- 要求: 子查询的结果必须起别名, 才能被外层引用;
- 原因: FROM 中的每一项都要有可引用的关系名;
SELECT name
FROM MovieExec, (
SELECT producerC
FROM Movies, StarsIn
WHERE title = movieTitle AND year = movieYear
) Prod
WHERE cert = Prod.producerC;
(source: 050-sql.md §子查询)