<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          在 SQL 中該如何處理NULL值,你真的清楚么?

          共 3134字,需瀏覽 7分鐘

           ·

          2021-05-20 13:39

          作者:陳哈哈

          blog.csdn.net/qq_39390545/article/details/105859502


          在日常使用數(shù)據(jù)庫時,你在意過NULL值么?

          其實,NULL值在數(shù)據(jù)庫中是一個很特殊且有趣的存在,下面我們一起來看看吧;

          圖片

          在查詢數(shù)據(jù)庫時,如果你想知道一個列(例如:用戶注冊年限 USER_AGE)是否為 NULL,SQL 查詢語句該怎么寫呢?

          是這樣:

          SELECT * FROM TABLE WHERE USER_AGE = NULL

          還是這樣?

          SELECT * FROM TABLE WHERE USER_AGE IS NULL

          當(dāng)然,正確的寫法應(yīng)該是第二種(WHERE USER_AGE IS NULL)。

          但為什么要這樣寫呢?在進行數(shù)據(jù)庫數(shù)據(jù)比較操作時,我們不會使用“IS”關(guān)鍵詞,不是嗎?

          一臉懵逼

          例如,如果我們想要知道一個列的值是否等于 1,WHERE 語句是這樣的:

          WHERE USER_AGE = 1

          那為什么 NULL 值要用 IS 關(guān)鍵字呢?為什么要以這種方式來處理 NULL?

          因為,在 SQL 中,NULL 表示“未知”。也就是說,NULL 值表示的是“未知”的值。

          NULL = 未知;

          在大多數(shù)數(shù)據(jù)庫中,NULl 和空字符串是有區(qū)別的。

          但并不是所有數(shù)據(jù)庫都這樣,例如,Oracle 就不支持空字符串,它會把空字符串自動轉(zhuǎn)成 NULL 值。

          在其他大多數(shù)數(shù)據(jù)庫里,NULL 值和字符串的處理方式是不一樣的:

          • 空字符("")串雖然表示“沒有值”,但這個值是已知的。
          • NULL 表示 “未知值”,這個值是未知的。

          這就好比我問了一個問題:“川建國的小名叫什么?”

          有人會回答說:“我不知道川建國的小名是什么”。對于這種情況,可以在數(shù)據(jù)庫中使用Nickname列來表示川建國的小名,而這一列的值為 NULL。

          也有人會回答說:“川建國沒有小名。他的父母沒有給他取小名,大家雖然一直叫他川二狗,但是我知道川建國確實沒有小名”。對于這種情況,Nickname列應(yīng)該是一個空字符串("")。

          Oracle 比較特殊,兩個值都使用 NULL 來表示,而其他大多數(shù)數(shù)據(jù)庫會區(qū)分對待。

          但只要記住 NULL 表示的是一個未知的值,那么在寫 SQL 查詢語句時就會得心應(yīng)手。

          例如,如果你有一個這樣的查詢語句:

          SELECT * FROM SOME_TABLE WHERE 1 = 1

          這個查詢會返回所有的行(假設(shè) SOME_TABLE 不是空表),因為表達式“1=1”一定為 true。

          如果我這樣寫:

          SELECT * FROM SOME_TABLE WHERE 1 = 0

          表達式“1=0”是 false,這個查詢語句不會返回任何數(shù)據(jù)。

          但如果我寫成這樣:

          SELECT * FROM SOME_TABLE WHERE 1 = NULL

          這個時候,數(shù)據(jù)庫不知道這兩個值(1 和 NULL)是否相等,因此會認定為“NULL”或“未知”,所以它也不會返回任何數(shù)據(jù)。

          三元邏輯

          SQL 查詢語句中的 WHERE 一般會有三種結(jié)果:

          • 它可以是 true(這個時候會返回數(shù)據(jù));
          • 它可以是 false(這個時候不會返回數(shù)據(jù));
          • 它也可以是 NULL 或未知(這個時候也不會返回數(shù)據(jù));
          圖片

          你可能會想:“既然這樣,那我為什么要去關(guān)心是 false 還是 NULL?它們不是都不會返回數(shù)據(jù)嗎?”

          接下來,我來告訴你在哪些情況下會有問題:我們來看看 NOT( ) 方法。

          假設(shè)有這樣的一個查詢語句:

          SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)

          數(shù)據(jù)庫首先會計算 1=1,這個顯然是 true。

          接著,數(shù)據(jù)庫會應(yīng)用 NOT() 條件,所以 WHERE 返回 false。

          所以,上面的查詢不會返回任何數(shù)據(jù)。

          但如果把語句改成這樣:

          SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)

          數(shù)據(jù)庫首先會計算 1=0,這個肯定是 false。

          接著,數(shù)據(jù)庫應(yīng)用 NOT() 條件,這樣就得到相反的結(jié)果,變成了 true。

          所以,這個語句會返回數(shù)據(jù)。

          但如果把語句再改成下面這樣呢?

          SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)

          數(shù)據(jù)庫首先計算 1=NULL,它不知道 1 是否等于 NULL,因為它不知道 NULL 的值是什么。

          所以,這個計算不會返回 true,也不會返回 false,它會返回一個 NULL。

          接下來,NOT() 會繼續(xù)解析上一個計算返回的結(jié)果。

          當(dāng) NOT() 遇到 NULL,它會生成另一個 NULL。未知的相反面是另一個未知。

          所以,對于這兩個查詢:

          SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)
           
          SELECT * FROM SOME_TABLE WHERE 1 = NULL

          都不會返回數(shù)據(jù),盡管它們是完全相反的。

          NULL 和 NOT IN

          如果我有這樣的一個查詢語句:

          SELECT * FROM TABLE WHERE 1 IN (1, 2, 3, 4, NULL)

          很顯然,WHERE 返回 true,這個語句將返回數(shù)據(jù),因為 1 在括號列表里是存在的。

          但如果這么寫:

          SELECT * FROM SOME_TABLE WHERE 1 NOT IN (1, 2, 3, 4, NULL)

          很顯然,WHERE 返回 false,這個查詢不會返回數(shù)據(jù),因為 1 在括號列表里存在,但我們說的是“NOT IN”。

          但如果我們把語句改成這樣呢?

          SELECT * FROM SOME_TABLE WHERE 5 NOT IN (1, 2, 3, 4, NULL)

          這里的 WHERE 不會返回數(shù)據(jù),因為它的結(jié)果不是 true。數(shù)字 5 在括號列表里可能不存在,也可能存在,因為當(dāng)中有一個 NULL 值(數(shù)據(jù)庫不知道 NULL 的值是什么)。

          這個 WHERE 會返回 NULL,所以整個查詢不會返回任何數(shù)據(jù)。

          希望大家現(xiàn)在都清楚該怎么在 SQL 語句中處理 NULL 值了

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黑人大战亚洲女人网站 | 麻豆成人精品国产免费 | 大香蕉新网站 | 一区二区三区在线视频免费 | 操人天堂视频 |