mysql迫切连接_SQL水平迫切进阶
前言中按慣例測試了是否適合做此書的讀者。
我們來做一個測試,幫助大家了解一下自己處于何種水平。下面有10 個問題,請回答 Yes 或No。
1. 沒有在聚合函數中使用過 CASE 表達式。
2. 想象不出自連接是如何工作的。
3. 感覺 HAVING 子句不是很常用。
4. 感覺 IN 比 EXISTS 好用,所以更喜歡用 IN。
5. 聽到布爾類型,腦海里浮現出的只有 true 和 false。
6. 設計表的時候不加 NOT NULL 的約束。
7. SQL 全部用大寫字母或全部用小寫字母來寫。
8. 不能用一句話說出 GROUP BY 和 PARTITION BY 的區別。
9. 不知道 SQL 里的高階函數的名字。
10. 試著讀過 Joe Celko的《SQL 權威指南》 A 和《SQL 解惑(第 2版)》B,但是感覺太難而沒能讀 完(或者壓根兒沒有讀過)。
然后我感覺自己被唬住了。
跳過目錄,直接開始。首先是CASE表達式,SQL-92標準里面加入的特性。
CASE表達式的寫法:
-- 簡單 CASE 表達式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- 搜索 CASE 表達式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
使用CASE表達式的好處就是相較于DECODE函數(oracle)和IF(mysql),語法通用,方便移植。注意上面的關鍵字不要漏寫,例如習慣寫ELSE(自己不寫,那默認會當做ELSE NULL),記得寫END。
SELECT語句中使用CASE表達式,一般在GROUP BY中也要寫同樣的內容。但MYSQL和PostgreSQL中可以在GOURP BY中用SELECT中CASE表達式的別名。
CASE表達式和CHECK約束,這段看得我云里霧里。主要的優勢還是,若使用CASE表達式來完成條件分支,比較符合人類語言。而且可以涵蓋得比較全面的情況。(原文的例子是反映作者國家的社會現狀嗎?)但是本人也沒有用CHECK的需求,先跳過。
跟著介紹CASE語句于UPDATE中用作條件分支。好處是語句執行一次就可以根據各種情況來更新。更方便,速度更快(這里需要親身經歷才能體會)。不需要考慮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;
這里想象一下,如果ELSE漏寫了,那這個表不涵蓋在CASE表達式條件中的salary值就會被置為NULL。在生產環境干這事就精彩了。
這里還舉了兩個主鍵值'a'、'b'調換的例子,老套的a換為c -> b換為a -> c換為b三個update語句要執行三次,現在可以一次性完成,寫CASE。
-- 用 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');
做交叉表,在WHEN條件中寫IN或EXISTS,也是容易得很。
“”與 DECODE 函數等相比,CASE 表達式的一大優勢在于能夠判斷表達式。
也就是說,在 CASE 表達式里,我們可以使用 BETWEEN、LIKE 和 等
便利的謂詞組合,以及能嵌套子查詢的 IN 和 EXISTS 謂詞。因此,CASE
表達式具有非常強大的表達能力。
“”
反正CASE表達式可以玩得很復雜,可以將需要多步驟的查詢一次搞定。
書中本節最后有個使用聚合函數,count(*)和group by的例子,里面提到
“新手用HAVING子句進行條件分支,高手用SELECT子句進行條件分支。
... ...
CASE 表達式用在 SELECT 子句里時,既可以寫在聚合函數內部,也可以寫在聚合函數外部。這種高度自由的寫法
正是 CASE 表達式的魅力所在。 ”
大家要注意,SQL里面的CASE表達式,不要和其他編程語言中的CASE語句混淆了。
下面是本節要點。
1. 在 GROUP BY 子句里使用 CASE 表達式,可以靈活地選擇作為聚合 的單位的編號或等級。這一點在進行非定制化統計時能發揮巨大的威力。
2. 在聚合函數中使用 CASE 表達式,可以輕松地將行結構的數據轉換 成列結構的數據。
3. 相反,聚合函數也可以嵌套進 CASE 表達式里使用。
4. 相比依賴于具體數據庫的函數,CASE 表達式有更強大的表達能力 和更好的可移植性。
5. 正因為 CASE 表達式是一種表達式而不是語句,才有了這諸多優點。
如果想了解更多關于 CASE 表達式的內容,請參考下面的文獻資料。
1. Joe Celko,《SQL 權威指南(第 4 版)》(人民郵電出版社,2013 年) 請參考15.3.5 節“在 UPDATE 中使用CASE 表達式”和18.1 節“CASE 表達式”等。從 CASE 表達式的詳細用法到具體事例,這兩節都有廣泛
的介紹。
2. Joe Celko,《SQL 解惑(第 2 版)》(人民郵電出版社,2008 年) 關于在 CASE 表達式中嵌入聚合函數,請參考“謎題 13 教師”“謎題 36 雙重職務”“謎題43 畢業”。另外,“謎題44 成對的款式”運用了在 UPDATE 里進行條件分支的技巧,“謎題 45 辣味香腸比薩餅”用 CASE 表 達式巧妙地將行結構的數據轉換成了列結構的數據。
CASE表達式作者說將會貫穿于整本書,讀者必須熟悉。若沒有完全消化以上5點,那可以買書看看。或者找作者推薦的參考資料啦。
每一小節后面還有練習題。等有時間再乖乖去做下,先吃快餐。
總結
以上是生活随笔為你收集整理的mysql迫切连接_SQL水平迫切进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 字符串大小写_Mysql 字
- 下一篇: solr6 mysql_solr6 从m