1. 程式人生 > 資料庫 >【MySQL】MySQL進階教程學習筆記1

【MySQL】MySQL進階教程學習筆記1

CASE表示式概述

  • CASE表示式的寫法

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-f3aqt3QB-1610553058104)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113231315336.png)]

    CASE WHEN sex = '1' THEN '男'
    	 WHEN sex = '2' THEN '女'
    ELSE '其他' END
    
  • case 表示式的真假判斷在發現為真的when 子句時,CASE表示式的真假值判斷就會終止,剩餘的when子句會被忽略。

  • 因此,在使用when子句時需要注意條件的【排他性】

用一條SQL語句進行不同條件的統計

  • 進行不同條件的統計是CASE表示式的著名用法之一

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-3gciWfYp-1610553058107)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113231333037.png)]

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 語句中進行條件分支

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-K71mSzlK-1610553058108)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113233315777.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-kEZJ38zz-1610553058109)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113233323811.png)]

/* 用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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-fbtg2cRN-1610553058109)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113233648146.png)]

/* 用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表示式具有非常強大的表達能力。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1m4opIO9-1610553058110)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113233954677.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1RCScBJC-1610553058111)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113234001861.png)]

  • 現在需要用這兩張表來生成交叉表,以便於一目瞭然的知道每個月開設的課程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2lR4anf3-1610553058112)(C:\Users\child\AppData\Roaming\Typora\typora-user-images\image-20210113234127724.png)]

/* 表的匹配:使用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裡的資料較多時更有優勢!