有人可以告诉我这个 sql 查询是如何计算的:
SELECT e.sal
FROM employees e
WHERE 1 >= (
SELECT count(*)
FROM employess s
WHERE s.sal>e.sal
)
我知道这个查询返回第一和第二高薪水。但我想了解这个查询的工作原理。我想知道它如何返回第一和第二高的薪水。请详细说明。
有人可以告诉我这个 sql 查询是如何计算的:
SELECT e.sal
FROM employees e
WHERE 1 >= (
SELECT count(*)
FROM employess s
WHERE s.sal>e.sal
)
我知道这个查询返回第一和第二高薪水。但我想了解这个查询的工作原理。我想知道它如何返回第一和第二高的薪水。请详细说明。
子选择
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
返回薪水大于您在顶层查看的当前员工的员工人数select
。
所以查询基本上说给我所有员工,使其他员工的收入比他们多 1 人或更少
非常直截了当,尽管效率极低。更简单的方法就是这样:
select top 2 * from employees order by sal desc
编辑:这将返回薪水最高的前 2 名员工,正如 Gordon 指出的那样,这与前 2 名不同的薪水值不同,因为人们可能有完全相同的薪水。如果这是一个问题,您必须首先像这样对其进行重复数据删除:
select top 2 sal from employees group by sal order by sal desc
为了获得你的第一和第二高薪,我会使用ROW_NUMBER()
. 这应该很容易理解薪水的排名。或者,如果您需要考虑关系,请考虑使用RANK()
.
像这样的东西应该工作:
SELECT sal, Row
FROM (
SELECT sal, ROW_NUMBER() OVER(ORDER BY sal DESC) AS Row
FROM employees e ) t
WHERE Row IN (1,2);
这是SQL Fiddle。
祝你好运。
该查询应该返回所有内容。
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
由于 e.sal 永远不会 > e.sal(1 永远不会 > 1),因此 count(*) 将始终为 0。并且SELECT e.sal FROM employees e WHERE 1 >= (0)
永远是一切
如果你想返回前 2 名的薪水,你可能想试试这个:
SELECT TOP 2 * FROM employess AS e ORDER BY e.sal DESC