部分概念: 1、在資料庫中產生數據不一致的根本原因是冗餘 2、一個事務對某數據加S鎖後,其它的事務不能對該數據加任何類型的鎖(錯誤):所謂S鎖,是事務T對數據A加上S鎖時,其他事務只能再對數據A加S鎖,而不能加X鎖,直到T釋放A上的S鎖 3、一個資料庫只有一個模式和一個內模式 4、使某個事務永遠處於 ...
MySQL開窗函數
知識點
三種開窗函數:row_number(),rank(),dense_rank() 這三種函數都是用於返回結果集的分組內每行的排名
區別:
row_number():特點是唯一且連續,如果四個人是按成績排名,那麼是1234這樣排的,即使有重分的人
rank(): 特點是併列不連續,如果四個人是按成績排名,那麼是1224這樣排的,重分的人是同一個排名,且占一個排名的位置,排名不連續
dense_rank():特點是併列且連續,如果四個人是按成績排名,那麼是1223這樣排的,重分的人是同一個排名,共占一個排名,排名連續
示例
# 三種排序函數: row_number() rank() dense_rank()
# 數據準備
create table employee (
empid int,ename varchar(20) ,deptid varchar(10) ,salary decimal(10,2)
);
insert into employee values(1,'劉備','蜀',5500.00);
insert into employee values(2,'趙雲','蜀',4500.00);
insert into employee values(3,'張飛','蜀',3500.00);
insert into employee values(4,'關羽','蜀',4500.00);
insert into employee values(5,'曹操','魏',1900.00);
insert into employee values(6,'許褚','魏',4800.00);
insert into employee values(7,'張遼','魏',6500.00);
insert into employee values(8,'徐晃','魏',14500.00);
insert into employee values(9,'孫權','吳',44500.00);
insert into employee values(10,'周瑜','吳',6500.00);
insert into employee values(11,'陸遜','吳',7500.00);
# 需求一: 使用三種排序函數對employee表中員工按照薪資進行降序排名:
select *,row_number() over (order by salary desc) as rank1,rank() over (order by salary desc)as rank2,dense_rank() over (order by salary desc)as rank3 from employee;
# 需求二: 對employee表中按照deptid進行分組,並對每一組的員工按照薪資進行降序排名:
select *,row_number() over (partition by deptid order by salary desc) as rank1,rank() over (partition by deptid order by salary desc)as rank2,dense_rank() over (partition by deptid order by salary desc)as rank3 from employee;
#開窗函數經常用於解決TOP N問題