Sql 语法:select without from clause as subquery in select (subselect)

Sql syntax: select without from clause as subquery in select (subselect)

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

SELECT id, (SELECT name) FROM t

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

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

SELECT id, (SELECT name FROM t AS t1 where t1.id=t2.id) FROM t AS t2

但是EXPLAINExtra栏中报告了No tables used以前的版本,我觉得很好。

这里有一个简单的fiddle on SqlFiddle(它一直对我超时,希望你好运)。

澄清:我知道子查询,但我总是写子查询(相关或不相关),暗示从 table 到 select,因此导致额外的步骤执行计划;我的问题是关于这种语法及其给出的结果,在 MySQL 中似乎 return 没有任何期望值。

你在第一个查询中的是一个相关的子查询,它只是 returns 来自 table t[= 的 name 列25=]。这里没有实际的子查询需要 运行 (这是你的 EXPLAIN 告诉你的)。

In a SQL database query, a correlated subquery (also known as a synchronized subquery) is a subquery (a query nested inside another query) that uses values from the outer query.

https://en.wikipedia.org/wiki/Correlated_subquery

SELECT id, (SELECT name) FROM t

相同
SELECT id, (SELECT t.name) FROM t

您的第二次查询

SELECT id, (SELECT name FROM t AS t1 where t1.id=t2.id) FROM t AS t2

也包含相关子查询,但这个子查询实际上是 运行 在 table t 上查询以查找 t1.id = t2.id.

的记录

这不标准。在甲骨文中,

select 1, (select 2) 
from dual

抛出错误,ORA-00923: FROM keyword not found where expected

您如何确定您的结果?在编写查询之前更好地了解查询应该实现的目标。即使问题中的扩展版本也没有任何意义。

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

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

select id, (select name) from some 

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

幸运的是,我记得不久前我 answered 某人在这里找到了一个有效的可用 link 到 SQL ANSI 文档,该文档以完整形式在线,但它用于SQL ANSI 99 和部分可能与新文档不同。我认为,没有检查,它是在第 4.30 节附近。看一看。我真的很推荐阅读(我以前做过)。

Database Language SQL - ISO/IEC 9075-2:1999 (E)