我要经历Ben Fortas"在10分钟内自学SQL#34;本书并且它有灰色框警告:"子查询SELECT语句只能检索单个列。尝试返回多个列将返回错误。"
事实上,对于RDMS来说,这通常是正确的吗? (请注意,如果this answer正确,那么所有数据库都不是这样。)
为什么这个世界会是真的?这似乎是一种奇怪的语言限制。查询计算起来很昂贵,并且检索3列的工作在计算上与检索1的工作没有特别的不同(除非您的RDMS存储按列分组而不是按行分组的表)。
答案 0 :(得分:5)
在您链接的答案中,我会将其归类为"内联视图"或"内联查询",而不是子查询。
当然,这提出了一个子查询究竟是什么的问题。
以下是您确实只能返回一列的示例。
select id
from table main_query
where (col1, col2) in (select a,b
from c
where c.x = main_query.y);
这是一个可以返回多个列的示例。这似乎是一个明确的子查询,相关的"类型。
select id
from table main_query
where exists (select a,b
from c
where c.x = main_query.y);
以下是一个示例,其中返回的列数并不重要,实际上忽略了任何值:
{{1}}
我认为总的来说,我说这不是真的,但这取决于你对子查询的定义是什么。
答案 1 :(得分:5)
标量子查询只能返回一列。这些是在预期单个值的任何位置使用的子查询。这几乎可以在任何条款中使用。例如,因为这个非敏感的查询使用它们:
select (select count(*) from information_schema.tables), table_name
from information_schema.columns
where table_name = (select table_name from information_schema.columns order by rand() limit 1);
但是,许多子查询不是标量子查询。其中包括:
FROM
子句中的子查询。EXISTS
和NOT EXISTS
。=
和IN
等比较中使用元组的运算符的子查询。