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;
所以如果我在 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;