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表达式应用的具体场景

(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_nameWHEN '德岛' 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_nameWHEN '德岛' 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 <= 8THEN 1 ELSE 0 ENDELSE 1 END = 1 )

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

这类主要用于同时更新多个值的情况。

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

(5)表之间的数据匹配

主要用于产生交叉表。即下图中由(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 OCWHERE month = 200706AND OC.course_id = CM.course_id) THEN '○'ELSE '×' END AS "6 月",CASE WHEN EXISTS(SELECT course_id FROM OpenCourses OCWHERE month = 200707AND OC.course_id = CM.course_id) THEN '○'ELSE '×' END AS "7 月",CASE WHEN EXISTS(SELECT course_id FROM OpenCourses OCWHERE month = 200708AND OC.course_id = CM.course_id) THEN '○'ELSE '×' END AS "8 月"
FROM CourseMaster CM;

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


要求:01获取只加入了一个社团的学生的社团 ID;02. 获取加入了多个社团的学生的主社团 ID。

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/著,吴炎昌/译 ↩︎

SQL进阶教程(一)——CASE表达式相关推荐

  1. 【SQL进阶教程】第一章 case表达式

    本系列基于<SQL进阶教程>(如下图)学习,实现了书中代码及练习题代码.PS:电子书请大家各自默默脚本之家. [知识点1]case表达式概述 Case表达式有简单case表达式和搜索cas ...

  2. SQL进阶教程—CASE表达式

    所有的文件在SQL进阶教程 (ituring.com.cn),随书下载那里 概述 文章原址 基本写法 简单CASE表达式 SELECT CASE 列名称WHEN 匹配字符 THEN 转换字符WHEN ...

  3. SQL进阶教程—自链接的用法

    用法 https://moonshuo.cn/posts/14085.html 可重排列,排列,组合 需求:现在我需要将这个水果的品种各个组合起来,构成一个有序对的组合 在这个过程中首先执行完毕fro ...

  4. 【SQL学习笔记】《SQL进阶教程》1.1

    SQL进阶教程学习笔记1.1 1-1case 表达式 将已有编号方式转换为新的方式并统计 SELECT CASE pref_nameWHEN '辽宁' THEN '东北'WHEN '福建' THEN ...

  5. 【SAP Hana】X档案:SAP HANA SQL 进阶教程

    SAP HANA SQL 进阶教程 5.HANA SQL 进阶教程 (1)Databases (2)User & Role (3)Schemas (4)Tables (5)Table Inde ...

  6. 读SQL进阶教程笔记14_SQL编程要点

    1. 消灭NULL 1.1. NULL惹人讨厌的原因 1.1.1. 进行SQL编码时,必须考虑违反人类直觉的三值逻辑 1.1.2. 指定IS NULL.IS NOT NULL的时候,不会用到索引,SQ ...

  7. SQL进阶教程——用SQL进行集合运算(第七章)

    1. 前言 集合论是SQL语言的根基--这是贯穿全书主题之一.因为他的这个特性,SQL也被称为面向集合语言.只有从集合的角度思考,才能明白SQL的强大. 但是,实际上这一点长期以来都被很多人忽略了.造 ...

  8. SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师

    目录 第一部分:基础--增删查改 [第一章]做好准备 Getting Started (时长25分钟) [第二章]在单一表格中检索数据 Retrieving Data From a Single Ta ...

  9. SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师(5)

    [十二章]数据类型 介绍 MySQL的数据分为以下几个大类: String Types 字符串类型 Numeric Types 数字类型 Date and Time Types 日期和时间类型 Blo ...

  10. 【SQL学习笔记】《SQL进阶教程》1.2

    1-2自连接的用法 自连接+非等值连接 自连接+GROUP BY = 递归集合 表是行的集合,面向集合 开销较大 唯二重要的方法 CASE 自连接 SQL语言 : 面向集合的特性 可重排列.排列.组合 ...

最新文章

  1. python 文案自动生成_Python自动化测试如何自动生成测试用例?
  2. 遵义春季招生计算机学校,遵义计算机学校招生
  3. 投入 20 亿,赋能 1 万家,阿里云正式启动云原生合作伙伴计划
  4. 企业计算机能力,以IT企业需求为导向的计算机人才培养模式研究
  5. OpenLdap+MySQL笔记
  6. 不信不能雷倒你!超牛高考作文
  7. git push origin master 出错
  8. 学习笔记(04):MySQL数据库运维与管理-02-二进制日志及其管理
  9. Java 初始化 代码块_Java中初始化块详解及实例代码
  10. c++ map的存储结构_深度解密Go语言之sync.map
  11. macOS Catalina10.15.4安装HP Laser Jet1020打印机驱动方法
  12. 单片机的串口实验 串口介绍 串口原理
  13. homeassistant搭建_智能家居 篇二:Home Assistant简易智能家居环境搭建
  14. 怎么做阿里巴巴国际站的测评?需要哪些技术?
  15. 湖南任务书 数据库服务渗透测试
  16. Springboot中国古代史在线学习网站 毕业设计-附源码260839
  17. 查询递归表SQL,分类表查询,递归表数据结构转平级查询优化SQL
  18. 2念整数(5分) 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
  19. Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
  20. 51单片机的温湿度控制系统

热门文章

  1. openpyxl安装_Openpyxl玩转Excel(一)——新建、读取、复制
  2. calabash android教程,Calabash Android 使用教程 (二)
  3. linux下配置tomcat(详细)
  4. 计算机用户系统软件,计算机软件系统
  5. JAVA集合系列(4):关于数组复制的几种方法(源码解读)及执行效率,我们知多少?
  6. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)...
  7. http之httpClient工具类
  8. tp框架引入第三方sdk的经验总结
  9. java中switch、while、do...while、for
  10. UIFont 设置字体