zoukankan      html  css  js  c++  java
  • 【《SQL进阶教程》】1-1 CASE表达式

    一、CASE表达式:

    用来描述条件分支;

    --简单CASE表达式:
    CASE sex
    	WHEN '1' THEN '男'
    	WHEN '2' THEN '女'
    ELSE '其他' END
    
    --搜索CASE表达式:
    CASE WHEN sex = '1' THEN '男'
    	 WHEN sex = '2' THEN '女'
    ELSE '其他' END
    

    注意事项:

    1. 各分支返回的数据类型必须统一;
    2. 必须要写END;
    3. 一般也必须写ELSE;
    4. 搜索CASE表达式的表达能力远大于简单表达式,一般都会使用前者。

    一)、在聚合函数中使用CASE:

    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_f
    	FROM PopTbl2
       GROUP BY pref_name;
    

    ​ 上面的SQL语句就可以将一个列为[pref_name(县名), sex, population]的表转换成一个列为[县名, 男, 女]的表。这样的表就类似我们在Excel等软件中见到的表,也就是 二维表

    二)、在CASE语句中使用CHECK约束:

    CHECK 约束用于限制列中的值的范围。

    如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

    如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    三)、在UPDATE语句里进行条件分支:

    ​ 使用多个UPDATE语句可能造成冲突,不利于保持原子性。

    --为工资高于300000的员工降薪
    UPDATE Salaries
       SET salary = salary * 0.9
     WHERE salary >= 300000;
    
    --为工资高于250000但低于280000的员工加薪
    UPDATE Salaries
       SET salary = salary * 1.2
     WHERE salary >= 250000 AND salary < 280000;
    
     --使用CASE来进行更新
     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;
    

    如上面的示例,如果有员工工资高于300000,被降薪后正好处于加薪区间,最后的结果反而是他被加薪了。

    四)、表之间的数据匹配:

    ​ 可以借助BETWEEN、LIKE、<、>、IN等谓词组合增强CASE语句的表达能力。

    五)、在CASE表达式中使用聚合函数:

    ​ 在CASE表达式中使用聚合函数可以增强CASE语句的表达能力。

    小结:

    • 新手用HAVING子句进行条件分支,高手用SELECT子句进行条件分支。

    • CASE在SQL中被视为表达式,在执行时会被判定为一个固定值,因此它也可以被写在聚合函数内部。相比较过程式编程语言中的条件判断语句,SQL中的CASE更类似于Lisp、Scheme等函数式语言中的条件表达式。

  • 相关阅读:
    VC++实现感染文件式加载DLL文件
    vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
    VC++另类实现进程插入
    云服务系列:Windows Azure SDK for .NET(2012 年 6 月发布的版本)的最新消息
    VC++1.5K字节实现下载并远程注入
    上海求职指南 (最新版)
    WinAPI: GetWindowText 获取窗口标题
    WinAPI: SetCursorPos 设置鼠标指针位置
    WinAPI: SetComputerName 更改计算机名称
    GDI+ 学习记录(31): 图像颜色变换(TGPImageAttributes)
  • 原文地址:https://www.cnblogs.com/enmac/p/13069781.html
Copyright © 2011-2022 走看看