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

时间:2021-06-01 01:09:16

标签: mysql sql relation

因此,如果我使用子查询在 FROM 中定义表,则子查询几乎可以是任何内容:

FROM (SELECT x FROM table)

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

SELECT (SELECT x FROM table) AS x

可以引发错误

<块引用>

子查询返回超过 1 行

如果有多行。

为什么 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; 

2 个答案:

答案 0 :(得分:1)

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

  • 派生表,它们是 FROM 子句中的子查询,可返回可以具有多行多列的结果集。
  • 标量子查询,通常返回一列和最多一行。

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

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

答案 1 :(得分:1)

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

因此,查询 nº2 是正确的,但应该这样写:

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