【问题标题】:Getting second highest Salary value in MySQL在 MySQL 中获得第二高的薪水值
【发布时间】:2018-11-21 06:50:44
【问题描述】:

在给定的问题中,

编写一个 SQL 查询,从 Employee 表中获取第二高的薪水。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

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

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

我为这个问题写了一个代码,但是,预期的输出是不同的。

我的代码:

SELECT
CASE
    WHEN COUNT(*) = 1 THEN NULL
    ELSE (SELECT Salary FROM Employee HAVING Salary < MAX(Salary) ORDER BY Salary DESC LIMIT 1)
END AS SecondHighestSalary
FROM Employee;

我认为我的代码有问题,但我在这里找不到真正的问题。我的代码返回 100 而不是 200。我做错了什么?

+---------------------+
| SecondHighestSalary |
+---------------------+
| 100                 |
+---------------------+

【问题讨论】:

标签: mysql sql subquery


【解决方案1】:

您可以使用LIMIT {[offset,] row_count}。参考https://dev.mysql.com/doc/refman/8.0/en/select.html

Salary 降序排列,通过将OFFSET 定义为1 得到第二行。我们将在Salary 上使用DISTINCT,因为可能会有多行表示最高薪水。

SELECT DISTINCT
  Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1,1

【讨论】:

  • @Sadikhasan 这有什么关系,因为 OP 只想要薪水数字,而不是整行。
  • 感谢您的回答。但是我试过了,当只有一名员工时,这不会返回null。我想也许添加IFNULL() 可以吗?
  • @Poream3387 嗯.. 让我测试一下。我还没有测试过。
  • @Poream3387 它不返回任何结果:db-fiddle.com/f/e1Efjj6SY5xVrTEuJ9oP4j/0 - 这几乎等同于获取null。当没有返回行时,您可以在应用程序代码(例如:PHP)中处理此问题。
  • 如果没有第二高的薪水,通过将答案包装在选择中,您将能够获得“空”值
【解决方案2】:

你可以试试下面

SELECT MAX(salary) From Employee WHERE salary < ( SELECT Max(salary) FROM Employee);

【讨论】:

    【解决方案3】:

    试试看:

    SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1
    

    或者更深入的方法,你可以使用类似的东西:

    SELECT salary FROM Employee GROUP BY salary ORDER BY salary DESC LIMIT 1,1
    

    所有查询都具有高性能,因为它们没有任何子查询。

    【讨论】:

      【解决方案4】:

      如果您想在没有最高薪水的情况下显示 empty_row(null),则执行以下操作,如果有值则显示

      select (select salary
                from Employee ORDER BY salary DESC LIMIT 1,1
              ) as x
      

      【讨论】:

      • 在没有第二高薪水的情况下,OP 想要返回一个值为“null”的行。如果没有“wrapper”,查询将返回“no_rows_returned”或空记录集。跨度>
      • 对,明白了!!
      【解决方案5】:

      这是解决方案。

      SELECT MAX(salary) From Employee WHERE salary < ( SELECT Max(salary) FROM Employee);
      

      【讨论】:

        猜你喜欢
        • 2018-06-20
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 2011-12-20
        相关资源
        最近更新 更多