找出薪水最高的前 2 名员工。
表名是salary
,列是name,salary
我们可以使用limit命令来做这个查询
select * from salary order by salary DESC limit 0,2
但是如何在不使用 top 和 limit 的情况下做到这一点?
我相信这个面试问题试图引导你使用嵌套选择、公用表表达式或类似的东西。TOP 2
是一个简单的答案,显然TOP
是为了这个目的而实施的——面试希望你“手动”做。
在理论代码中。在第一个(嵌套)选择中为每一行指定一个行数,然后从行数比您需要的行数多一个的结果中进行选择,在这种情况下为 3。
嵌套选择(伪代码):
select row_count, * from salary order by salary desc
外选:
select * from <nested select> where row_count < 3
很抱歉,这不是 MySQL 代码,但我只知道 SQL Server。
我有一些使用行数的 SQL Server 代码:
declare @Salaries table
(
id int,
salary money
)
insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4) -- A duplicating salary
;WITH Props AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY salary desc) AS RowNumber
FROM @Salaries
)
SELECT * FROM Props WHERE RowNumber < 3
这将返回 ID 为 4 和 5 的行。
解决 Sachin Kainth 的答案
我相信这个答案是不正确的。尝试以下 SQL Server 代码:
declare @Salaries table
(
id int,
salary money
)
insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4)
select * from @salaries where salary in -- "in" introduces the problem
(
SELECT MAX(E1.Salary)
FROM @salaries E1, @salaries E2
WHERE E1.Salary < E2.Salary
union
SELECT MAX(Salary)
FROM @salaries
)
这将返回 ID 为 3、4 和 5 的行。而不仅仅是 4 和 5。这是因为外部 select with 子句where salary in
将采用第 3、4 和 5 行,它们的薪水都由嵌套选择返回(返回薪水值 3 和 4)。
根据 SQL:2008 标准,您可以附加FETCH FIRST 10 ROWS ONLY
到查询中。虽然,我从未尝试过这个。所以在你的情况下你会有
SELECT * FROM salary ORDER BY salary DESC FETCH FIRST 2 ROWS ONLY
这是在MySQL中:
SET @row := 0;
SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM salary ORDER BY salary DESC)
AS derived1
WHERE Row < 3
仍然有一个警告。如果有重复的工资,结果可能会出现偏差。如果结果集大于两行,则结果中不会包含平局,但由于问题是针对两个薪水最高的员工而不是两个薪水最高的员工,所以这是我能做的最好的事情。
或许正确的答案是问“重复工资怎么办?”
如果它绝对必须是单个查询,这就是诀窍:
SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM (SELECT @row := 0) AS d1, salary)
AS d2
WHERE Row < 3
select * from salary where salary in
(
SELECT MAX(E1.Salary)
FROM Salary E1, Salary E2
WHERE E1.Salary < E2.Salary
union
SELECT MAX(Salary)
FROM Salary
)
+------+
| Sal |
+------+
| 3500 |
| 2500 |
| 2500 |
| 5500 |
| 7500 |
+------+
以下查询将返回第 N 个最大值元素。
select SAL from EMPLOYEE E1 where
(N - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
表结构
CREATE TABLE `emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`salary` int(10) DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
Mysql查询第n个术语n代表第n个项目
SELECT salary
FROM emp
WHERE salary = (SELECT DISTINCT(salary)
FROM emp AS e1
WHERE (n) = (SELECT COUNT(DISTINCT(salary))
FROM emp AS e2
WHERE e1.salary <= e2.salary))
SELECT e1.EmployeeID, e1.LastName, COUNT(DISTINCT e2.EmployeeID) AS sals_higher
FROM Employees e1
INNER JOIN Employees e2 ON e1.EmployeeID < e2.EmployeeID
GROUP BY e1.EmployeeID
HAVING sals_higher <= 2
ORDER BY e1.EmployeeID DESC
访问https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_union3 并尝试给定的代码,它会为您提供前 2 个最大 EmployeeID。
`我认为这可能有效
select * from salary s1 where 2>=(select count(distinct id) from salary s2
where s1.salary<=s2.salary) order by salary desc;
这是关联查询。对于外部查询中的每一行,内部查询将运行并通过将外部查询的薪水值与表中的每个薪水进行比较来返回一个计数值。它就像编程语言的嵌套循环
假设我们有两列 id 和薪水的表 Salary
id Salary
1 1200
2 12345
3 123456
4 2535436
输出将是
id salary
4 2535436
2 123456