mysql數(shù)據NULL避坑指南分享
NULL空值是mysql中一種特殊的數(shù)據值(即"缺少的未知值"),NULL和字符串空值不是一回事,處理NULL與其他值不同,下面具體闡述相關差異:
一、NULL運算符
1、普通數(shù)據
普通數(shù)據使用 > 、< 、=即可做常用的邏輯運算如下:
SELECT 1>2, 1<2 ,1=2,1<>2;
執(zhí)行結果:
如果使用 > 、< 、= 對NULL進行運算,那么會是什么結果
SELECT 1>NULL, 1<NULL,1=NULL,1<>NULL;
執(zhí)行結果:
通過實驗結果可知,正常的 > < = 是無法對NULL就行運算操作的,因此在日常開發(fā)中,如果使用一個NULL值做> < 過濾查詢,過濾條件將無法生效,接下來具體研究NULL的運算符。
2、 IS NULL 和 IS NOT NULL
對于NULL的運算mysql提供了IS NULL 、IS NOT NULL函數(shù)進行處理
SELECT NULL IS NULL , NULL IS NOT NULL, 1 IS NULL, 1 IS NOT NULL;
二、NULL 查詢優(yōu)化
對于某列字段存在大量NULL值,而此列字段不得不加索引,那么使用 IS NULL 、IS NOT NULL 可以提高查詢效率。
創(chuàng)建一張t_staff表:
CREATE TABLE `t_staff11` ( `staff_no` varchar(30) COMMENT '職工號', `staff_name` varchar(10) COMMENT '職工姓名', `staff_sex` char(1) COMMENT '性別(1男,2女)', `password` varchar(255) COMMENT '密碼', `update_time` datetime(0) COMMENT '更新時間', `status` char(1) DEFAULT '0' COMMENT '帳號狀態(tài)(0正常 1停用)', `del_flag` char(1) DEFAULT '0' COMMENT '刪除標志(0代表存在 2代表刪除)', `balance` decimal(10, 2) COMMENT '卡余額' ) ENGINE = InnoDB CHARACTER SET = utf8mb4;
插入測試數(shù)據:
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (71, '韓杰', NULL, 'a5646cc4c84c996ca6620e7d403d6666', NULL, NULL, '0', 1439.20);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (113, '高秀麗', NULL, '82ad07da3d6a7a22d443aa7bd646910d', NULL, NULL, '0', 20.03);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (121, '范嶸', NULL, 'fb207643a9ea6f52b3664f9ecf99bc0a', '2020-07-08 07:30:49', NULL, '0', 673.05);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (160, '馬春霞', NULL, 'fa348453e2bebb83452bbd0a304f57ae', NULL, NULL, '0', 196.20);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (161, '何愛蓮', '1', '9a236449276f8218a8ac5f5b9b194fd0', NULL, NULL, '0', 380.19);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (171, '馮文靜', '1', '414781c1fca2da7e682176aa5849ee2f', NULL, NULL, '0', 490.17);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (175, '許春景', '2', '2b32513984f4bb87a9f8c3270bc1d271', NULL, NULL, '0', 415.10);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (181, '王方', '2', '23dea74889375b09b46f41639559164e', '2020-07-09 09:20:12', NULL, '0', 14.80);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (182, '劉瑞雪', NULL, 'ef3c90bbd1366194c5f6760b1e832616', NULL, NULL, '0', 595.40);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (218, '陸寓非', NULL, '31ad4cf6368c8b04edded92d660e105f', NULL, NULL, '0', 573.30);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (227, '安鳳偉', NULL, 'c84d9c929ffe7810470952deccd0f9d8', NULL, NULL, '0', 1412.90);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (234, '張麗', NULL, 'da2e045d2c028960b6f4e4712635032c', NULL, NULL, '0', 381.03);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (267, '沈彩霞', NULL, '0f984f9f5fe54eed031fa6079aa27307', NULL, NULL, '0', 3252.77);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (289, '王東梅', NULL, 'c6666174b32e7555a9557800721d35c7', NULL, NULL, '0', 240.46);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (333, '鄒梅', NULL, 'c8acdc2e4824cbf6ac51a7ea76f1f2e6', NULL, NULL, '0', 2223.70);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (339, '董蓓', NULL, '009c26ababd97b0cdb8f277d8c20beee', NULL, NULL, '0', 526.90);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (361, '羅素霞', NULL, '2a089e222d3547b7b60eef4810488f59', NULL, NULL, '0', 2941.00);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (366, '趙艷秋', NULL, '848b0d4e401ceb2d4b01ce74ca5c2b65', NULL, NULL, '0', 1331.91);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (372, '王玉琴', NULL, 'c7453dbe0269a3ae79ba5094f66d050d', NULL, NULL, '0', 3139.20);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (388, '張艷玲', NULL, '2336b05aef2565f62afeba502e545358', NULL, NULL, '0', 602.45);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (390, '郭艷璟', NULL, 'b2f8c3fab16fb554887621e46365862e', '2020-05-19 21:04:25', NULL, '0', 5.50);
INSERT INTO`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) VALUES (392, '王麗', NULL, 'bf3925cd423c9dc6a911fa32772e4e70', NULL, NULL, '0', 254.79);
由于satf_sex字段存在大兩空值,在其列加索引
ALTER TABLE t_staff ADD INDEX sexIndex(staff_sex);
查詢staff_sex為1的數(shù)據;
1、普通等號(=)查詢
EXPLAIN SELECT * FROM t_staff WHERE staff_sex =1;
執(zhí)行結果如下:
明明在staff_sex列加索引了,為啥不走索引全表掃描呢,這就就NULL搞的鬼。
2、IS NOT NULL 查詢
EXPLAIN SELECT * FROM t_staff WHERE staff_sex IS NOT NULL AND staff_sex =1;
查看執(zhí)行結果:
這一次查詢索引生效,大大的提高查詢效率。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL在右表數(shù)據不唯一的情況下使用left join的方法
這篇文章主要介紹了MySQL在右表數(shù)據不唯一的情況下使用left join的方法,針對右表符合條件表達式的記錄數(shù)大于1條時left join所顯示的結果需求來講,需要的朋友可以參考下2016-03-03MYSQL IN 與 EXISTS 的優(yōu)化示例介紹
當B表的數(shù)據集必須小于A表的數(shù)據集時,用in優(yōu)于exists,當A表的數(shù)據集系小于B表的數(shù)據集時,用exists優(yōu)于in2014-08-08MySQL切分函數(shù)substring()的具體使用
這篇文章主要介紹了MySQL切分函數(shù)substring()的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02