MYSQL基础上机练习题(六) 排序问题综合应用

一、实验目的:

各种排序问题的综合应用

二、实验内容:

对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表进行复合表查询
但使用这种方法,在遇到薪酬水平相同时,会出现排位不相同的现象
Mysql排序

如图中第一名与第二名的薪水相同但排名不一致

(2)薪酬水平相同时,排位相同,但不占位排序

当需要对相同值进行相同排序时,可以使用多一个变量来使得相同薪酬水平的人排位是一致的

SELECT
  EmployeeID,
  InCome,
  @rowNum := @rowNum + (@prev <> (@prev := InCome)) Rank
FROM
  Salary,
  (SELECT 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值