1.一些基础的sql语句操作啥的:
2.SQL语句的执行顺序
[StandEx]:
select distinct...from t1 (left/right) join t2 on t1.xx=t2.xx where t1.xx=? and t2.xx=? group by t1.xx having ...order by ... limit ..
A:where: 筛选条件 分组之前
having: 筛选条件 前提:必然先分组 对分组后的结果再次筛选
where,group by,having三者同时出现,则顺序一定为:
where....group by ... having ....
where 和having区别:
where是在分组之前进行数据筛选,having是对分组后的结果再次筛选
where,group by,having若同时出现,则三者的顺序一定是
where在 group by之前,having在group by之后
B:limit用法:
limit m,n 从索引m处开始,筛选n条件数据 -- 实现分页
limit m 从第一条数据开始,筛选前m条
C:各关键字执行顺序:
1. from join 产生虚拟表v1 - 产生的是笛卡尔积
笛卡尔积:两表完全连接的结果叫做笛卡尔积,会产生m*n条数据
2. on 根据连接条件进行筛选,基于V1,产生虚拟表v2
3. left/right join 若是外连接,将主表中的所有数据进行补充到v2表中
4. where 根据查询条件,从v2中进行数据筛选,产生虚拟表v3
5. group by 对v3分组,产生虚拟表v4
经常会和聚合函数配合使用,聚合函数的结果在group by之后就会产生
使用场景: 统计每个班级的学生人数
select count(xx) ....group by bj_id
统计每个部门的人数
select count(xx) ... group by d.id
6. having 对分组后的结果再次筛选 ,产生虚拟表v5
7. select 选择最终要显示的字段,产生虚拟表v6
8. distinct 对结果集进行去重,产生虚拟表v7
9. order by 对结果根据某字段进行升序/降序排列
10. limit 选择需要的数据
3.case when
类比与java中的if..else
格式:
case when exp then ..
when exp1 then...
when exp2 then...
else....end
[Ex1]:在成绩表 col: name course score 显示出每个学生分数处于哪个级别(>=90 优秀 >=80 良好 >=70 中等 >=60 及格 <60 不及格 )
要求:查询每个学生的成绩,并显示级别: name course score level
SQL语句: select name,course,score,
(case when score>=90 then '优秀'
when score>=80 then '良好'
when score>=70 then '中等'
when score>=60 then '及格'
ELSE '不及格' end)level
from score
case when经常和聚合函数配合使用.
要求:统计出每个学生及格和不及格的科目数
SQL语句: select name,
sum(case when score>=60 then 1 else 0 end)'及格科目数',
sum(case when score<60 then 1 else 0 end)'不及格科目数'
from score group by name
(select name,
count(case when score>=60 then 1 end)'及格科目数',
count(case when score<60 then 1 end)'不及格科目数'
from score group by name)
PS:case when 和sum()和count()使用时,用法不同(意义不同)
sum()配合使用,满足条件返回1,表示进行+1 else 0表示+0
count()配合使用,返回的值只要不是null,就进行一次计数,所以使用count()必须注意:若满足条件想进行一次计数,不满足条件不计数,应写成:
count(case when ....then 1 else null end)
或 count(case when ...then 1 end) 没有else,表示不满足条件,返回null.
[Ex2]下表中,按照右侧的结果格式写出生成右侧结果的SQL语句:
SQL语句:select match_date '比赛日期',
sum(case when result='胜' then 1 else 0 end)'胜',
sum(case when result='负' then 1 else 0 end)'负'
from match_record group by match_date
结果如下:
持续完善....