1神奇的 SQL
1-1 case表达式
CASE 表达式有简单 CASE 表达式 (simple case expression)和搜索 CASE 表达式(searched case expression)
两种
— 简单 CASE 表达式
CASE sex
WHEN ‘1’ THEN ‘男’
WHEN ‘2’ THEN ‘女’
ELSE ‘其他’
END
— 搜索 CASE 表达式
CASE
WHEN sex = ‘1’ THEN ‘男’
WHEN sex = ‘2’ THEN ‘女’
ELSE ‘其他’
END
在发现为真的 WHEN 子句时, CASE 表达式的真假值判断就会中止,而剩余的 WHEN 子句会被忽略。为了 避免引起不必要的混乱,使用 WHEN 子句时要注意条件的排他性。
注意事项 1:统一各分支返回的数据类型
注意事项 2:不要忘了写 END
注意事项 3:养成写 ELSE 子句的习惯
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;
新手用 WHERE 子句进行条件分支,高手用 SELECT 子句进行条件 分支。
用 CHECK 约束定义多个列的条件关系
CONSTRAINT check_salary CHECK
( CASE WHEN sex = ‘2’
THEN CASE WHEN salary <= 200000 THEN 1 ELSE 0 END
ELSE 1 END = 1 )
蕴含式和逻辑与(logical product)的区别。逻 辑与也是一个逻辑表达式,意思是“P 且 Q”,记作 P ∧ Q。
— 用 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;
— 用 CASE 表达式调换主键值 UPDATE SomeTable
SET p_key = CASE WHEN p_key = ‘a’ THEN ‘b’
WHEN p_key = ‘b’ THEN ‘a’
ELSE p_key END
WHERE p_key IN (‘a’, ‘b’);
表之间的数据匹配
与 DECODE 函数等相比,CASE 表达式的一大优势在于能够判断表达式。 也就是说,在 CASE 表达式里,我们可以使用 BETWEEN、LIKE 和 <、 > 等 便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。因此,CASE 表达式具有非常强大的表达能力。
— 表的匹配 :使用 IN 谓词 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;
— 表的匹配 :使用 EXISTS 谓词 SELECT CM.course_name,
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200706
…
在 CASE 表达式中使用聚合函数
— 条件 1 :选择只加入了一个社团的学生
SELECT std_id, MAX(club_id) AS main_club
FROM StudentClub GROUP BY std_id
HAVING COUNT(*) = 1;
— 条件 2 :选择加入了多个社团的学生
SELECT std_id, club_id AS main_club
FROM StudentClub
WHERE main_club_flg = ‘Y’ ;
1- 2 面向集合语言 SQL
自连接的用法
SQL 的连接运算根据其特征的不同,有着不同的名称,如内连接、外 连接、交叉连接等。一般来说,这些连接大都是以不同的表或视图为对象 进行的,但针对相同的表或相同的视图的连接也并没有被禁止。针对相同 的表进行的连接被称为“自连接”(self join)。