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