MySQL中空值和NULL的區(qū)別小結(jié)
1. NULL和空值定義上的區(qū)別
在 MySQL 中,NULL 值和空值是兩個(gè)不同的概念,空值就是我們常說的空字符串,用兩個(gè)單引號 '' 代替即可;
NULL 值在MySQL中是占用空間的,而空值則是不占用長度空間的。
舉個(gè)最簡單的例子。
如果把數(shù)據(jù)比作水果,表中的每一個(gè)空位比作一個(gè)個(gè)箱子,水果要放進(jìn)箱子里存儲;
NULL就可以理解為空位上有一個(gè)箱子,但箱子是空的,沒有存放任何水果;
空值就可以理解為空位上連箱子都沒有,真空狀態(tài);
2. NULL和空值在表中顯示的區(qū)別
如下SQL創(chuàng)建一張 user 用戶表,
我將郵箱字段 email 和 性別字段 sex 默認(rèn)值設(shè)計(jì)為空值,除了主鍵uid外其余字段默認(rèn)值設(shè)計(jì)為NULL
CREATE TABLE `user` ( `uid` int NOT NULL, `username` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT NULL, `password` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT NULL, `age` int DEFAULT NULL, `email` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT '', `sex` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT '', PRIMARY KEY (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
(特別注明:MySQL中創(chuàng)建表默認(rèn)所有字段都是為NULL,上述建表SQL是我修改后展示給各位的,方便小伙伴復(fù)制使用,如果有小伙伴是自己直接創(chuàng)建的表,可以通過執(zhí)行如下SQL修改字段默認(rèn)值)
# 修改語法格式 ALTER TABLE 表名 MODIFY 字段名 字段類型(要修改為的長度) DEFAULT '要修改為的默認(rèn)值'; # 舉例語句 # 將 user 表中 age字段長度改為 30,默認(rèn)值改為kong '',如果只修改默認(rèn)值,長度可以寫原本的值 ALTER TABLE `user` MODIFY age VARCHAR(30) DEFAULT '' ...... 如果要更新多個(gè)字段,按照字段名,字段類型(字段長度) DEFAULT 默認(rèn)值的方式追加即可
然后我在表中添加幾條數(shù)據(jù),有些字段沒有設(shè)置數(shù)據(jù),SQL語句如下,想自己動手的小伙伴自行復(fù)制執(zhí)行;
INSERT INTO `user` VALUES (1, '張三', '12345', 17, '12shfd', '男'); INSERT INTO `user` VALUES (2, '李四', NULL, 18, '', '男'); INSERT INTO `user` VALUES (3, 'NULL', NULL, NULL, '1763@qq', '女'); INSERT INTO `user` VALUES (4, '王五', NULL, NULL, '', '男'); INSERT INTO `user` VALUES (5, NULL, NULL, NULL, '', '');
執(zhí)行完畢后,數(shù)據(jù)表如圖,從這里我們就可以清晰地看出NULL值和空值的區(qū)別。
如果一個(gè)字段默認(rèn)值為NULL我們沒有填寫數(shù)據(jù),在表中就會顯示NULL;
如果一個(gè)字段默認(rèn)值為空值我們沒有填寫任何數(shù)據(jù),在表中就是一片空白,不會顯示NULL;
這里有一個(gè)誤區(qū),如果存儲的數(shù)據(jù)中某條數(shù)據(jù)用戶名為NULL,和在存儲的過程中沒有傳入用戶名數(shù)據(jù)庫采用用戶名默認(rèn)值NULL不是相等的,這個(gè)應(yīng)該很好理解。如下,id為3的那條數(shù)據(jù),表示用戶用戶名就是NULL,;

3. NULL值和空值查詢方式的區(qū)別
3.1 NULL 值的查詢方式
查詢一個(gè)字段的值是否為NULL,判斷條件為 IS NULL(字段值為默認(rèn)值NULL) 或 IS NOT NULL(字段值不為默認(rèn)值NULL);
舉例一:查詢 user 用戶表中字段 username 為 NULL 值的數(shù)據(jù):
SELECT * FROM `user` WHERE `user`.username IS NULL
執(zhí)行SQL,查到的只有id=5的這條數(shù)據(jù),符合預(yù)期結(jié)果;

舉例二:查詢 user 用戶表中字段 username 不為NULL值的數(shù)據(jù);
SELECT * FROM `user` WHERE `user`.username IS NOT NULL
執(zhí)行SQL,查到的是除了剛才id=5以外的四條數(shù)據(jù),符合預(yù)期結(jié)果;

3.2 空值的查詢方式
空值的查詢方式和普通字段查詢一樣,使用 "=" 或 "!=" 即可;
舉例一:查詢郵箱字段 email 為空值的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.email = '';
執(zhí)行SQL,結(jié)果查詢到id=2,4,5的三條數(shù)據(jù),符合預(yù)期

舉例二:查詢郵箱 email 和 性別 sex 都不為空值的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.email != '' AND `user`.sex != '';
執(zhí)行SQL語句,查詢到id=1,3的兩條數(shù)據(jù),符合預(yù)期

3.3 查詢NULL的方式可以查詢空值
舉例一:查詢默認(rèn)值為空值的字段 email 不為NULL的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.email IS NOT NULL;
執(zhí)行SQL,查到了表中全部五條數(shù)據(jù)

舉例二:查詢默認(rèn)值為空值的字段email不為NULL值的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.email IS NULL;
執(zhí)行SQL,沒有數(shù)據(jù),由此也可以說明 空值 != NULL

3.4 查詢空值的方法不可以查詢NULL值
舉例一:查詢字段age默認(rèn)值為NULL的為NULL的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.age = NULL;
執(zhí)行SQL,沒有查到任何數(shù)據(jù),但也沒有報(bào)錯(cuò),

舉例二:查詢年齡字段age不為NULL的數(shù)據(jù)
SELECT * FROM `user` WHERE `user`.age != NULL;
執(zhí)行SQL,結(jié)果仍然為空,可以看出,查詢空值的辦法并不適用于查詢NULL值,查詢NULL值只能使用IS NULL(為空),IS NOT NULL(不為空),否則會導(dǎo)致查詢結(jié)果不準(zhǔn)確

4. 聚合函數(shù)會計(jì)算空值但不計(jì)算NULL值
聚合函數(shù) COUNT(),MIN(),SUM()等,他們在計(jì)算數(shù)據(jù)的時(shí)候會計(jì)算空值,卻不會計(jì)算NULL值,這一點(diǎn)在COUNT() 計(jì)數(shù)函數(shù)中尤為明顯;
SELECT COUNT(`user`.age) FROM `user`;
執(zhí)行SQL,會發(fā)現(xiàn)結(jié)果是2,為什么呢?因?yàn)?user 表中id = 3,id=4,id=5這三條數(shù)據(jù)的age都是NULL,所以COUNT函數(shù)沒有將它們計(jì)算在內(nèi),得出的結(jié)果就只有兩條數(shù)據(jù);

我們再來看空值的情況
SELECT COUNT(`user`.email) FROM `user`;
執(zhí)行SQL,得出結(jié)果是5,和表中總記錄數(shù)5一致,而我們在上面也看到了,表中id=2,id=4,id=5這三條數(shù)據(jù)的 email 都為空值,但是COUNT函數(shù)仍然將它們計(jì)算在內(nèi),這就是空值和NULL最大的區(qū)別

到此這篇關(guān)于MySQL中空值和NULL的區(qū)別實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL 空值和NULL區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL默認(rèn)值(DEFAULT)和非空約束(NOT NULL)的實(shí)現(xiàn)
- MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解
- MySQL語句之條件語句IFNULL和COALESCE的區(qū)別說明
- MySQL中的case?when中對于NULL值判斷的坑及解決
- mysql ifnull不起作用原因分析以及解決
- 檢查MySQL中的列是否為空或Null的常用方法
- mysql?count()函數(shù)不計(jì)算null和空值問題
- mysql的case when字段為空,null的問題
- mysql?count?為null時(shí),顯示0的問題
- MySQL?5.7中NULL與‘?‘空字符值的多維度分析(詳解)
相關(guān)文章
DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫/表的基礎(chǔ)操作教程
DBeaver是一款功能強(qiáng)大的數(shù)據(jù)庫管理工具,支持創(chuàng)建多種數(shù)據(jù)庫,包括達(dá)夢數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫/表的基礎(chǔ)操作教程,需要的朋友可以參考下2024-02-02
Mysql恢復(fù)誤刪庫表數(shù)據(jù)完整場景演示
在開發(fā)和在生產(chǎn)中總會出現(xiàn)各種各樣的失誤和意味,當(dāng)MySQL的數(shù)據(jù)或表被刪除后不要慌,下面這篇文章主要給大家介紹了關(guān)于Mysql恢復(fù)誤刪庫表數(shù)據(jù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
MySQL和連接相關(guān)的timeout 的詳細(xì)整理
這篇文章主要介紹了MySQL和連接相關(guān)的timeout 的詳細(xì)整理的相關(guān)資料,本文主要總結(jié)下和連接有關(guān)的timeout,需要的朋友可以參考下2017-08-08
教你如何通過日志文件恢復(fù)MySQL數(shù)據(jù)
Binlog日志是二進(jìn)制日志文件,有兩個(gè)作用,一個(gè)是增量備份,另一個(gè)是主從復(fù)制,即主節(jié)點(diǎn)維護(hù)一個(gè)binlog日志文件,從節(jié)點(diǎn)從binlog中同步數(shù)據(jù),也可以通過binlog日志來恢復(fù)數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于如何通過日志文件恢復(fù)MySQL數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-02-02
Docker安裝MySQL?8.0兩個(gè)版本的命令總結(jié)
docker是一種開源的容器化平臺,可以將應(yīng)用程序及其依賴項(xiàng)打包成一個(gè)隔離的容器,然后在任何操作系統(tǒng)中運(yùn)行,MySQL是一個(gè)流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),這篇文章主要介紹了Docker安裝MySQL 8.0兩個(gè)版本的命令,需要的朋友可以參考下2026-03-03
mysql實(shí)現(xiàn)按組區(qū)分后獲取每組前幾名的sql寫法
這篇文章主要介紹了mysql實(shí)現(xiàn)按組區(qū)分后獲取每組前幾名的sql寫法,具有很好的參考價(jià)值,希望對大家有所幫助。2023-03-03
MySQL 5.6.36 Windows x64位版本的安裝教程詳解
這篇文章主要介紹了MySQL 5.6.36 Windows x64位版本的安裝教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-05-05

