百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MySQL 不一样的 NULL mysql null比较

wptr33 2024-11-09 15:00 27 浏览

你好,我是yes。

前不久看到面试群里有同学发表了一个疑问:

且这位同学还想了解下其中的原理:

是的,MySQL 中null 值确实无法通过这种条件筛选出来,因为 null 值的定义就跟普通值不一样

拿官网的例子来说:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

第一条 SQL 表达的意思是:不知道这个人的手机号码,用 null 表示未知。

第二条 SQL 表达的意思是:这个人就是没有手机号码,所以存了一个空字符串。

按照这个角度去看待群里同学的提问,其实不难理解为什么 xx!='xx' 查询不出 null 的数据了。

因为 null 值表示未知,它的值可能是任意你能想到的值,目前还不能定义它。

看到有同学可能不服:我不管它到底等于什么,反正从目前来看它是 null,它就 !='xx',所以应该查得出来。

额...怎么说呢,人家规矩就是这样定的,在人家的地盘上就得按人家的规矩办事。

MySQL 说:To look for NULL values, you must use the IS NULL

so,事情就是这样,也没啥好纠结的点,查 null 的语法就不一样。

不仅如此,看官网介绍,其实 null 还有其它不一样的地方。

When using DISTINCT, GROUP BY, or ORDER BY, all NULL values are regarded as equal.

当使用 DISTINCT, GROUP BY, 或者 ORDER BY 时候,null 值都会被认为是相等的,这个可以理解。

还有排序的时候,null 值默认会排在最前面,如果想放在最后面,用 DESC。

Aggregate (group) functions such as COUNT(), MIN(), and SUM() ignore NULL values

聚合函数,比如 count、min、max、sum 等,会忽略统计 null 值的字段。

比如现在有一个表 a,一共有 3 条数据,其中两条地址是 null。

当执行SELECT count(address) FROM sys.a;,结果只会返回 1。

所以,如果你实际的需求是统计行数的话,记得用 count(*),而不是某个可能为 null 的字段

最后

最后提炼下一些日常工作容易出错的点:

  1. null 值的过滤需要利用 is null 和 is not null,无法用 !=、<> 之类的来判断。
  2. 聚合函数统计需要注意使用可能为 null 字段的统计不一定是你想要的结果。
  3. 空指针,聚合函数使用可能为 null 字段时,可能返回值就是 null

还有,如果表中存在可能为 null 的字段,那么在实际存储上每条记录也会多花一个字节来表示当前记录目前某列是否为 null。

因此如果表内字段能确定一定不为 null,为了节省空间,都应该设为 not null。

官网网址:https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html

相关推荐

开发者必看的八大Material Design开源项目

MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...

另类插这么可爱,一定是…(另类t恤)

IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...

Android常用ADB命令(安卓adb工具是什么)

杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...

微软Mac版PowerPoint测试Reading Order Pane功能

IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...

Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍

前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...

用云存储30分钟快速搭建APP,你信吗?

背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...

谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果

Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...

iOS文本编辑控件UITextField和UITextVie

记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...

Android入门图文教程集锦(android 入门教程)

Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...

如何使用Android自定义复合视图(如何使用android自定义复合视图)

在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...

原生安卓开发app的框架frida常用关键代码定位

前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...

教程10 | 三分钟搞定一个智能输入法程序

一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...

(Android 8.1) 功能与新特性(android的功能)

和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...

怎样设置EditText内部文字被锁定不可删除和修改

在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...

如何阻止 Android 活动启动时 EditText 获得焦点

技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...