SELECT语句中的表达式
常规SELECT语句中的哪些地方允许使用表达式?后端无关紧要,我的意思是从概念(iso?)的角度来看更多。
例如,在进行一些基本测试时(使用 mysql8,但同样,我不关心特定的后端)似乎除了在LIMITorOFFSET地方之外的任何地方都允许它:
with tbl (num, str) as (
select 1, 'a'
)
SELECT
(select num from tbl limit 1) select_expr -- select expression
FROM
(select * from tbl limit 1) table_expr -- table expression
WHERE
(select null from tbl)
or 1 = (select num from tbl)
or (select num from tbl) = (select num from tbl) -- filter expressions, can be lhs or rhs or single subselect
GROUP BY
num, (select num from tbl) -- aggregate expression
HAVING
(select num from tbl limit 1)
ORDER BY
(select num from tbl limit 1)
LIMIT
(select num from tbl limit 1) -- invalid
OFFSET
(select num from tbl limit 1) -- invalid
回答
通常,在允许常量值的任何地方都允许使用标量子查询- 例如SELECT,WHERE, HAVING, ORDER BY, 。
甲标量子查询是一个子查询返回至多一行和一个值(通常即,一个表达式或列)。
是否允许它们作为GROUP BY键可能取决于数据库。但话又说回来,“常量”值不一定支持作为GROUP BY键。
LIMIT不是标准的 SQL 子句。它的行为完全取决于定义它的数据库。标准 SQL 中的等效项是FETCH; 我相信它需要实际的常量,但不同的数据库可能会以不同的方式对待它。