sql中dql查询语句

发布时间 2023-09-09 17:33:17作者: 麦田里好好看

最简单的就是 select *  from  表名  where <查询条件> group by <分组字段> having  <分组后筛选条件> order by 排序字段 limit 查询起始行号,查询数量。

今天新学了个 开窗函数/分析函数 

  1.常见的能够作为开窗函数的聚合函数(sum,avg,count,max,min)

  2.rank,dense_rank,row_number 等专用开窗函数。

直接写sql语句

create table sc
(
sid varchar(10) null comment '学生id',
cid varchar(10) null comment '课程id',
score decimal(18, 1) null comment '分数'
)
comment '分数表';
 
# 比如说前二名的分数都是100,第三名分数是99
-- rank():用于计算指定列的排名。生成的序号可能重复, 则排序就是 1 1 3...
select cid, score, rank() over (partition by cid order by score desc ) ‘序号’ from sc ;
-- row_number():用于给结果集中的每一行分配一个唯一的行号。生成的序号不重复,则排序就是 1 2 3 ...
select cid, score ,row_number( ) over(partition by cid order by score desc ) '序号' from sc;
-- dense_rank:在生成序号时是连续的。生成的序号可能重复但是不会断,则排序是 1 1 2 ...
select cid, score, dense_rank() over ( partition by cid order by score desc ) '序号' from sc;

-- 三者的应用,个人拙见,比如说要求分数最高的前3个分数则可以用 rank() ,毕竟最高的3个分数固定死了,查询前3名学生就可以直接用row_number 毕竟只需要3个学生就行了
-- 但是如果有10个人都是100分这前3名就不公平了,要找出分数前3的所有学生 这时候用 dense_rank ()
 
数据库所有数据:


-- 这个就很奇怪了,如果前2名分数一样则第三个人的序号就3,但是如果前2名分数一样,3,4名分数一样则前面4个人的序号分别为1 1 3 3 第5个人的序号就从5开始
select * from (select cid,score , rank() over (partition by cid order by score desc ) ‘序号’ from sc) t1 where ‘序号’ <=3;
 


-- 找出每科分数前三的学生(3科 只能找出9个人)
select * from (select cid ,score ,row_number( ) over(partition by cid order by score desc ) '序号' from sc) t1 where 序号 <=3;


-- 下面是前三的分数的所有学生(比如说前三的分数为100,99,98 找出分数符合的所有学生)
select * from (select cid, score, dense_rank() over ( partition by cid order by score desc ) '序号' from sc) t1 where 序号<=3;