在MySQL中,这个简单的嵌套SELECT子句究竟意味着什么?

时间:2016-04-22 03:08:22

标签: mysql sql

以下是此thread的示例:

select (
  select distinct Salary from Employee order by Salary Desc limit 1 offset 1
)as second;

select(...) as second让我感到困惑,因为我从未见过查询集而不是列名可以用作SELECT的参数。

有没有人有关于如何理解这样的嵌套select子句的想法?有没有关于此功能的教程?

1 个答案:

答案 0 :(得分:1)

这是查询的SELECT列表中的子查询。

要实现目标,让我们看看其他一些例子

SELECT t.id
     , 'bar' AS foo 
  FROM mytable
 WHERE ...
 LIMIT ...

'bar'只是一个字符串文字,在查询的结果集中的每一行(在一个名为foo的列中)返回。

此外,MySQL允许我们在没有 FROM子句

的情况下运行查询
SELECT 'fee' AS fum

我们还可以将子查询放在查询的SELECT列表中。例如:

SELECT t.id
     , (SELECT r.id FROM resorts r ORDER BY r.id ASC LIMIT 1) AS id
  FROM mytable
 WHERE ...
 LIMIT ...

您询问的查询模式是没有FROM子句的SELECT语句

返回的唯一表达式是子查询的结果。

例如:

 SELECT e.salary 
   FROM Employee e
  GROUP BY e.salary
  ORDER BY e.salary DESC
  LIMIT 4,1

如果此查询运行,它将返回一列,并返回一行或零行。 (不超过一个。)这满足了另一个查询的SELECT列表中使用的子查询的要求。

SELECT ( subquery ) AS alias

这样,外部查询就会执行。没有FROM子句,所以MySQL返回一行。结果集将由一列组成,名称为“别名”。

对于外部查询返回的每一行,MySQL将在SELECT列表中执行子查询。如果子查询返回一行,则子查询的SELECT列表中的表达式值将分配给结果集的“别名”列。如果子查询的执行没有返回一行,那么MySQL会为“别名”列分配一个NULL。