Joh*_*son 0 mysql sql sql-server sqlite postgresql
我正在浏览Ben Fortas"在10分钟内自学SQL"一书,并且它有灰色框警告:"子查询SELECT语句只能检索单个列.尝试返回多个列将返回错误."
事实上,对于RDMS来说,这通常是正确的吗?(请注意,如果这个答案是正确的,则所有数据库都不是这样).
为什么这个世界会是真的?这似乎是一种奇怪的语言限制.查询计算起来很昂贵,并且检索3列的工作在计算上与检索1的工作没有特别的不同(除非您的RDMS存储按列分组而不是按行分组的表).
在您链接的答案中,我将其分类为"内联视图"或"内联查询",而不是子查询.
当然,这就提出了一个子查询究竟是什么的问题.
这是一个只能返回单个列的示例.
select (select name from table where id = main_query.id),
id
from table main_query
Run Code Online (Sandbox Code Playgroud)
这是一个可以返回多列的示例.这似乎是一个明确的"相关"类型的子查询.
select id
from table main_query
where (col1, col2) in (select a,b
from c
where c.x = main_query.y);
Run Code Online (Sandbox Code Playgroud)
下面是一个示例,其中返回的列数无关紧要,实际上忽略了任何值:
select id
from table main_query
where exists (select a,b
from c
where c.x = main_query.y);
Run Code Online (Sandbox Code Playgroud)
我认为总的来说,我会说这不是真的,但这取决于你对子查询的定义是什么.
标量子查询只能返回一列.这些是在预期单个值的任何位置使用的子查询.这几乎可以在任何条款中使用.例如,因为这个非敏感的查询使用它们:
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);
Run Code Online (Sandbox Code Playgroud)
但是,许多子查询不是标量子查询.这些包括:
FROM子句中的子查询.EXISTS和的子查询NOT EXISTS.=和IN.| 归档时间: |
|
| 查看次数: |
1395 次 |
| 最近记录: |