【MySQL】MySQL進階教程學習筆記1
阿新 • • 發佈:2021-01-14
CASE表示式概述
-
CASE表示式的寫法
CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END
-
case 表示式的真假判斷在發現為真的when 子句時,CASE表示式的真假值判斷就會終止,剩餘的when子句會被忽略。
-
因此,在使用when子句時需要注意條件的【排他性】
用一條SQL語句進行不同條件的統計
-
進行不同條件的統計是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;
用CHECK 約束定義多個列的條件關係
-
蘊含式與邏輯與
P^Q 要想讓邏輯與為真,需要兩個命題均為真,或者一個為真,另一個未知
P >> Q要想讓蘊含式為真,則需要兩個命題均為真,或者P為假,或者P無法判斷真假
-
相比而言,蘊含式的約束較為寬鬆
在Update 語句中進行條件分支
/* 用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;
- 調換主鍵值a,b
/* 用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');
表之間的資料匹配
- CASE 表示式的一大優勢,是能夠判斷表示式
- 在CASE表示式裡,可以使用between 、like 、<、 > 等便利的謂詞組合,以及能巢狀子查詢的in和exists謂詞。因此,CASE表示式具有非常強大的表達能力。
- 現在需要用這兩張表來生成交叉表,以便於一目瞭然的知道每個月開設的課程
/* 表的匹配:使用IN謂詞 */
SELECT CM.course_name,
CASE WHEN CM.course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200706) THEN '○'
ELSE '×' END AS "6月",
CASE WHEN CM.course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200707) THEN '○'
ELSE '×' END AS "7月",
CASE WHEN CM.course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200708) THEN '○'
ELSE '×' END AS "8月"
FROM CourseMaster CM;
/* 表的匹配:使用EXISTS謂詞 */
SELECT CM.course_name,
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200706
AND CM.course_id = OC.course_id) THEN '○'
ELSE '×' END AS "6月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200707
AND CM.course_id = OC.course_id) THEN '○'
ELSE '×' END AS "7月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200708
AND CM.course_id = OC.course_id) THEN '○'
ELSE '×' END AS "8月"
FROM CourseMaster CM;
- 從效能方面來說,exists表現更好。通過exists進行的子查詢能夠用到’month,course_id’這樣的主鍵索引,尤其在表opencourses裡的資料較多時更有優勢!