主頁(yè) > 知識(shí)庫(kù) > SQL Server中NULL的正確使用與空間占用

SQL Server中NULL的正確使用與空間占用

熱門標(biāo)簽:真3地圖標(biāo)注 疫情時(shí)期電話機(jī)器人 濮陽(yáng)清豐400開頭的電話申請(qǐng) 地圖標(biāo)注跑線下市場(chǎng) 南京怎么申請(qǐng)400這種電話 樂昌電話機(jī)器人 南通智能外呼系統(tǒng)怎么樣 地圖標(biāo)注可以編輯地名嗎 臺(tái)灣外呼系統(tǒng)軟件

我們常在SQL Server的使用或維護(hù)中遇上NULL,那么什么是NULL?如下是MSDN給出的一段簡(jiǎn)短描述(見“Null Values”):

  • A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.

通俗的講,NULL就是一個(gè)值,而且這個(gè)值是未知的(unknown);NULL不能等價(jià)任何值,甚至都不等價(jià)它自己,即NULL不等于NULL。

為了清晰的理解上述的內(nèi)容,我們創(chuàng)建一個(gè)測(cè)試表Test_NULL,然后對(duì)表插入2條含有NULL值的記錄,并進(jìn)行相關(guān)驗(yàn)證操作:

--創(chuàng)建一張?jiān)试SNULL值的表
CREATE TABLE Test_NULL (
  num INT NOT NULL PRIMARY KEY
  ,fname NVARCHAR(50) NULL
  ,lname NVARCHAR(50) NULL
)

--對(duì)表插入4條數(shù)據(jù):最后2條記錄含有NULL值
INSERT INTO Test_NULL (num,fname,lname) VALUES(1, 'Tom','Jane')
INSERT INTO Test_NULL (num,fname,lname) VALUES(2, 'Dave','')
INSERT INTO Test_NULL (num,fname) VALUES(3, 'Aaron')
INSERT INTO Test_NULL (num,fname) VALUES(4, 'Betty')

為了驗(yàn)證NULL值是未知的,我們通過如下SQL查詢表Test_NULL的記錄,對(duì)lname字段進(jìn)行=操作:

--若兩個(gè)NULL是可以相等的,那么將輸出4條記錄。實(shí)際只輸出2條記錄

SELECT
  *
FROM Test_NULL tn 
LEFT JOIN Test_NULL g
  ON tn.num = g.num
WHERE tn.lname = g.lname
------------------------------------------
1  Tom Jane  1  Tom Jane
2  Dave    2  Dave  

--查詢lname為''的記錄,即驗(yàn)證NULL不等于''
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname = ''
------------------------------------------
2  Dave  

正確查詢/使用SQL Server中的NULL

由于NULL是未知的,因此在SQL Server默認(rèn)情況下我們不能使用=或>去判斷或查詢一條NULL的記錄(見上述),正確的方式是:使用IS NULL或IS NOT NULL去查詢或過濾一條含有NULL的記錄。

另外有函數(shù)ISNULL(),可判斷并轉(zhuǎn)換NULL為其他值。

--通過IS NULL查詢含有NULL的記錄
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname IS NULL
------------------------------------------
3  Aaron  NULL
4  Betty  NULL

--NULL不等于任何值,甚至NULL不等于NULL
--默認(rèn)不能使用>或=匹配NULL
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname > NULL OR tn.lname = NULL
------------------------------------------

但需注意:SQL Server僅是在默認(rèn)情況下不能使用=或>,當(dāng)設(shè)置ANSI_NULLS為OFF后,即可使用=或>查詢NULL值

換言之,SQL Server默認(rèn)是開啟ANSI_NULLS選項(xiàng)的。

--設(shè)置ANSI_NULLS為OFF,并使用=NULL查詢記錄
SET ANSI_NULLS OFF
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname = NULL
------------------------------------------
3  Aaron  NULL
4  Betty  NULL

插入或更新NULL值:

--插入1條含有NULL的新記錄
INSERT INTO Test_NULL (num,fname,lname) VALUES(5, 'Serena', NULL)

--更新某條記錄的字段值為NULL
UPDATE Test_NULL SET fname = NULL
WHERE num = 2

NULL的空間占用

通常的認(rèn)識(shí)是:NULL在可變長(zhǎng)類型(如nvarchar(50),varchar(8))中是不占用空間的,在固定長(zhǎng)度的類型(如int)中會(huì)占用存儲(chǔ)空間。

實(shí)際上,上述的認(rèn)識(shí)不夠嚴(yán)謹(jǐn)。真實(shí)情況是,NULL在可變長(zhǎng)與固定長(zhǎng)度的類型中均會(huì)占用空間

在SQL Server非Sparse Columns中,存儲(chǔ)NULL的值需1個(gè)bit的NULL bitmap mask。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

您可能感興趣的文章:
  • SQLserver查詢數(shù)據(jù)類型為ntext是空或NULL值的方法
  • sqlserver對(duì)字段出現(xiàn)NULL值的處理
  • sqlserver isnull在數(shù)據(jù)庫(kù)查詢中的應(yīng)用
  • SQL Server、Oracle和MySQL判斷NULL的方法
  • 深入SQLServer中ISNULL與NULLIF的使用詳解
  • 淺談SQLServer的ISNULL函數(shù)與Mysql的IFNULL函數(shù)用法詳解
  • sqlserver 不能將值NULL插入列id(列不允許有空值解決)
  • SQLSERVER ISNULL 函數(shù)與判斷值是否為空的sql語句
  • 在SQL Server中使用ISNULL執(zhí)行空值判斷查詢

標(biāo)簽:通遼 南京 河北 馬鞍山 廣安 陜西 福建 阿里

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server中NULL的正確使用與空間占用》,本文關(guān)鍵詞  SQL,Server,中,NULL,的,正確,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server中NULL的正確使用與空間占用》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL Server中NULL的正確使用與空間占用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章