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值(轉載) - 天天要聞

科技分類資訊推薦

小米王化:「傳小米與徠卡終止合作」系謠言 - 天天要聞

小米王化:「傳小米與徠卡終止合作」系謠言

今日有傳聞稱,小米與徠卡的合作關係即將結束。對此,小米公關總經理王化回應稱:「上次是2023年6月1日,番茄發了個微博說小米14就是最後一代了。我轉發了文案搭配的是「這就胡說了」,這次居然進階了,來了個據報道,還有作者……我的回復也需要進階,請大家笑納:這還是胡說。」...
微信重大更新! - 天天要聞

微信重大更新!

7月4日,騰訊宣布微信重大更新——優化聊天記錄備份。據了解,優化後,用戶可以將手機聊天記錄備份至外部存儲設備。聊天記錄還可以選擇「自動備份」。
混動轎車終局首選,「智能電混四驅轎車」領克10 EM-P全球首秀 - 天天要聞

混動轎車終局首選,「智能電混四驅轎車」領克10 EM-P全球首秀

在新能源市場「價格戰」白熱化的當下,領克只卷價值,卷技術,卷產品。在此背景下,領克首款中大型豪華運動轎車——領克10 EM-P迎來首秀亮相。新車定位「智能電混四驅轎車」,標配四驅和激光雷達,首次將高端配置一同下放至20萬級主流汽車市場。這種「頂配變標配」的平權
百年MG加速新能源布局:2年13款新車矩陣,全面ALL IN電動化賽道 - 天天要聞

百年MG加速新能源布局:2年13款新車矩陣,全面ALL IN電動化賽道

6月30日,擁有百年底蘊的MG品牌,正式宣布全面 All in 新能源。背靠上汽集團雄厚的技術實力,規劃未來 2 年推出 13 款全新新能源車型,產品矩陣覆蓋純電、插混、增程三種動力形式,轎車、SUV、跑車、獵裝車四大車身類型,這場轉型不僅是動力革新,更是百年
科技賦能綠色發展 中國為全球探新路 - 天天要聞

科技賦能綠色發展 中國為全球探新路

新華社貴陽7月6日電 題:科技賦能綠色發展 中國為全球探新路 新華社記者周宣妮 「很期待看到中國無人駕駛汽車如何從貴州工廠走向歐洲乃至世界,未來也許像我一樣不會開車的人也能在AI輔助下安全駕駛。」來自塞普勒斯的巴黎政治大學學生費奧多爾·德米特連科在貴州試乘無人駕駛巴士時如此感慨。 2日至7日,在貴州的青山綠水...
小米YU7今日交付,雷軍向首批車主交車,並親手開車門 - 天天要聞

小米YU7今日交付,雷軍向首批車主交車,並親手開車門

7月6日,小米YU7正式開啟全國交付,覆蓋全國58個城市。雷軍發文表示:今天下午,小米YU7正式交付首批車主。希望這台車,陪伴每一個熱愛生活的你和你們,解鎖更多美好體驗。感謝大家的支持與信任!有多位網友發布視頻和照片,今日雷軍在北京小米科技園親手給首批YU7車主交付新車,並為他們開車門。6月26日19:00,小米首款SU...
19.58萬元起售,小鵬G7正式上市 - 天天要聞

19.58萬元起售,小鵬G7正式上市

2025年7月3日,小鵬G7正式上市,這次一共3個版本602長續航Max、702超長續航Max、702超長續航Ultra,售價分別為19.58萬元、20.58萬元和22.58萬元。定位中型純電SUV,主打家庭定位的5座車型,這次小鵬G7還給出了哪些亮眼的科技新