此篇文章,主要总结中级阶段的SQL高级用法,通过普通的技术不同侧面的阐述,让技术渣渣的我感受到了SQL牛逼的一面(呜呜呜~~)
一、CASE表达式
1、CASE 表达式又称条件分支,case类似于1+1的表达式,凡是能写常量和列的位置都可以写 case表达式,case表达式功能强大,书写位置灵活。
2、将已有编号方式转换为新的方式并统计
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 语句进行不同条件的统计
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表达式具有非常强大的表达能力。
例如:如下两张表
得到如下结果:
代码实现:
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 表达式中使用聚合函数
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飞起来