假設(shè)有如下一張表,名為 Product
(DDL 見本文結(jié)尾):
product_id | product_name | product_type | sale_price | purchase_price | regist_date |
---|---|---|---|---|---|
0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
0002 | 打孔器 | 辦公用品 | 500 | 320 | 2009-09-11 |
0003 | 運(yùn)動(dòng)T恤 | 衣服 | 4000 | 2800 | NULL |
0004 | 菜刀 | 廚房用具 | 3000 | 2800 | 2009-09-20 |
0005 | 高壓鍋 | 廚房用具 | 6800 | 5000 | 2009-01-15 |
0006 | 叉子 | 廚房用具 | 500 | NULL |
2009-09-20 |
0007 | 擦菜板 | 廚房用具 | 880 | 790 | 2008-04-28 |
0008 | 圓珠筆 | 辦公用品 | 100 | NULL |
2009-11-11 |
DISTINCT
在使用 DISTINCT
時(shí)骨宠,NULL
也被視為一類數(shù)據(jù)浮定。NULL
存在于多行中時(shí)相满,也會(huì)被合并為一條 NULL
數(shù)據(jù)。
對(duì)含有 NULL
數(shù)據(jù)的列使用 DISTINCT
關(guān)鍵字:
SELECT DISTINCT purchase_price
FROM Product;
執(zhí)行結(jié)果為:
purchase_price |
---|
500 |
320 |
2800 |
5000 |
NULL |
790 |
算術(shù)函數(shù)
考慮一下在 SQL 語(yǔ)句中如下運(yùn)算的結(jié)果:
5 + NULL
10 - NULL
1 * NULL
4 / NULL
NULL / 9
NULL / 0
正確答案是全為 NULL
桦卒。實(shí)際上所有包含 NULL
的計(jì)算立美,結(jié)果肯定是 NULL
。
比較謂詞
當(dāng)我們嘗試取出不是進(jìn)貨單價(jià)不是 2800
日元(purchase_price <> 2800
)的記錄時(shí):
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price <> 2800;
執(zhí)行結(jié)果為:
product_name | purchase_price |
---|---|
T恤衫 | 500 |
打孔器 | 320 |
高壓鍋 | 5000 |
擦菜板 | 790 |
執(zhí)行結(jié)果中并沒有“叉子”和“圓珠筆”方灾。這兩條記錄由于進(jìn)貨單價(jià)不明(NULL
)建蹄,因此無法判定是不是 2800
日元。
當(dāng)你嘗試使用 purchase_price = NULL
或 purchase_price <> NULL
作為查詢條件時(shí)裕偿,均查詢不到任何記錄洞慎。
實(shí)際上,在 SQL 中嘿棘,比較運(yùn)算符的結(jié)果除了真(TRUE)與假(FALSE)之外劲腿,還有第三種值——不確定(UNKNOWN)。
NULL 與所有值比較鸟妙,結(jié)果都為不確定焦人。
替代的,你可以使用 purchase_price IS NULL
和 purchase_price IS NOT NULL
來查詢你想要的記錄重父。如:
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IS NULL;
執(zhí)行結(jié)果為:
product_name | purchase_price |
---|---|
叉子 | NULL |
圓珠筆 | NULL |
邏輯謂詞
下列是三值邏輯中 AND
和 OR
運(yùn)算的真值表:
P | Q | P AND Q | P OR Q |
---|---|---|---|
真 | 真 | 真 | 真 |
真 | 假 | 假 | 真 |
真 | 不確定 | 不確定 | 真 |
假 | 假 | 假 | 假 |
假 | 不確定 | 假 | 不確定 |
不確定 | 不確定 | 不確定 | 不確定 |
使查詢語(yǔ)句
WHERE
子句的值為不確定的記錄花椭,不會(huì)被查詢出來。
聚合
聚合函數(shù)
除 COUNT(*)
外房午,聚合函數(shù)只對(duì) NULL
以外的對(duì)象進(jìn)行匯總矿辽。
執(zhí)行如下查詢語(yǔ)句,結(jié)果已在注釋中標(biāo)出:
SELECT COUNT(*)
FROM Product;
-- 結(jié)果為 8
SELECT COUNT(purchase_price)
FROM Product;
-- 結(jié)果為 6
SELECT SUM(purchase_price)
FROM Product;
-- 結(jié)果為 12210(500 + 320 + 2800 + 2800 + 5000 + 790)
SELECT AVG(purchase_price)
FROM Product;
-- 結(jié)果為 2035((500 + 320 + 2800 + 2800 + 5000 + 790) / 6)
-- 注意:分母為 6 而不是 8郭厌,聚合函數(shù)只對(duì) NULL 以外的對(duì)象進(jìn)行匯總
GROUP BY
當(dāng)聚合鍵中包含 NULL
時(shí)嗦锐,也會(huì)將 NULL
作為一組特定的數(shù)據(jù):
SELECT purchase_price, COUNT(*)
FROM Product
GROUP BY purchase_price;
執(zhí)行結(jié)果為:
purchase_price | COUNT(*) |
---|---|
NULL |
2 |
320 | 1 |
500 | 1 |
790 | 1 |
2800 | 2 |
5000 | 1 |
排序
使用含有 NULL 的列作為排序鍵時(shí),NULL 會(huì)在結(jié)果的開頭或末尾匯總顯示:
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY purchase_price;
執(zhí)行結(jié)果為:
product_id | product_name | sale_price | purchase_price |
---|---|---|---|
0006 | 叉子 | 500 | NULL |
0008 | 圓珠筆 | 100 | NULL |
0002 | 打孔器 | 500 | 320 |
0001 | T恤衫 | 1000 | 500 |
0007 | 擦菜板 | 880 | 790 |
0003 | 運(yùn)動(dòng)T恤 | 4000 | 2800 |
0004 | 菜刀 | 3000 | 2800 |
0005 | 高壓鍋 | 6800 | 5000 |
究竟是在開頭顯示還是在末尾顯示沪曙,并沒有特殊規(guī)定奕污。某些 DBMS 中可以指定 NULL 在開頭或末尾顯示。
附錄
Product 表 DDL
-- MySQL 5.7
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
START TRANSACTION;
INSERT INTO Product VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '運(yùn)動(dòng)T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '廚房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11');
COMMIT;