一、实验目的:
各种排序问题的综合应用
二、实验内容:
对MYSQL基础上机练习题(二)中所输入的数据进行
1.排名:不重复排位排名、同值同位不占位排名、同值同位占位排名
2.组内前N名
三、题目:
1.对全部员工根据薪酬水平进行排序
(1)薪酬水平相同时,按照姓名排序
(2)薪酬水平相同时,排位相同,但不占位排序
(3)薪酬水平相同时,排位相同且占位排序
2.查询每一个部门排名前三的工作年限
3.查询每一个部门的排名前三的工薪水平(不同员工同一薪资,只显示一位)
四、内容:
1.对全部员工根据薪酬水平进行从高到低排序
拿数组(56,56,67,67,67,78,79,80)来说,可以形成三种排列:
(1)即使值相同,也会不会排在同一位:(1,2,3,4,5,6,7,8,)
(2)值相同的在同一位,但不占位:(1,1,2,2,2,3,4,5)
(3)值相同的在同一位,但占位:(1,1,3,3,3,6,7,8)
(1)薪酬水平相同时,按照员工工号排序
Select
EmployeeID,
InCome,
@rowNum := @rowNum+1 AS Rank
FROM (SELECT @rowNum := 0)r,
Salary
ORDER BY InCome DESC
这里的@rowNum 是自定义的一个变量,@rowNum := @rowNum+1 代表一个首项为0,等差为1的自增列r,每查询到一个InCome(即薪水),就会@rowNum这个变量就会递增1,放到r这个自增列中。
也可以简单地把(SELECT @rowNum := 0)r看成是一个新的表,整体的查询相当于在Salary这个原来的表与新的r表进行复合表查询
但使用这种方法,在遇到薪酬水平相同时,会出现排位不相同的现象
如图中第一名与第二名的薪水相同但排名不一致
(2)薪酬水平相同时,排位相同,但不占位排序
当需要对相同值进行相同排序时,可以使用多一个变量来使得相同薪酬水平的人排位是一致的
SELECT
EmployeeID,
InCome,
@rowNum := @rowNum + (@prev <> (@prev := InCome)) Rank
FROM
Salary,
(SELECT