select 语句中的子查询与 FROM 语句中的子查询

subquery in select statement vs subquery in FROM statement

所以如果我在 FROM 中定义一个带有子查询的 table,子查询可以是任何东西:

FROM (SELECT x FROM table)

但是如果我想在SELECT子句中使用子查询,它似乎有更多的限制例如

SELECT (SELECT x FROM table) AS x

可以引发错误

Sub query returns more than 1 row

如果有多行。

为什么SELECT子句中的子查询不能单列多行?如果它不能接受多行,为什么我不能使用 MAX() 之类的东西将行聚合为一个值?

例如,查询 (1) 有效而 (2) 无效。

查询 1:

SELECT
    (SELECT salary FROM Employee 
LIMIT 1 OFFSET 1) AS salary;

查询 2:

SELECT
    MAX(SELECT salary FROM Employee) AS salary; 

SQL 支持各种类型的子查询。一个非常重要的区别是:

  • 派生表FROM子句中的子查询,return一个结果集可以有多行和多列。
  • 标量子查询其中return(通常)一列最多一行。

您在 SELECT 子句中描述为“子查询”的是标量子查询。该值是对文字值的替换,因此它只能 return 一列。如果标量 return 的零行,则值为 NULL.

请注意,标量子查询有时会扩展为支持多列。在那种情况下,return 值实际上是一个 元组 ,因此该值仍然是“一件事”。但是那个东西可以有多个字段,比如一个结构或者记录许多编程语言。

您可以将子查询包含为 SELECT 表达式,只要它 returns 仅具有多个 ONE 值。为什么?因为 SELECT 子句定义了如何计算返回行集的 EACH ROW 的值。

所以,第2条查询是对的,但应该这样写:

SELECT (SELECT MAX(salary) FROM Employee) AS salary;