SQL进阶教程(一)——CASE表达式

SQL进阶教程之CASE表达式

在掌握了基础的标准SQL语法后,可做一些简单的SQL练习题加深记忆和巩固基础知识。然而,SQL基础教程仅仅是帮助零基础的同学入门,要想在面试或工作中用好SQL,需进一步学习进阶教程,从而从初级迈向中级。在这个阶段我参考的书仍然是MICK先生所著的==《SQL进阶教程》==,这本书主要以案例为主,通过不同的案例帮助读者快速了解不同情况下SQL语句的使用策略,对于时间比较紧张想要快速提高的同学非常适合。关于CASE表达式的应用本文从以下几个方面进行介绍:

  1. 使用CASE表达式时需注意的点
  2. CASE表达式的具体应用场景

CASE表达式:

CASE  WHEN  <表达式>   THEN  <表达式>  
      ELSE   <表达式>
      END

1.使用CASE表达式需注意的点

  1. 各个分支<表达式>返回的数据类型要统一;
  2. CASE写完后不能丢了END
  3. ELSE可省略但不建议省,没有值时可写 ELSE NULL。

2.CASE表达式应用的具体场景

CASE表达式的六种不同应用场景

(1)行列转换

行列转换是将行所展现的结果转到列中进行展示。
在这里插入图片描述

SELECT pref_name,  
               SUM(CASE WHEN sex = '1'  THEN population ELSE 0 END) AS cnt_m  --男性人口
               SUM(CASE WHEN sex = '2'  THEN population ELSE 0 END) AS cnt_m  --女性人口
FROM <表名>
GROUP BY pref_name;

(2)已有数据重分组

在这里插入图片描述

SELECT CASE pref_name
            WHEN '德岛' THEN '四国'
            WHEN '香川' THEN '四国'
            WHEN '爱媛' THEN '四国'
            WHEN '高知' THEN '四国'
            WHEN '福冈' THEN '九州'
            WHEN '佐贺' THEN '九州'
            WHEN '长崎' THEN '九州'
        ELSE '其他' END AS district,
 SUM(population)
FROM PopTbl
GROUP BY CASE pref_name
           WHEN '德岛' THEN '四国'
           WHEN '香川' THEN '四国'
           WHEN '爱媛' THEN '四国'
           WHEN '高知' THEN '四国'
           WHEN '福冈' THEN '九州'
           WHEN '佐贺' THEN '九州'
           WHEN '长崎' THEN '九州'
        ELSE '其他' END;

注:PostgreSQL & MySQL中可将GROUP BY 子句替换为别名,即GROUP BY district;其他数据库不可。

(3)与约束的结合使用

这类主要针对“蕴含式”的问题,比如女性的工作时长不能超过8小时,先要判断员工是否为女性,其次判断工作市场是否为8小时,这里要注意和逻辑与进行区分。

CONSTRAINT check_worktime CHECK
          ( CASE WHEN sex = '2'
                 THEN CASE WHEN worktime <= 8
                 THEN 1 ELSE 0 END
            ELSE 1 END = 1 )

(4)在UPDATE语句里的条件分支

这类主要用于同时更新多个值的情况。
在这里插入图片描述

UPDATE Salaries SET salary = CASE
       WHEN salary >= 300000 THEN salary*0.9
       WHEN salary >= 250000 AND salary <= 280000 THEN salary*1.2
       ELSE salary END;

(5)表之间的数据匹配

主要用于产生交叉表。即下图中由(1)(2)得到(3)。
(1) (2) (3)
使用IN的情况

SELECT course_name, 
       CASE WHEN course_id IN (SELECT course_id FROM OpenCourses WHERE month = 200706) 
            THEN 'O'ELSE 'x' END AS "6月",
       CASE WHEN course_id IN (SELECT course_id FROM OpenCourses WHERE month = 200707)
            THEN 'O'ELSE 'x' END AS "7月",
       CASE WHEN course_id IN (SELECT course_id FROM OpenCourses WHERE month = 200708) 
       THEN 'O'ELSE 'x' END AS "8月"
 FROM CourseMaster;

使用EXISTS的情况

SELECT CM.course_name,
             CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                     WHERE month = 200706
                     AND OC.course_id = CM.course_id) THEN '○'
             ELSE '×' END AS "6 月",
             CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                    WHERE month = 200707
                    AND OC.course_id = CM.course_id) THEN '○'
             ELSE '×' END AS "7 月",
             CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                    WHERE month = 200708
                    AND OC.course_id = CM.course_id) THEN '○'
             ELSE '×' END AS "8 月"
FROM CourseMaster CM;

(6)针对聚合结果的条件分支

在这里插入图片描述
要求:01获取只加入了一个社团的学生的社团 ID;02. 获取加入了多个社团的学生的主社团 ID。

扫描二维码关注公众号,回复: 11011342 查看本文章
SELECT std_id, 
       CASE WHEN COUNT(*)=1 
            THEN MAX(club_id) 
       ELSE MAX(CASE WHEN main_club_flg='Y'
                     THEN club_id ELSE NULL END) END AS mian_club 
FROM StudentClub 
GROUP BY std_id;

以上就是CASE表达式可应用的具体场景。各类场景的案例均来源于《SQL进阶教程》。1


  1. 《SQL进阶教程》,[日] MICK/著,吴炎昌/译 ↩︎

发布了19 篇原创文章 · 获赞 17 · 访问量 1470

猜你喜欢

转载自blog.csdn.net/weixin_43839651/article/details/103647919