SQL基础(持续完善....)

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 ....

   wherehaving区别:
         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

结果如下:

 

 

持续完善.... 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值