日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql迫切连接_SQL水平迫切进阶

發(fā)布時間:2025/5/22 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql迫切连接_SQL水平迫切进阶 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言中按慣例測試了是否適合做此書的讀者。

我們來做一個測試,幫助大家了解一下自己處于何種水平。下面有10 個問題,請回答 Yes 或No。

1. 沒有在聚合函數(shù)中使用過 CASE 表達(dá)式。

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表達(dá)式,SQL-92標(biāo)準(zhǔn)里面加入的特性。

CASE表達(dá)式的寫法:

-- 簡單 CASE 表達(dá)式

CASE sex

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '其他' END

-- 搜索 CASE 表達(dá)式

CASE WHEN sex = '1' THEN '男'

WHEN sex = '2' THEN '女'

ELSE '其他' END

使用CASE表達(dá)式的好處就是相較于DECODE函數(shù)(oracle)和IF(mysql),語法通用,方便移植。注意上面的關(guān)鍵字不要漏寫,例如習(xí)慣寫ELSE(自己不寫,那默認(rèn)會當(dāng)做ELSE NULL),記得寫END。

SELECT語句中使用CASE表達(dá)式,一般在GROUP BY中也要寫同樣的內(nèi)容。但MYSQL和PostgreSQL中可以在GOURP BY中用SELECT中CASE表達(dá)式的別名。

CASE表達(dá)式和CHECK約束,這段看得我云里霧里。主要的優(yōu)勢還是,若使用CASE表達(dá)式來完成條件分支,比較符合人類語言。而且可以涵蓋得比較全面的情況。(原文的例子是反映作者國家的社會現(xiàn)狀嗎?)但是本人也沒有用CHECK的需求,先跳過。

跟著介紹CASE語句于UPDATE中用作條件分支。好處是語句執(zhí)行一次就可以根據(jù)各種情況來更新。更方便,速度更快(這里需要親身經(jīng)歷才能體會)。不需要考慮update語句的執(zhí)行順序問題。下面是例子,權(quán)當(dāng)參考,

-- 用 CASE 表達(dá)式寫正確的更新操作

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表達(dá)式條件中的salary值就會被置為NULL。在生產(chǎn)環(huán)境干這事就精彩了。

這里還舉了兩個主鍵值'a'、'b'調(diào)換的例子,老套的a換為c -> b換為a -> c換為b三個update語句要執(zhí)行三次,現(xiàn)在可以一次性完成,寫CASE。

-- 用 CASE 表達(dá)式調(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 表達(dá)式的一大優(yōu)勢在于能夠判斷表達(dá)式。

也就是說,在 CASE 表達(dá)式里,我們可以使用 BETWEEN、LIKE 和 等

便利的謂詞組合,以及能嵌套子查詢的 IN 和 EXISTS 謂詞。因此,CASE

表達(dá)式具有非常強(qiáng)大的表達(dá)能力。

“”

反正CASE表達(dá)式可以玩得很復(fù)雜,可以將需要多步驟的查詢一次搞定。

書中本節(jié)最后有個使用聚合函數(shù),count(*)和group by的例子,里面提到

“新手用HAVING子句進(jìn)行條件分支,高手用SELECT子句進(jìn)行條件分支。

... ...

CASE 表達(dá)式用在 SELECT 子句里時,既可以寫在聚合函數(shù)內(nèi)部,也可以寫在聚合函數(shù)外部。這種高度自由的寫法

正是 CASE 表達(dá)式的魅力所在。 ”

大家要注意,SQL里面的CASE表達(dá)式,不要和其他編程語言中的CASE語句混淆了。

下面是本節(jié)要點。

1. 在 GROUP BY 子句里使用 CASE 表達(dá)式,可以靈活地選擇作為聚合 的單位的編號或等級。這一點在進(jìn)行非定制化統(tǒng)計時能發(fā)揮巨大的威力。

2. 在聚合函數(shù)中使用 CASE 表達(dá)式,可以輕松地將行結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換 成列結(jié)構(gòu)的數(shù)據(jù)。

3. 相反,聚合函數(shù)也可以嵌套進(jìn) CASE 表達(dá)式里使用。

4. 相比依賴于具體數(shù)據(jù)庫的函數(shù),CASE 表達(dá)式有更強(qiáng)大的表達(dá)能力 和更好的可移植性。

5. 正因為 CASE 表達(dá)式是一種表達(dá)式而不是語句,才有了這諸多優(yōu)點。

如果想了解更多關(guān)于 CASE 表達(dá)式的內(nèi)容,請參考下面的文獻(xiàn)資料。

1. Joe Celko,《SQL 權(quán)威指南(第 4 版)》(人民郵電出版社,2013 年) 請參考15.3.5 節(jié)“在 UPDATE 中使用CASE 表達(dá)式”和18.1 節(jié)“CASE 表達(dá)式”等。從 CASE 表達(dá)式的詳細(xì)用法到具體事例,這兩節(jié)都有廣泛

的介紹。

2. Joe Celko,《SQL 解惑(第 2 版)》(人民郵電出版社,2008 年) 關(guān)于在 CASE 表達(dá)式中嵌入聚合函數(shù),請參考“謎題 13 教師”“謎題 36 雙重職務(wù)”“謎題43 畢業(yè)”。另外,“謎題44 成對的款式”運用了在 UPDATE 里進(jìn)行條件分支的技巧,“謎題 45 辣味香腸比薩餅”用 CASE 表 達(dá)式巧妙地將行結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成了列結(jié)構(gòu)的數(shù)據(jù)。

CASE表達(dá)式作者說將會貫穿于整本書,讀者必須熟悉。若沒有完全消化以上5點,那可以買書看看。或者找作者推薦的參考資料啦。

每一小節(jié)后面還有練習(xí)題。等有時間再乖乖去做下,先吃快餐。

總結(jié)

以上是生活随笔為你收集整理的mysql迫切连接_SQL水平迫切进阶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。