电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

瀏覽:32日期:2023-10-07 08:01:57

正式開始之前,我們先來看下 MySQL 服務(wù)器的配置和版本號(hào)信息,如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

“兵馬未動(dòng)糧草先行”,看完了相關(guān)的配置之后,我們先來創(chuàng)建一張測(cè)試表和一些測(cè)試數(shù)據(jù)。

-- 如果存在 person 表先刪除DROP TABLE IF EXISTS person; -- 創(chuàng)建 person 表,其中 username 字段可為空,并為其設(shè)置普通索引CREATE TABLE person ( id INT PRIMARY KEY auto_increment, name VARCHAR(20), mobile VARCHAR(13), index(name)) ENGINE=’innodb’; -- person 表添加測(cè)試數(shù)據(jù)insert into person(name,mobile) values(’Java’,’13333333330’), (’MySQL’,’13333333331’), (’Redis’,’13333333332’), (’Kafka’,’13333333333’), (’Spring’,’13333333334’), (’MyBatis’,’13333333335’), (’RabbitMQ’,’13333333336’), (’Golang’,’13333333337’), (NULL,’13333333338’), (NULL,’13333333339’); select * from person;

構(gòu)建的測(cè)試數(shù)據(jù),如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

有了數(shù)據(jù)之后,我們就來看當(dāng)列中存在 NULL 值時(shí),究竟會(huì)導(dǎo)致哪些問題?

1.count 數(shù)據(jù)丟失

當(dāng)某列存在 NULL 值時(shí),再使用 count 查詢?cè)摿校蜁?huì)出現(xiàn)數(shù)據(jù)“丟失”問題,如下 SQL 所示:

select count(*),count(name) from person;

查詢執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

從上述結(jié)果可以看出,當(dāng)使用的是 count(name) 查詢時(shí),就丟失了兩條值為 NULL 的數(shù)據(jù)丟失。

解決方案

如果某列存在 NULL 值時(shí),就是用 count(*) 進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。

擴(kuò)展知識(shí):不要使用 count(常量)

阿里巴巴《Java開發(fā)手冊(cè)》強(qiáng)制規(guī)定:不要使用 count(列名) 或 count(常量) 來替代 count(),count() 是 SQL92 定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法,跟數(shù)據(jù)庫(kù)無關(guān),跟 NULL 和非 NULL 無關(guān)。

說明:count(*) 會(huì)統(tǒng)計(jì)值為 NULL 的行,而 count(列名) 不會(huì)統(tǒng)計(jì)此列為 NULL 值的行。

2.distinct 數(shù)據(jù)丟失

當(dāng)使用 count(distinct col1, col2) 查詢時(shí),如果其中一列為 NULL,那么即使另一列有不同的值,那么查詢的結(jié)果也會(huì)將數(shù)據(jù)丟失,如下 SQL 所示:

select count(distinct name,mobile) from person;

查詢執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

數(shù)據(jù)庫(kù)的原始數(shù)據(jù)如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

從上述結(jié)果可以看出手機(jī)號(hào)一列的 10 條數(shù)據(jù)都是不同的,但查詢的結(jié)果卻為 8。

3.select 數(shù)據(jù)丟失

如果某列存在 NULL 值時(shí),如果執(zhí)行非等于查詢(<>/!=)會(huì)導(dǎo)致為 NULL 值的結(jié)果丟失。比如以下這個(gè)數(shù)據(jù):

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

我需要查詢除 name 等于“Java”以外的所有數(shù)據(jù),預(yù)期返回的結(jié)果是 id 從 2 到 10 的數(shù)據(jù),但當(dāng)執(zhí)行以下查詢時(shí):

select * from person where name<>’Java’ order by id;-- 或select * from person where name!=’Java’ order by id;

查詢結(jié)果均為以下內(nèi)容:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

可以看出為 NULL 的兩條數(shù)據(jù)憑空消失了,這個(gè)結(jié)果并不符合我們的正常預(yù)期。

解決方案

要解決以上的問題,只需要在查詢結(jié)果中拼加上為 NULL 值的結(jié)果即可,執(zhí)行 SQL 如下:

select * from person where name<>’Java’ or isnull(name) order by id;

最終的執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

4.導(dǎo)致空指針異常

如果某列存在 NULL 值時(shí),可能會(huì)導(dǎo)致 sum(column) 的返回結(jié)果為 NULL 而非 0,如果 sum 查詢的結(jié)果為 NULL 就可以能會(huì)導(dǎo)致程序執(zhí)行時(shí)空指針異常(NPE),我們來演示一下這個(gè)問題。

首先,我們先構(gòu)建一張表和一些測(cè)試數(shù)據(jù):

-- 如果存在 goods 表先刪除DROP TABLE IF EXISTS goods; -- 創(chuàng)建 goods 表CREATE TABLE goods ( id INT PRIMARY KEY auto_increment, num int) ENGINE=’innodb’; -- goods 表添加測(cè)試數(shù)據(jù)insert into goods(num) values(3),(6),(6),(NULL); select * from goods;

表中原始數(shù)據(jù)如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

接下來我們使用 sum 查詢,執(zhí)行以下 SQL:

select sum(num) from goods where id>4;

查詢執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)當(dāng)查詢的結(jié)果為 NULL 而非 0 時(shí),就可以能導(dǎo)致空指針異常。

解決空指針異常

可以使用以下方式來避免空指針異常:

select ifnull(sum(num), 0) from goods where id>4;

查詢執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

5.增加了查詢難度

當(dāng)某列值中有 NULL 值時(shí),在進(jìn)行 NULL 值或者非 NULL 值的查詢難度就增加了。

所謂的查詢難度增加指的是當(dāng)進(jìn)行 NULL 值查詢時(shí),必須使用 NULL 值匹配的查詢方法,比如 IS NULL 或者 IS NOT NULL 又或者是 IFNULL(cloumn) 這樣的表達(dá)式進(jìn)行查詢,而傳統(tǒng)的 =、!=、<>... 等這些表達(dá)式就不能使用了,這就增加了查詢的難度,尤其是對(duì)小白程序員來說,接下來我們來演示一下這些問題。

還是以 person 表為例,它的原始數(shù)據(jù)如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

錯(cuò)誤用法 1:

select * from person where name<>null;

執(zhí)行結(jié)果為空,并沒有查詢到任何數(shù)據(jù),如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

錯(cuò)誤用法 2:

select * from person where name!=null;

執(zhí)行結(jié)果也為空,沒有查詢到任何數(shù)據(jù),如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

正確用法 1:

select * from person where name is not null;

執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

正確用法 2:

select * from person where !isnull(name);

執(zhí)行結(jié)果如下:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

推薦用法

阿里巴巴《Java開發(fā)手冊(cè)》推薦我們使用 ISNULL(cloumn) 來判斷 NULL 值,原因是在 SQL 語句中,如果在 null 前換行,影響可讀性;而 ISNULL(column) 是一個(gè)整體,簡(jiǎn)潔易懂。從性能數(shù)據(jù)上分析 ISNULL(column) 執(zhí)行效率也更快一些。

擴(kuò)展知識(shí):NULL 不會(huì)影響索引

細(xì)心的朋友可能發(fā)現(xiàn)了,我在創(chuàng)建 person 表的 name 字段時(shí),為其創(chuàng)建了一個(gè)普通索引,如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

然后我們用 explain 來分析查詢計(jì)劃,看當(dāng) name 中有 NULL 值時(shí)是否會(huì)影響索引的選擇。

explain 的執(zhí)行結(jié)果如下圖所示:

MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)

從上述結(jié)果可以看出,即使 name 中有 NULL 值也不會(huì)影響 MySQL 使用索引進(jìn)行查詢。

總結(jié)

本文我們講了當(dāng)某列為 NULL 時(shí)可能會(huì)導(dǎo)致的 5 種問題:丟失查詢結(jié)果、導(dǎo)致空指針異常和增加了查詢的難度。因此在最后提倡大家在創(chuàng)建表的時(shí)候盡量設(shè)置 is not null 的約束,如果某列確實(shí)沒有值,可以設(shè)置空值(’’)或 0 作為其默認(rèn)值。

到此這篇關(guān)于MySQL為Null會(huì)導(dǎo)致5個(gè)問題(個(gè)個(gè)致命)的文章就介紹到這了,更多相關(guān)MySQL為Null導(dǎo)致問題內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
主站蜘蛛池模板: 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 电表箱-浙江迈峰电力设备有限公司-电表箱专业制造商 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 牛奶检测仪-乳成分分析仪-北京海谊 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 北京公寓出租网-北京酒店式公寓出租平台 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 |