跳到主要内容

子查询

什么是子查询?​

  • 定义: 查询 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 §子查询)