SQL查询以查找员工的第N高薪

找到第N个最高的薪水是一个很常见的面试问题,如果你要在初级水平的作用。大多数人逐个字符地学习它,但是很少有人了解此查询的工作方式。它的性能好坏是多少?在这篇文章中,我们将学习这些东西。我正在使用MySQL数据库进行演示。

目录

1. 创建架构并填充表 
2. 编写查询并验证结果 
3. 查询的工作方式 
4. 性能分析

1.创建数据库架构并填充表

让我们创建一个简单的表示例Employee。我们将用id和雇员的工资填充此表。我们将编写查询以在此表上找到第n个最高薪水。

创建一个新的数据库架构。

Create schema TestSQL;

创建一个新表Employee_Test

CREATE TABLE Employee_Test
(
    Employee_ID INT,
    Employee_name Varchar(100),
    Employee_Salary Decimal (10,2)
);

用测试数据填充表。

INSERT INTO Employee_Test VALUES (1,'Anish',1000);
INSERT INTO Employee_Test VALUES (2,'Sushant',1200);
INSERT INTO Employee_Test VALUES (3,'Rakesh',1100);
INSERT INTO Employee_Test VALUES (4,'Manoj',1300);
INSERT INTO Employee_Test VALUES (5,'Amit',1400);
INSERT INTO Employee_Test VALUES (6,'Lokesh',1600);
INSERT INTO Employee_Test VALUES (7,'Maneneder',1400);
INSERT INTO Employee_Test VALUES (8,'Narendra',400);
INSERT INTO Employee_Test VALUES (9,'Kaushal',1900);
INSERT INTO Employee_Test VALUES (10,'Vikas',3400);
INSERT INTO Employee_Test VALUES (11,'Sudhir',800);

2. SQL查询找到第n个最高薪水

因此,正如我们大多数人所知道的那样,查询是为了找到第n个最高薪水而编写的。在下面的查询中,我们看到如何在不使用max函数的情况下在sql中找到最高薪水。

SELECT *
FROM Employee_Test Emp1
WHERE ( n ) = (
                SELECT COUNT( DISTINCT ( Emp2.Employee_Salary ) )
                FROM Employee_Test Emp2
                WHERE Emp2.Employee_Salary >= Emp1.Employee_Salary
            )

在这里,'n'用任何数字替换。例如,如果您必须找到第六高的薪水,则将n替换为6。

SELECT *
FROM Employee_Test Emp1
WHERE (6) = (
SELECT COUNT( DISTINCT ( Emp2.Employee_Salary ) )
FROM Employee_Test Emp2
WHERE Emp2.Employee_Salary >= Emp1.Employee_Salary
)

上面的查询将产生下面的结果。

nth_highest_salary

3.查询的工作方式

如我们所见,该查询涉及内部查询的使用。内部查询可以有两种类型。相关查询和不相关查询。不相关查询是内部查询可以独立于外部查询运行的地方,而相关查询是内部查询与外部查询一起运行的地方。我们的第n高薪是相关查询的一个例子

最好先了解一下内部查询每次都会执行,处理外部查询中的一行。内部查询基本上不做任何非常秘密的工作,它只返回比当前处理行的薪水列高的不同薪水的计数。任何时候,它都会发现外部查询中当前行的薪水列的值等于内部查询中较高薪水的计数,并返回结果。

4.绩效分析

正如我们从上面了解到的那样,每次执行内部查询都会处理一行外部查询,这会带来很多性能开销,特别是在行数太大的情况下。

为了避免这种情况,应该使用特定于数据库的关键字来更快地获得结果。例如在SQL Server中,可以这样使用关键字TOP。

如何在SQL Server中找到第n个最高薪水。

SELECT TOP 1 EMPLOYEE_SALARY
FROM
(
    SELECT DISTINCT TOP N EMPLOYEE_SALARY
    FROM EMPLOYEE_TEST
    ORDER BY EMPLOYEE_SALARY DESC
) A
ORDER BY EMPLOYEE_SALARY
WHERE N > 1

学习愉快!

This entry was posted in   SQL.
Bookmark the   permalink.

saigon has written 1440 articles

Leave a Reply