【SQL进阶MICK读书笔记】

 此篇文章,主要总结中级阶段的SQL高级用法,通过普通的技术不同侧面的阐述,让技术渣渣的我感受到了SQL牛逼的一面(呜呜呜~~)

一、CASE表达式  

1、CASE  表达式又称条件分支,case类似于1+1的表达式,凡是能写常量和列的位置都可以写 case表达式,case表达式功能强大,书写位置灵活。

2、将已有编号方式转换为新的方式并统计

《【SQL进阶MICK读书笔记】》

《【SQL进阶MICK读书笔记】》
《【SQL进阶MICK读书笔记】》

 1 SELECT CASE pref_name
 2 WHEN  ' 德岛 ' THEN  ' 四国 '
 3 WHEN  ' 香川 ' THEN  ' 四国 '
 4 WHEN  ' 爱媛 ' THEN  ' 四国 '
 5 WHEN  ' 高知 ' THEN  ' 四国 '
 6 WHEN  ' 福冈 ' THEN  ' 九州 '
 7 WHEN  ' 佐贺 ' THEN  ' 九州 '
 8 WHEN  ' 长崎 ' THEN  ' 九州 '
 9 ELSE  ' 其他 ' END AS district,
10 SUM(population)
11 FROM PopTbl
12 GROUP BY CASE pref_name
13 WHEN  ' 德岛 ' THEN  ' 四国 '
14 WHEN  ' 香川 ' THEN  ' 四国 '
15 WHEN  ' 爱媛 ' THEN  ' 四国 '
16 WHEN  ' 高知 ' THEN  ' 四国 '
17 WHEN  ' 福冈 ' THEN  ' 九州 '
18 WHEN  ' 佐贺 ' THEN  ' 九州 '
19 WHEN  ' 长崎 ' THEN  ' 九州 '
20 ELSE  ' 其他 ' END;

View Code

 

 3、用一条 SQL 语句进行不同条件的统计

《【SQL进阶MICK读书笔记】》

《【SQL进阶MICK读书笔记】》
《【SQL进阶MICK读书笔记】》

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;

View Code

 

4、表之间的数据匹配

在 CASE 表达式里,我们可以使用 BETWEEN 、 LIKE 和 <、 > 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。因此, CASE表达式具有非常强大的表达能力。

例如:如下两张表

《【SQL进阶MICK读书笔记】》

得到如下结果:

《【SQL进阶MICK读书笔记】》

 

代码实现:

《【SQL进阶MICK读书笔记】》
《【SQL进阶MICK读书笔记】》

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

View Code

这样的查询没有进行聚合,因此也不需要排序,月份增加的时候仅修改 SELECT 子句就可以了,扩展性比较好。

 

5在 CASE 表达式中使用聚合函数

《【SQL进阶MICK读书笔记】》

StudentClub 所示,这张表的主键是“学号、社团 ID”,存储了学生和社团之间多对多的关系

接下来,我们按照下面的条件查询这张表里的数据。
1. 获取只加入了一个社团的学生的社团 ID。
2. 获取加入了多个社团的学生的主社团 ID。

代码方法一

-- 条件 1 :选择只加入了一个社团的学生
SELECT std_id, MAX(club_id) AS main_club
FROM StudentClub
GROUP BY std_id
HAVING COUNT(*) = 1;
--2:选择加入多社团的学生的主社团ID

SELECT std_id, club_id AS main_club FROM StudentClub WHERE main_club_flg = ' Y ' ;

代码方法二

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 main_club
FROM StudentClub
GROUP BY std_id;

 

三、自连接的用法

 

三值逻辑和NULL

HAVING子句的力量

外连接的用法

用关联子查询比较行与行

用SQL进行集合运算

EXISTS谓词的用法

用SQL处理数列

HAVING子句又回来了

让SQL飞起来

 

    原文作者:wangjc2008
    原文地址: https://www.cnblogs.com/wangjc2008/p/9623814.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞