1. 程式人生 > >mysql有關null(IFNULL,COALESCE和NULLIF)的知識各位看官要不要了解下

mysql有關null(IFNULL,COALESCE和NULLIF)的知識各位看官要不要了解下

    在MySQL中,NULL值表示一個未知值,它不同於0或空字串'',並且不等於它自身。

    我們如果將NULL值與另一個NULL值或任何其他值進行比較,則結果為NULL,因為一個不知道是什麼的值(NULL值)與另一個不知道是什麼的值(NULL值)比較,其值當然也是一個不知道是什麼的值(NULL值)。

    然而我們通常,使用NULL值來表示資料丟失,未知或不適用的情況。 例如,潛在客戶的電話號碼可能為NULL,並且可以稍後新增。所以我們建立表時,可以通過使用NOT NULL約束來指定列是否接受NULL值。接下來,我們來建立一張leads表,並且以此為依據來具體瞭解下:

CREATE TABLE
leads ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, source VARCHAR(255) NOT NULL, email VARCHAR(100), phone VARCHAR(25) );

    我們可以看出來,id是主鍵列,它不接受任何NULL值,然後first_namelast_namesource列使用NOT NULL約束,因此,不能在這些列中插入任何NULL值,而emailphone

列則可接受NULL值。

    所以,我們可以在insert語句中使用NULL值來指定資料丟失。 例如,以下語句將一行插入到線索表中。 因為電話號碼丟失,所以使用NULL值:

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('John','Doe','Web Search','[email protected]',NULL);

    因為email列的預設值為NULL,可以按照以下方式在INSERT語句中省略電子郵件:

INSERT INTO leads(first_name,last_name,source,
phone) VALUES('Lily','Bush','Cold Calling','(408)-555-1234'), ('David','William','Web Search','(408)-888-6789');

    完事如果我們要將列的值設定為NULL,可以使用賦值運算子(=)。 例如,要將David William的手機(phone)更新為NULL,請使用以下UPDATE語句:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 3;

    但是如果使用order by子句按升序對結果集進行排序,則MySQL認為NULL值低於其他值,因此,它會首先顯示NULL值。以下查詢語句按照電話號碼(phone)升序排列:

SELECT 
    *
FROM
    leads
ORDER BY phone;

    執行上面查詢語句,結果如下:

+----+------------+-----------+--------------+---------------------+----------------+
| id | first_name | last_name | source       | email               | phone          |
+----+------------+-----------+--------------+---------------------+----------------+
|  1 | John       | Doe       | Web Search   | john.doe@yiibai.com | NULL           |
|  3 | David      | William   | Web Search   | NULL                | NULL           |
|  2 | Lily       | Bush      | Cold Calling | NULL                | (408)-555-1234 |
+----+------------+-----------+--------------+---------------------+----------------+

    如果使用ORDER BY DESCNULL值將顯示在結果集的最後:

SELECT 
    *
FROM
    leads
ORDER BY phone DESC;

    執行上面查詢語句,結果如下:

+----+------------+-----------+--------------+---------------------+----------------+
| id | first_name | last_name | source       | email               | phone          |
+----+------------+-----------+--------------+---------------------+----------------+
|  2 | Lily       | Bush      | Cold Calling | NULL                | (408)-555-1234 |
|  1 | John       | Doe       | Web Search   | john.doe@yiibai.com | NULL           |
|  3 | David      | William   | Web Search   | NULL                | NULL           |
+----+------------+-----------+--------------+---------------------+----------------+
3 rows in set

    我們如果要在查詢中測試NULL,可以在where子句中使用IS NULLIS NOT NULL運算子。例如,要獲得尚未提供電話號碼的潛在客戶,請使用IS NULL運算子,如下所示:

SELECT 
    *
FROM
    leads
WHERE
    phone IS NULL;

    執行上面查詢語句,結果如下:

+----+------------+-----------+------------+---------------------+-------+
| id | first_name | last_name | source     | email               | phone |
+----+------------+-----------+------------+---------------------+-------+
|  1 | John       | Doe       | Web Search | john.doe@yiibai.com | NULL  |
|  3 | David      | William   | Web Search | NULL                | NULL  |
+----+------------+-----------+------------+---------------------+-------+
2 rows in set

    我們還可以使用IS NOT運算子來獲取所有提供電子郵件地址的潛在客戶:

SELECT 
    *
FROM
    leads
WHERE
    email IS NOT NULL;

    執行上面查詢語句,結果如下:

+----+------------+-----------+------------+---------------------+-------+
| id | first_name | last_name | source     | email               | phone |
+----+------------+-----------+------------+---------------------+-------+
|  1 | John       | Doe       | Web Search | john.doe@yiibai.com | NULL  |
+----+------------+-----------+------------+---------------------+-------+
1 row in set

    然而,即使NULL不等於NULLGROUP BY子句中視兩個NULL值相等,來看下sql例項:

SELECT 
    email, count(*)
FROM
    leads
GROUP BY email;

    該查詢只返回兩行,因為其郵箱(email)列為NULL的行被分組為一行,結果如下所示:

+---------------------+----------+
| email               | count(*) |
+---------------------+----------+
| NULL                |        2 |
| john.doe@yiibai.com |        1 |
+---------------------+----------+
2 rows in set

    我們要知道在列上使用唯一約束或UNIQUE索引時,可以在該列中插入多個NULL值,在這種情況下,MySQL認為NULL值是不同的。接下來我們通過為phone列建立一個UNIQUE索引來驗證這一點:

CREATE UNIQUE INDEX idx_phone ON leads(phone);

    這裡我們要注意,如果使用BDB儲存引擎的話,mysql會認為NULL值相等,因此我們不能將多個NULL值插入到具有唯一約束的列中。

    既然知道了null的好處和壞處,我們就來看下在mysql中應該如何處理它吧。mysql一共提供了三個函式,分別是IFNULL,COALESCE和NULLIF。

    我們來分別看下,首先,IFNULL函式接受兩個引數。 如果IFNULL函式不為NULL,則返回第一個引數,否則返回第二個引數。例如,如果不是NULL,則以下語句返回電話號碼(phone),否則返回N/A,而不是NULL。來看個例項:

SELECT 
    id, first_name, last_name, IFNULL(phone, 'N/A') phone
FROM
    leads;

    執行上面查詢語句,得到以下結果:

+----+------------+-----------+----------------+
| id | first_name | last_name | phone          |
+----+------------+-----------+----------------+
|  1 | John       | Doe       | N/A            |
|  2 | Lily       | Bush      | (408)-555-1234 |
|  3 | David      | William   | N/A            |
+----+------------+-----------+----------------+
3 rows in set

    完事就是COALESCE函式,它接受引數列表,並返回第一個非NULL引數。 例如,可以使用COALESCE函式根據資訊的優先順序按照以下順序顯示線索的聯絡資訊:phone, emailN/A。以下是案例:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

    執行上面查詢語句,得到以下程式碼:

+----+------------+-----------+---------------------+
| id | first_name | last_name | contact             |
+----+------------+-----------+---------------------+
|  1 | John       | Doe       | [email protected] |
|  2 | Lily       | Bush      | (408)-555-1234      |
|  3 | David      | William   | N/A                 |
+----+------------+-----------+---------------------+
3 rows in set

    最後就是NULLIF函數了,它接受兩個引數。如果兩個引數相等,則NULLIF函式返回NULL。 否則,它返回第一個引數。在列中同時具有NULL和空字串值時,NULLIF函式很有用。 例如,我們錯誤地將以下行插入到leads表中:

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('Thierry','Henry','Web Search','[email protected]','');

    因為phone是一個空字串:'',而不是NULL。所以,如果我們想獲得潛在客戶的聯絡資訊,則最終得到空phone,而不是電子郵件,如下所示:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

    執行上面查詢語句,得到以下程式碼:

+----+------------+-----------+---------------------+
| id | first_name | last_name | contact             |
+----+------------+-----------+---------------------+
|  1 | John       | Doe       | [email protected] |
|  2 | Lily       | Bush      | (408)-555-1234      |
|  3 | David      | William   | N/A                 |
|  4 | Thierry    | Henry     |                     |
+----+------------+-----------+---------------------+

    我們如果要解決這個問題,就要使用NULLIF函式將電話與空字串('')進行比較,如果相等,則返回NULL,否則返回電話號碼:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(NULLIF(phone, ''), email, 'N/A') contact
FROM
    leads;

    執行上面查詢語句,得到以下程式碼:

+----+------------+-----------+--------------------------+
| id | first_name | last_name | contact                  |
+----+------------+-----------+--------------------------+
|  1 | John       | Doe       | [email protected]      |
|  2 | Lily       | Bush      | (408)-555-1234           |
|  3 | David      | William   | N/A                      |
|  4 | Thierry    | Henry     | [email protected] |
+----+------------+-----------+--------------------------+
4 rows in set
    好啦,本次記錄就到這裡了。如果感覺不錯的話,請多多點贊支援哦。。。

相關推薦

mysql有關nullIFNULLCOALESCENULLIF知識各位不要

    在MySQL中,NULL值表示一個未知值,它不同於0或空字串'',並且不等於它自身。    我們如果將NULL值與另一個NULL值或任何其他值進行比較,則結果為NULL,因為一個不知道是什麼的值

CentOS7CentOS6怎樣開啟MySQL遠端訪問轉載親測可用

CentOS 配置防火牆操作例項(啟、停、開、閉埠):注:防火牆的基本操作命令:查詢防火牆狀態:[[email protected] ~]# service   iptables status停止防火牆:[[email protected] ~]# service   iptables s

1215 】七夕節數論約數公式

題幹: 七夕節那天,月老來到數字王國,他在城門上貼了一張告示,並且和數字王國的人們說:"你們想知道你們的另一半是誰嗎?那就按照告示上的方法去找吧!"  人們紛紛來到告示前,都想知道誰才是自己的另一半.告示如下:  數字N的因子就是所有比N小又能被N整除的所有正整數,

關於影象的二維卷積各種版本的實現C++Cudamex

  卷積的相關知識本文不再描述,網上大把的資源,本文給出二維卷積的各種版本的實現。    C++版本   首先是最常用的C++版本的卷積實現,程式碼如下: void Conv2(int**

iPhone手機下載應用軟體的區別itunesi4itools

1   下載應用軟體的時候的區別      iPhone手機用itunes和愛思下載應用軟體的時候,需要apple i和密碼      iPhone手機用itools下載應用軟體的時候,不需要apple ID和密碼 ,需要的時候只需要授權就可以了 2.在iPhone手機使用

記錄:s:iterator的一些使用statusbeginend

mark一段程式碼 <s:iterator id="user" value="#group.teammates" status="st"> <tr> <s:if test="#st.index % 4 == 0"> <td>

mysql安裝教程zipmsi

以管理員身份執行cmd(一定要用管理員身份執行,不然許可權不夠),進入MySQL的bin目錄 輸入:cd C:\Program Files\MySQL\MySQL Server 5.6\bin 進入mysql的bin 輸入mysqld -install 安裝成功 5.啟動服務:net start mysql

給定一個句子只包含字母空格 將句子中的單詞位置反轉單詞用空格分割, 單詞之間只有一個空格前後沒有空格。

foo x11 sdi ocl ref margin dia 分割 lns 2巳嘿2啃40必刪8蔚http://t.docin.com/mqjnf44635 4瓶3ck芳8g0琳c鋪巢0http://t.docin.com/uemr9596 pf絞職9ZPFV壕5htt

作業: 1.8圓的面積周長編寫程序使用以下的公式計算並顯示半徑為5.5的圓的面積周長。

http string oid ren png ble -1 args 技術 public class Demo_1 { public static void main(String[] args) { double

MySQLIFNULL()、ISNULL()NULLIF()函數

csdn end 參考 相同 case else () 用法 nullif 參考與http://blog.csdn.net/xingyu0806/article/details/52080962 IFNULL(expr1,expr2) 假如expr1不為NULL,則

概率軟邏輯PSLProbabilistic soft logic示例演練模塊解釋

keyword sant 一個 bre att database specific ecif 改變 這裏將引導您完成Simple Acquaintances示例的Groovy版本。 一、建立示例項目 ??首先,確保您的系統滿足先決條件。然後克隆psl-examples存儲庫

Maximum Subrectangle矩陣字首

You are given two arrays aa and bb of positive integers, with length nn and mm respectively. Let cc be an n×mn×m matrix, where ci,j=ai⋅bjci,j=ai

微服務那些你該懂的知識服務的註冊發現

微服務 微服務按照我個人的理解就是將眾多的功能拆分成一個個子服務,其中以現在很流行的SpringBoot框架進行開發,再以SpringCloud方式進行部署。進而可以在SpringCloud的服務平臺中對SpringBoot的一個個服務進行註冊和監控。 一、服務註冊與發現 關

關於阿里訊息佇列RocketMQ安裝、使用你需要知道的事情

為什麼選擇RocketMQ Apache RocketMQ作為阿里開源的一款高效能、高吞吐量的分散式訊息中介軟體。因為阿里有海量的資料量,無數業務場景的應用,是RocketMQ搶盡風頭風頭,成為不可多得中介軟體專案,加上已經正式加入Apach俱樂部,作為頂級的開源專案! 一、關於

二分類相關評估指標召回率、準確率精確率F度量AUCROC

  基礎定義   通常在機器學習的二分類領域中,對模型的結果評估是必不可少的,本文主要總結了各個評估指標,對每個指標的定義,作用進行闡述。廢話到此,直接上乾貨。 TP:True Positive   FP:False Positive TN:Tr

VB 生成0~1的隨機小數不包含01再用VB感慨萬千

今天迫於無奈,接手一個已經離職快兩年的前同事的程式碼(VB6.0),增加一個生成0~1之間隨機數的功能。 VB中的寫法:Rnd() 為了美觀,還要格式化: xxx = Format(Rnd(), "0.000") 無意中看到了MS公司的產品生命週期列表,VB6的如下: 也就

給定一個句子只包含字母空格 將句子中的單詞位置反轉單詞用空格分割, 單詞之間只有一個空格前後沒有空格。 比如: 1 “hello xiao mi”-> “mi xiao hello”

題目描述 給定一個句子(只包含字母和空格), 將句子中的單詞位置反轉,單詞用空格分割, 單詞之間只有一個空格,前後沒有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello” 輸入描述: 輸入資料有多組,每組佔一行,包含一個句子(句子長度小於100

information_schema系列四跟蹤列約束

顯示 兩個 clu 備註 關於 turn 直接 report size 這個系列的文章主要是為了能夠讓自己了解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 1:KEY_COLUMN_USAGE 按照官方的解釋

mysql 資料型別 最大值 最小值

1、整型 MySQL資料型別    含義(有符號) tinyint(m)    1個位元組  範圍(-128~127) smallint(m)    2個位元組  範圍(-32768~32767) mediumint(m)    3個位元組  範圍(-8388608

SparkStreaming通過Flume獲取資料單機pushpoll兩種方式的實現

    Flume是Cloudera提供的一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的系統,Flume支援在日誌系統中定製各類資料傳送方,用於收集資料;同時,Flume提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力。1、第一種方式,通過push的方