Mysql 为什么从SELECT移动子查询会导致NULL?

Mysql 为什么从SELECT移动子查询会导致NULL?,mysql,sql,Mysql,Sql,我试图理解MySQL中与NULL相关的行为。当我在上尝试以下问题时,出现了这种行为: 编写SQL查询以从员工处获取第二高的工资 桌子 例如,给定上面的Employee表,查询应该返回 200美元作为第二高工资。如果没有第二高 薪资,则查询应返回null 我是SQL新手,仍然在学习使用空值的细节。我尝试了以下查询,以查看在没有第二高工资时是否返回NULL: SELECT e.Salary as SecondHighestSalary FROM ( SELECT DISTINCT Sala

我试图理解MySQL中与NULL相关的行为。当我在上尝试以下问题时,出现了这种行为:

编写SQL查询以从员工处获取第二高的工资 桌子

例如,给定上面的Employee表,查询应该返回 200美元作为第二高工资。如果没有第二高 薪资,则查询应返回null

我是SQL新手,仍然在学习使用空值的细节。我尝试了以下查询,以查看在没有第二高工资时是否返回NULL:

SELECT e.Salary as SecondHighestSalary
FROM ( 
    SELECT DISTINCT Salary from Employee ORDER BY Salary DESC LIMIT 1, 1
) as e
如果没有第二高工资,此查询将不返回任何结果。(我认为这算不了什么;在任何情况下,它都不会返回NULL或空字符串。)

我最终提出了一个更复杂的问题来回答这个问题。然而,当我在讨论部分与其他人的解决方案进行比较时,我发现:

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

与我的第一次尝试不同,如果第二高工资不存在,此查询将返回NULL


有人知道为什么在这种情况下,将同一子查询从from子句移动到SELECT会改变返回行为吗?

在第二个查询中,您有一个子查询,它在
SELECT
中返回一个值。这称为标量子查询

通常,标量子查询可以只返回一列、零行或一行,否则会出现错误(在某些数据库的某些上下文中,允许多列,但这与此无关)


总的来说,无论发生什么情况,
select
而不使用
from
都只返回一行。不返回行的标量子查询在外部查询中被视为
NULL
值。这就是为什么只有一行
NULL
,而不是零行。

谢谢Gordon,我想我明白了为什么第二个查询返回NULL。澄清一下,FROM子句的存在是否意味着SELECT根本不必返回任何内容?如果是,原因是否简单/相关?@user8629729。实际上,它是一个
,其中
具有
子句,通常会过滤行——然而,一个
from
子句可以引用一个空表,或者使用
on
子句也不会产生行。好的,我想我明白了。谢谢
SELECT e.Salary as SecondHighestSalary
FROM ( 
    SELECT DISTINCT Salary from Employee ORDER BY Salary DESC LIMIT 1, 1
) as e
select (
  select distinct Salary from Employee order by Salary Desc limit 1 offset 1
)as SecondHighestSalary