在關(guān)系型數(shù)據(jù)庫的世界中,無值和NULL值的區(qū)別是什么?一直被這個問題困擾著,甚至在寫TSQL腳本時,心有戚戚焉,害怕因為自己的一知半解,挖了坑,貽害后來人,于是,本著上下求索,不達(dá)通幽不罷休的決心(開個玩笑),遂有此文。
學(xué)習(xí)過關(guān)系型數(shù)據(jù)庫的伙伴都知道,NULL是指不確定的值,在數(shù)據(jù)庫中絕對是噩夢的存在;而空值,一般對字符串類型而言,指沒有任何值的字符串類型,為字符類型的變量設(shè)置為空值:set @vs='',空值跟無值不同。有人可能會問,無值是什么?無值,是指數(shù)據(jù)表中沒有任何數(shù)據(jù)。無值和不確定值,單從字面意思上來看,兩者之間的定義很清楚,一旦深究,這兩者之間的關(guān)系,有時令人十分迷惑(confused),這是因為,在特定條件下,無值會轉(zhuǎn)換為NULL值。
一,舉個栗子,理解無值和NULL值的區(qū)別
比如,創(chuàng)建一個臨時表,在不插入任何數(shù)據(jù)時,該數(shù)據(jù)表是空的,沒有任何值,對其執(zhí)行select命令,將不會返回任何數(shù)據(jù)值:
create table #temp( id int null)
創(chuàng)建一個標(biāo)量類型的變量,在不初始化時,該變量的值是不確定的,其值是NULL:
declare @vs int
創(chuàng)建一個表類型變量,在不初始化時,該表變量沒有任何數(shù)據(jù),是無值的:
declare @vt as table( id int null)
總結(jié)一下,聲明一個標(biāo)量型變量,如果沒有對變量進(jìn)行初始化,其值是不確定的,是NULL值;對于表變量,臨時表和基礎(chǔ)表,如果沒有插入任何數(shù)據(jù),該表沒有任何數(shù)據(jù),是無值的。
二,無值和NULL值的轉(zhuǎn)換
在開始本節(jié)之前,先為變量賦值,簡單的一個select命令就可以完成變量的賦值:
select @vs=1
有些朋友思維比較活躍,立馬會想到:“用select命令可以從表中取值為變量賦值”,對,但是,賦值方法不是我求索的重點,我關(guān)注的是從表中取值為變量賦值的結(jié)果。
1,從空表中為變量賦值
如果數(shù)據(jù)表是空表,沒有任何值,那么數(shù)據(jù)庫引擎不會執(zhí)行賦值語句,變量保持原有值不變:
#
但是,如果采用以下方式,那么數(shù)據(jù)庫引擎會執(zhí)行賦值語句,由于空表不返回任何值,數(shù)據(jù)