Sql语法:在select(subselect)中选择不带from子句作为子查询

wat*_*ery 8 mysql sql mysql-5.6

在编辑一些查询以添加没有值的列的替代方法时,我不小心写了这样的东西(这里是简单的版本):

SELECT id, (SELECT name) FROM t
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,MySQL没有抛出任何错误,但完成了查询,给出了我的预期结果(name列值).我试图找到有关它的任何文档,但没有成功.

这是SQL标准还是MySQL专业?
我可以确定此语法的结果实际上是来自同一(外部)表的列值吗?扩展版本是这样的:

SELECT id, (SELECT name FROM t AS t1 where t1.id=t2.id) FROM t AS t2
Run Code Online (Sandbox Code Playgroud)

EXPLAIN报告No tables usedExtra列前的版本,我认为这是非常好的.

这是SqlFiddle上的一个简单的小提琴(它为我保留时间,我希望你有更好的运气).

澄清:我知道子查询,但我总是编写子查询(相关或不相关),暗示了一个表可供选择,因此在执行计划中引起了额外的步骤; 我的问题是这个语法及其给出的结果,在MySQL中似乎没有任何返回预期值.

Jor*_*pos 2

这是 SQL 语言的默认行为,它是在SQL ANSI 2011 over ISO/IEC 9075-1:2011(en)文档中定义的。不幸的是它没有开放。此行为在 4.11 SQL 语句部分进行了描述。

发生此行为是因为数据库处理 select 命令时没有使用 from 子句,因此如果遇到:

select id, (select name) from some 
Run Code Online (Sandbox Code Playgroud)

它将尝试找到该name字段作为外部查询的列来处理。

幸运的是,我记得不久前我在这里回答了某人,并找到了一个完整的在线 SQL ANSI 文档的有效可用链接,但它是针对 SQL ANSI 99 的,并且该部分可能与新文档不同。我想,没有检查,它是在 4.30 节附近。看一看。我真的推荐阅读(我当时就这样做了)。

数据库语言 SQL - ISO/IEC 9075-2:1999 (E)