select语句中的subquery与FROM语句中的子query



因此,如果我用子查询在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; 

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

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

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

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

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

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

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

最新更新