MYSQL基础

基础语句

distinct:返回唯一不同的值

having:筛选 group by 后的数据(例 having avg(score) > 60)(转化顺序为 where group having)

if:if 语句(例 if('sex'=1,'男','其他') )(不建议使用)

case when:类似 if / else 语句 (例1 case sex     when '1' then '男'     when '2' then '女'     else '其他' end)(例2 case when sex='1' then '男' else '女' end)

concat:将多个字符串连接成一个字符串,返回一个字符串。可以另外加入固定字符(例 concat(str1, str2) )

concat_ws:与上大致相同,另第一个参数指定分隔符(例 concat_ws(separator, str1, str2) )

group_concat:

 

功能实现

行转列:

列转行:

 

排序:order by 后 set @rank= 0; 再 @rank:=@rank+1

 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
set @rank= 0;
select sc_1.sid, sc_1.sum_score, (@rank:=@rank+1) as rank
from (
    select sid, sum(score) as sum_score
    from sc 
    group by sid
    order by sum_score desc
) as sc_1;
排序

分组排序:left join 后 group by

按各科成绩进行排序,并显示排名,Score 重复时合并名次
select sc_1.*, count(*) as rank
from sc as sc_1
left join sc as sc_2
on sc_1.score < sc_2.score and sc_1.cid = sc_2.cid
group by sc_1.sid, sc_1.cid, sc_1.score
order by sc_1.cid, sc_1.score desc;
分组排序

排序主流是 order by 后 set @rank= 0。

分组排序  

  1,order by 后 set @rank= 0

  2,left join 后 group by

在限定前或者后几名的情况下,可以在 where 里比较大小与的个数来判断

查询各科成绩前三名的记录
select *
from sc
where (select count(*) from sc as sc_1 where sc_1.cid=sc.cid and sc_1.score<sc.score) >= 3
order by sc.cid, sc.score desc;
限定个数分组排序

 

 

语句优化

where in 和 join:当 in 内大于1000时选择 join

 

相关/转载:

1,SQL 教程

2,MySQL对时间的处理总结

1,超经典SQL练习题,做完这些你的SQL就过关了 and 50道SQL练习题及答案与详细分析

2,牛客精选数据库SQL实战

3,力扣 (LeetCode) 数据库

posted @ 2021-04-20 15:48  子崖子崖  阅读(52)  评论(0)    收藏  举报