mysql if is not null_MySQL IS NULL判断值是否为NULL及优化详解
摘要:在本教程中,您将学习如何使用MySQL IS NULL运算符来判断值是否为NULL。
MySQL IS NULL运算符
要判断值是否为NULL,请使用IS NULL运算符。以下是IS NULL运算符的基本语法:
value IS NULL
如果值为NULL,则表达式返回true。否则,它返回false。
注意MySQL没有内置BOOLEAN类型。它使用TINYINT(1)来表示BOOLEAN 的值,如true表示1,flase表示0。
因为IS NULL是一个比较运算符,所以其他任何运算符使用的地方都可以使用IS NULL,例如,在 SELECT或WHERE子句中。请参见以下示例:
SELECT 1 IS NULL, -- 0
0 IS NULL, -- 0
NULL IS NULL; -- 1
要检查值是否为非NULL,请使用IS NOT NULL运算符如下:
value IS NOT NULL
如果值不是非NULL,此表达式将返回true(1)。否则,它返回false(0)。请看以下示例:
SELECT 1 IS NOT NULL, -- 1
0 IS NOT NULL, -- 1
NULL IS NOT NULL; -- 0
MySQL IS NULL示例
我们将使用示例数据库中的customers表进行实例演示。
要获得没有销售代表的客户,请使用IS NULL运算符,如下所示:
SELECT
customerName,
country,
salesrepemployeenumber
FROM
customers
WHERE
salesrepemployeenumber IS NULL
ORDER BY customerName;
结果如下图所示:
要获得具有销售代表的客户,您需要使用IS NOT NULL运算符:
SELECT
customerName,
country,
salesrepemployeenumber
FROM
customers
WHERE
salesrepemployeenumber IS NOT NULL
ORDER BY customerName;
结果如下图所示:
MySQL IS NULL的特殊功能
为了与ODBC程序兼容,MySQL支持IS NULL操作符的一些特殊功能。
1)如果DATE或DATETIME类型的字段具有NOT NUL约束并且包含特殊日期如0000-00-00,那么可以使用IS NULL运算符来查找这些行。
CREATE TABLE IF NOT EXISTS projects (
id INT AUTO_INCREMENT,
title VARCHAR(255),
begin_date DATE NOT NULL,
complete_date DATE NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO projects(title,begin_date, complete_date)
VALUES('New CRM','2020-01-01','0000-00-00'),
('ERP Future','2020-01-01','0000-00-00'),
('VR','2020-01-01','2030-01-01');
SELECT
*
FROM
projects
WHERE
complete_date IS NULL;
以上SQL代码创建了一个名为projects的表,并将一些数据插入到表中。最后一个sql语句使用了IS NULL运算符查询complete_date字段值为0000-00-00的行。
2)如果变量@@sql_auto_is_null设置为1,则可以在使用IS NULL运算符获取执行INSERT语句后生成列的值。请注意,默认情况下,变量@@sql_auto_is_null为0.请参见以下示例。
首先,将变量设置@@sql_auto_is_null为1。
SET @@sql_auto_is_null = 1;
第二,在projects表中插入一个新行:
INSERT INTO projects(title,begin_date, complete_date)
VALUES('MRP III','2010-01-01','2020-12-31');
第三,使用 IS NULL运算符获取生成id列的值:
SELECT
id
FROM
projects
WHERE
id IS NULL;
MySQL IS NULL优化
MySQL在col_name IS NULL 时做和 col_name = constant_value 一样的优化。例如,MySQL使用索引或者范围来根据 IS NUL L搜索 NULL。
SELECT * FROM tbl_name WHERE key_col IS NULL;
SELECT * FROM tbl_name WHERE key_col <=> NULL;
SELECT * FROM tbl_name
WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL;
如果一个 WHERE 子句包括了一个 col_name IS NULL 条件,并且这个字段声明为 NOT NULL,那么这个表达式就会被优化。当字段可能无论如何都会产生 NULL 值时,就不会再做优化了;例如,当它来自一个 LEFT JOIN 中右边的一个表时。
MySQL 4.1.1或更高会对连接 col_name = expr AND col_name IS NULL 做额外的优化, 常见的就是子查询。EXPLAIN 当优化起作用时会显示 ref_or_null。
优化程序会为任何索引部分处理 IS NULL。
以下几个例子中都做优化了,假使字段 a 和 表 t2 中 b 有索引了:
SELECT * FROM t1 WHERE t1.a=expr OR t1.a IS NULL;
SELECT * FROM t1,t2 WHERE t1.a=t2.a OR t2.a IS NULL;
SELECT * FROM t1,t2
WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;
SELECT * FROM t1,t2
WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);
SELECT * FROM t1,t2
WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)
OR (t1.a=t2.a AND t2.a IS NULL AND ...);
请注意,优化程序只会处理一个 IS NULL 级别。下面的查询中,MySQL只会使用键来查询表达式 (t1.a=t2.a AND t2.a IS NULL) 而无法使在 b 上使用索引部分:ref_or_null 首先读取引用键,然后独立扫描键值为 NULL 的记录。
SELECT * FROM t1,t2
WHERE (t1.a=t2.a AND t2.a IS NULL)
OR (t1.b=t2.b AND t2.b IS NULL);
在本教程中,您已经学习了如何使用MySQL IS NULL运算符来判断值是否为NULL。
mysql if is not null_MySQL IS NULL判断值是否为NULL及优化详解相关推荐
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
- mysql索引linke和等于_MySQL之SQL优化详解(三)
摘要: 致索引失效而转向全表扫描存储引擎不能使用索引中范围条件右边的列mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描isnull,isnotnull也无法使用索引l ...
- python判断是否回文_对python判断是否回文数的实例详解
设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...
- python判断输入数字大于0,对python 判断数字是否小于0的方法详解
对python 判断数字是否小于0的方法详解 为了精度更准确 可以使用数字的绝对值 < 1.0e-16 或者 < 1.0e-8来对比 abs(Num) 以上这篇对python 判断数字是 ...
- 如何判断立即数的合法性?(详解详析)
如何判断立即数的合法性?(详解详析) <ARM体系结构与编程>一书中对立即数有这样的描述:每个立即数由一个8位的常数循环右移偶数位得到. 一个32位的常数,只有能够通过上面构造方法得到的才 ...
- c语言中limit 用法,mysql limit用法及优化详解
摘要 腾兴网为您分享:mysql limit用法及优化详解,一点万象,喜马拉雅,唯品会,图乐等软件知识,以及盟重土城花屏补丁,宝马车主俱乐部,本地文件搜索,锁定刷新率,发券,微信多开真正版,云门禁,真 ...
- mysql int类型为null_MySQL INT类型可以为非零NULL吗?
您可以将INT列的值设置为NULL.INT列键入可为空的列.语法如下:INSERT INTO yourTableName(yourIntColumnName) values(NULL); 为了理解上述 ...
- 03 mysql数据查询_MySql学习day03:数据表之间的连接、查询详解
主键: 关键字:primary key 特点:不能为null,并且唯一. 主键分类: 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐) 业务主键:例如username,参与实 ...
- mysql 事务 数量_MySQL 数据查询语言(DQL) 事务控制语言(TCL)详解
一. 数据查询语言(DQL)(重中之重) 完整语法格式: select 表达式1|字段,.... [from 表名 where 条件] [group by 列名] [having 条件] [order ...
最新文章
- ISME:林科院袁志林等-冷杉优势真菌共生发育的基因家族趋同演化及平衡选择机制...
- 邀请别人进入队伍rust_林俊杰组建DOTA2队伍,原Newbee五人被终身禁赛
- 敏捷开发-Scrum与精益相得益彰
- 五相同步电机matlab模型,五相永磁同步电机空间矢量PWM控制系统MATLAB仿真
- 用Python绘制棒棒糖图表,真的好看!
- NSArray 和 NSMutableArray
- 一起聊聊操作简单又高效的Excel数据透视表
- tp6 api请求返回参数统一配置方法
- 详解 torch.max 函数
- ubantu 20.04 系统重装
- Shell-基础部分
- matlab里面axis auto,Matlab中axis函数用法总结-Go语言中文社区
- Amazon EKS基于GitLab的CICD实践二 基础架构和应用架构创建篇
- fooview辅助功能 shell_FV浮动阅览器fooView——一款功能十分强大的浮动按钮
- 视频教程-按键精灵手机版解放您的双手自动化教程-Android
- mac网页java无法加载,chrome浏览器mac版无法加载怎么办_chrome浏览器mac版打不开网页解决方法-win7之家...
- 快速刷入recovery的方法
- 父亲母亲-给父亲唱一首歌
- angular 代码生成器_使用Angular 10构建QR代码生成器
- 每天一个Linux命令(22):文件属性详解
热门文章
- 微信H5游戏 小说公众号域名被拦截之解决
- After Effects Apprentice: 17 Video Walls in Cinema 4D Lite After Effects学徒17:Cinema 4D Lite中的视频墙 Ly
- Android底部导航栏的四种实现
- Flask学习之旅——1.1初识Flask
- 一种快速在excel里转换编码方式为utf-8的方法
- c++十六进制加法_详解C++中十六进制字符串转数字(数值)
- android开发与程序员的副业
- 最新SQL数据库面试题以及答案!
- 大数据 之 谜 之 低级bug
- 图片搜索淘宝商品接口