MySQL中空值和NULL的區(qū)別小結(jié)
1. NULL和空值定義上的區(qū)別
在 MySQL 中,NULL 值和空值是兩個(gè)不同的概念,空值就是我們常說的空字符串,用兩個(gè)單引號(hào) '' 代替即可;
NULL 值在MySQL中是占用空間的,而空值則是不占用長(zhǎng)度空間的。
舉個(gè)最簡(jiǎn)單的例子。
如果把數(shù)據(jù)比作水果,表中的每一個(gè)空位比作一個(gè)個(gè)箱子,水果要放進(jìn)箱子里存儲(chǔ);
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 字段名 字段類型(要修改為的長(zhǎng)度) DEFAULT '要修改為的默認(rèn)值'; # 舉例語句 # 將 user 表中 age字段長(zhǎng)度改為 30,默認(rèn)值改為kong '',如果只修改默認(rèn)值,長(zhǎng)度可以寫原本的值 ALTER TABLE `user` MODIFY age VARCHAR(30) DEFAULT '' ...... 如果要更新多個(gè)字段,按照字段名,字段類型(字段長(zhǎng)度) DEFAULT 默認(rèn)值的方式追加即可
然后我在表中添加幾條數(shù)據(jù),有些字段沒有設(shè)置數(shù)據(jù),SQL語句如下,想自己動(dòng)手的小伙伴自行復(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ù),在表中就會(huì)顯示NULL;
如果一個(gè)字段默認(rèn)值為空值我們沒有填寫任何數(shù)據(jù),在表中就是一片空白,不會(huì)顯示NULL;
這里有一個(gè)誤區(qū),如果存儲(chǔ)的數(shù)據(jù)中某條數(shù)據(jù)用戶名為NULL,和在存儲(chǔ)的過程中沒有傳入用戶名數(shù)據(jù)庫(kù)采用用戶名默認(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(不為空),否則會(huì)導(dǎo)致查詢結(jié)果不準(zhǔn)確
4. 聚合函數(shù)會(huì)計(jì)算空值但不計(jì)算NULL值
聚合函數(shù) COUNT(),MIN(),SUM()等,他們?cè)谟?jì)算數(shù)據(jù)的時(shí)候會(huì)計(jì)算空值,卻不會(huì)計(jì)算NULL值,這一點(diǎn)在COUNT() 計(jì)數(shù)函數(shù)中尤為明顯;
SELECT COUNT(`user`.age) FROM `user`;
執(zhí)行SQL,會(huì)發(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ù);
我們?cè)賮砜纯罩档那闆r
SELECT COUNT(`user`.email) FROM `user`;
執(zhí)行SQL,得出結(jié)果是5,和表中總記錄數(shù)5一致,而我們?cè)谏厦嬉部吹搅耍?strong>表中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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL默認(rèn)值(DEFAULT)和非空約束(NOT NULL)的實(shí)現(xiàn)
- MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解
- MySQL語句之條件語句IFNULL和COALESCE的區(qū)別說明
- MySQL中的case?when中對(duì)于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)文章
解決MySQL8.0本地計(jì)算機(jī)上的MySQL服務(wù)啟動(dòng)后停止沒有報(bào)告任何錯(cuò)誤的問題(最新推薦)
解決MySQL服務(wù)啟動(dòng)后停止沒有報(bào)告任何錯(cuò)誤的方法包括修改my.ini文件編碼為ANSI、修正MySQL服務(wù)可執(zhí)行文件的路徑以及關(guān)閉系統(tǒng)管理中的MySQL80服務(wù),本文介紹解決MySQL8.0本地計(jì)算機(jī)上的MySQL服務(wù)啟動(dòng)后停止沒有報(bào)告任何錯(cuò)誤,感興趣的朋友一起看看吧2025-03-03修改MySQL數(shù)據(jù)庫(kù)中表和表中字段的編碼方式的方法
這篇文章主要介紹了如何修改MySQL數(shù)據(jù)庫(kù)中表和表中字段的編碼方式,需要的朋友可以參考下2014-05-05MySQL存儲(chǔ)過程in、out和inout參數(shù)示例和總結(jié)
這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)過程in、out和inout參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解
這篇文章主要介紹了MYSQL數(shù)據(jù)插入之返回自增主鍵ID的方法詳解,mysql中的insert插入之后會(huì)有返回值,返回的是影響的行數(shù),也就是說,成功插入一條數(shù)據(jù)之后返回的是1,失敗則返回0,那么,很多時(shí)候我們都想要得到最后插入的id值,需要的朋友可以參考下2023-10-10MySQL并發(fā)更新數(shù)據(jù)時(shí)的處理方法
在后端開發(fā)中我們不可避免的會(huì)遇見MySQL數(shù)據(jù)并發(fā)更新的情況,作為一名后端研發(fā),如何解決這類問題也是必須要知道的,同時(shí)這也是面試中經(jīng)??疾斓闹R(shí)點(diǎn)。2019-05-05