SQL 中null值(轉載)

2022年10月15日00:00:19 科技 1503

SQL中這些與NULL有關的細節,你知道嗎?

NULL是SQL常見的關鍵字之一,表示「空,無」的意思。它在SQL中是一種獨特的存在,今天來匯總一下與它相關的知識點,看看這些你都知道嗎?

先貼一下我們的原始數據,是一個只有1列的表,表名為example,很簡單:

SQL 中null值(轉載) - 天天要聞

1.NULL是一種特殊的值,對某欄位使用distinct 關鍵字時,NULL和一般值一樣,都會排重,只保留一個值。

SQL 中null值(轉載) - 天天要聞

2.不能對NULL值使用比較運算符

直白地講,不能對null值使用等號(=)或者不等號(!=)進行比較,要使用is null 和 is not null。

SQL 中null值(轉載) - 天天要聞

有一種情況需要注意,假設我們需要取col不為2的所有col值,包括null。不能只寫where col <> '2',因為這樣的寫法不會包括NULL值。我們需要寫成where col <> '2' or col is null。

SQL 中null值(轉載) - 天天要聞

3.count(*)會統計null值,count(列名)不包括null值。

SQL 中null值(轉載) - 天天要聞

4.含NULL值的運算結果都為NULL,如下面圖所示(點擊查看大圖)

SQL 中null值(轉載) - 天天要聞

5.使用sum函數和avg函數時,相應列中包含NULL的,會發生什麼?

SQL 中null值(轉載) - 天天要聞

sum和avg函數作用於含有NULL的列,NULL值不參與計算。上面圖中,sum(col) 是1+2+2+3=8。avg(col) 是(1+2+2+3)/4=2,注意分母是4而不是6。如果需要將NULL值當作0值參與到運算中,可以用case when的方式進行判斷賦值。

select sum(case when col is null then 0 else col end) from example;#結果是8

select avg(case when col is null then 0 else col end) from example;#分母是6,結果是1.33

除此外,在使用max,min時,也會忽略NULL值。事實上,聚合函數如果以列名為參數,那麼在計算之前就會把NULL 排除在外。

6.如果某列含有null,使用group by 進行聚合時,null值會單獨保留一行。

這一點和第一點有點類似,見下面代碼。

SQL 中null值(轉載) - 天天要聞

7.null佔用的空間是多少?

SQL 中null值(轉載) - 天天要聞

我們在原數據的基礎上插入了一行空字元串的數據。然後來看每一個值所佔用的空間。可以看到,NULL所佔的空間是NULL,是佔用空間的,而空字元串長度是0,是不佔用空間的。

NULL columns require additional space in the row to record whether their values are NULL.
NULL列需要行中的額外空間來記錄它們的值是否為NULL。

有一個比喻很恰當:空值就像是一個真空狀態杯子,什麼都沒有,而NULL值就是一個裝滿空氣的杯子,雖然看起來都是一樣的,但是有著本質的區別。

補充說明:對於空值的判斷需要用=,!= 等算數運算符,而NULL值不行。count等聚合函數會忽略NULL值,但不會忽略空值。

8.對NULL進行排序,結果如何?

SQL 中null值(轉載) - 天天要聞

上面的結果,升序排序,NULL在最開頭,但這並不能說明NULL比1小,因為我們前面提到是不能對NULL使用比較運算符的。這裡的結果只是把NULL放在了開頭顯示,可能在另外的資料庫中,會統一放到結尾顯示。

9.大多數函數作用於NULL,結果都是NULL,如concat函數,abs函數等。但COALESCE函數除外,它返回第一個不為NULL的值。我們常會看到的NVL函數是該函數的簡化版本,類似的函數還有IFNULL。

SELECT COALESCE(NULL, 1) AS col_1,

COALESCE(NULL, 'test', NULL) AS col_2,

COALESCE(NULL, NULL, '2009-11-01') AS col_3;

--結果:1 test 2009-11-01

10.NULL的其他作用

NULL多用在欄位約束中,如非空約束可以用NOT NULL表示。NULL經常用在case表達式中的ELSE子句中:case when <條件> else NULL end,else的部分也可以不寫,但為了易讀性,還是建議寫。

小結

對NULL常用的知識點總結如下面的思維導圖,歡迎大家補充。(在有些地方看到了在插入和更新數據時NULL的注意事項和索引相關的知識,由於用的比較少,就不放在這裡了,可以參考文末鏈接自行學習)

SQL 中null值(轉載) - 天天要聞

科技分類資訊推薦

華為鯤鵬、昇騰已發展超 665 萬開發者、8800 多家合作夥伴 - 天天要聞

華為鯤鵬、昇騰已發展超 665 萬開發者、8800 多家合作夥伴

IT之家 5 月 25 日消息,在昨日舉行的鯤鵬昇騰開發者大會 2025 上,華為 ICT Marketing 部部長周軍表示,華為持續打造堅實、易用的算力底座,使能開發者和夥伴,加速行業智能化。據周軍介紹,截至 2025 年 5 月,鯤鵬、昇騰已發展超過 665 萬開發者,以及 8800 多家合作夥伴,完成 23900 多個解決方案認證。華為方面稱,截..
「馬上有」:小米 15S Pro 手機過上市關鍵期後將推 Beta 版系統 - 天天要聞

「馬上有」:小米 15S Pro 手機過上市關鍵期後將推 Beta 版系統

IT之家 5 月 25 日消息,在本月(5 月 22 日)舉行的小米 15 周年戰略新品發布會上,小米 15S Pro 手機正式發布。新機基於小米 15 Pro 手機研發,搭載小米自主研發設計的玄戒 O1 旗艦處理器,售價 5499 元起。IT之家注意到,小米公司應用軟體部總監王樂今日凌晨就網友提出的「小米 15S Pro 手機會不會有 Beta 版本更新」
蘋果 AI 的崩塌真相:從喬布斯願景,到高管失誤的困局 - 天天要聞

蘋果 AI 的崩塌真相:從喬布斯願景,到高管失誤的困局

一向在意公眾形象的蘋果,因為 AI 拉跨,這次被扒乾淨了。作者|Moonshot編輯|靖宇AI,已經熱了快三年了。各大科技巨頭爭先恐後下注入局,可偏偏在這個熱潮中,最接近我們生活的蘋果,卻看起來離 AI 最遠。最大的巨頭,在最熱的潮流面前,好似隱身了。去年 6 月 WWDC 上,蘋果慢吞地發布了 Apple Intelligence,可如今快一...
小米耳機變成了小蘇打... ... - 天天要聞

小米耳機變成了小蘇打... ...

快遞越來越方便手指一點送貨到家有時還會突然收到陌生快遞這時候一定要當心騙子投放禮品卡進行詐騙請大家提高辨別能力5月18日轄區居民龔先生帶著兩個未拆封的快遞來到開發區派出所報警「這快遞不是我的,不敢拆」值班民警宋月亮檢查後發現快遞單上的信息模糊且龔先生及家人均未下單拆開快遞後發現外包裝是「小米耳機」盒看...
董宇輝也會在直播間「演戲」了? - 天天要聞

董宇輝也會在直播間「演戲」了?

董宇輝也開始在直播間「表演」和品牌商談判的戲碼了。近日,董宇輝在直播間銷售某品牌電視時,講到一半,商家表示要收取最高200元的安裝費。董宇輝一聽眉頭緊皺,兩手一攤,當場回絕,「不合理,你要這樣,我不講了,我不接受」。
定了,小米這直屏頂配要提前發布,7400mAh太爽了 - 天天要聞

定了,小米這直屏頂配要提前發布,7400mAh太爽了

REDMI K80至尊版其實按照正常節奏來說,K80至尊版應該得七到八月才會發。但可能是今年性能機這塊地,競爭太過激烈。又或者是小米想趁熱打鐵,接力剛發不久的小米15S Pro。如今各方爆料都顯示,這機子將要在6月底發布。反正前兩天,這機子
看銷售高手,如何在眾多競爭對手中,拿到大訂單! - 天天要聞

看銷售高手,如何在眾多競爭對手中,拿到大訂單!

看正文之前先問一下各位,在各領域中掙扎銷售人員,這幾年的銷售工作好不好做?是不是感覺越來越擠了?這片紅海越來越紅了對吧?競爭對手太多太多了尤其這兩年跨行業競爭的尤其明顯,那麼我們該如何在眾多的競爭對手當中脫穎而出,今天我們用一個小故事說明,
中集集團助力國際知名航運企業果汁船罐體項目高效交付 - 天天要聞

中集集團助力國際知名航運企業果汁船罐體項目高效交付

近日,中集集團旗下中集醇科與中集世聯達協同聯動,圓滿完成了國際知名航運企業果汁船的罐體交付工作。該項目的啟動,源於中集醇科為這家國際知名航運企業量身定製的果汁船系統工程。項目涵蓋14個大型果汁罐的製造,以及分批次短駁、吊裝、運輸、清關和安裝