MySQL 如何选择第n高的记录
在本节中,我们将学习如何使用各种技术从数据库表中选择第n高的记录。
我们可以通过使用 MAX()函数 或 MIN()函数 来轻松地获取数据库表中的最大(最高)或最小(最低)记录。但是假设我们想从表中获取第n高的记录(例如,获取员工表中第二高的薪水)。在这种情况下,没有可用于快速查找的函数,使得这颇为复杂。
通过执行以下步骤,我们可以选择MySQL数据库表中的第n高记录:
1. 第一步是按升序对所需列进行排序,以获得n个最高记录,即结果输出的最后一条记录。请参见以下查询:
SELECT * FROM table_name ORDER BY colm_name ASC LIMIT N;
2. 接下来,我们需要 按降序对结果输出进行排序 并获取第一条记录。
SELECT * FROM (
SELECT * FROM table_name
ORDER BY colm_name ASC LIMIT N) AS temp_table
ORDER BY colm_name DESC LIMIT 1;
以上查询也可以通过使用 LIMIT 子句来重写,该子句限制了结果输出中的行数,如下所示:
SELECT * FROM table_name ORDER BY colm_name DESC LIMIT n - 1, 1;
此查询将返回在 n-1行 之后的第一行,这应该是第n高的记录。
示例:
让我们通过示例来了解如何从表中获取第n高的记录。首先,我们将使用以下查询创建一个 Employee 表:
CREATE TABLE Employee (id int, name varchar(40), salary int);
接下来,使用以下查询插入记录:
INSERT INTO Employee VALUES
(1, 'Mike', 3000),
(2, 'John', 4000),
(3, 'Shane', 3000),
(4, 'Biden', 5000),
(5, 'Bravo', 7000);
执行 SELECT 语句 以验证记录:
假设我们想要获取雇员表中的第二高薪水(n = 2);我们可以使用以下语句:
mysql> SELECT name, salary FROM Employee ORDER BY salary DESC LIMIT 1, 1;
我们将会看到以下输出:
假设我们想要获取雇员表中的第三高薪水,在雇员表中可以使用下面的语句:
mysql> SELECT name, salary FROM Employee ORDER BY salary DESC LIMIT 2, 1;
我们将看到以下输出:
使用子查询来获取第n高的记录
我们还可以借助子查询来获取第n高的记录,该子查询依赖于主查询,并对主查询返回的每条记录进行处理。由于其执行速度较慢,这种技术很少被使用。
请查看下面的查询,它使用子查询返回第n高的记录:
SELECT name, salary FROM Employee AS emp1
WHERE N-1 = (SELECT COUNT(DISTINCT salary) FROM Employee emp2
WHERE emp2.salary > emp1.salary)
看下面的查询,它使用子查询从员工表中返回 第二高的薪水 :
SELECT name, salary FROM Employee AS emp1
WHERE 2-1 = (SELECT COUNT(DISTINCT salary) FROM Employee AS emp2
WHERE emp2.salary > emp1.salary);
我们将得到与之前查询返回的相同的输出: