加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql查询中null值的坑

发布时间:2023-01-08 09:31:56 所属栏目:MySql教程 来源:未知
导读: Mysql数据库中,有时候会遇到字段为null的情况,导致查询的结果可能与预期的不一致。
今天看看可能会受null值影响的语句有哪些。
一、count(列名)
当某字段存在 null值 时,count(列名)

Mysql数据库中,有时候会遇到字段为null的情况,导致查询的结果可能与预期的不一致。

今天看看可能会受null值影响的语句有哪些。

一、count(列名)

当某字段存在 null值 时,count(列名) 是不会把 null 值计算出来;

count(*) , count(1) ,null值会被计算入内。

数据表如下:

mysql的分页查询_mysql查询当天数据_mysql查询

SELECT count(*) FROM `test2`;

mysql的分页查询_mysql查询当天数据_mysql查询

SELECT count(1) FROM `test2`;

SELECT count(runoob_id) FROM `test2`;

mysql查询当天数据_mysql查询_mysql的分页查询

二、null值不=null

判断字段是否为null,要使用is null,不能使用=null

SELECT * FROM `test2` where runoob_id = NULL;

mysql查询当天数据_mysql的分页查询_mysql查询

SELECT * FROM `test2` where runoob_id IS NULL;

mysql的分页查询_mysql查询_mysql查询当天数据

三、NULL值排序

如果使用ORDER BY子句以升序对结果集排序,MySQL认为NULL值低于其他值,因此,它首先显示NULL值。

SELECT * FROM `test2` order by runoob_id;

mysql查询当天数据_mysql查询_mysql的分页查询

四、group by null

即使NULL不等于NULLmysql查询,但是在GROUP BY子句中的两个NULL值也是相等的。

修改表的数据如下:

mysql的分页查询_mysql查询当天数据_mysql查询

SELECT * FROM `test2` group by runoob_id;

mysql查询当天数据_mysql的分页查询_mysql查询

可以看到runoob_title为'test5'的记录没有被查询出来,因为即使NULL不等于NULL,但是在GROUP BY子句中的两个NULL值也是相等的。

五、not in 与null

1.not in 子查询中包含null值时,查询结果为空。

新建数据表test3

mysql查询当天数据_mysql查询_mysql的分页查询

test2表如下图:

mysql查询当天数据_mysql的分页查询_mysql查询

test2中不存在runoob_id为4 的记录。

SELECT * FROM `test3` where runoob_id  not in (select runoob_id from test2 )

mysql查询当天数据_mysql的分页查询_mysql查询

SELECT?*?FROM?`test3`?where?runoob_id??not?in?(select?runoob_id?from?test2?where?runoob_id?is?not?null)

mysql查询当天数据_mysql的分页查询_mysql查询

not in的实现原理是,对每一个table1.name和每一个table2.name(括号内的查询结果)进行不相等比较(!=)。

sql中任意!=null的运算结果都是false,所以如果table2中存在一个null,not in的查询永远都会返回false,即查询结果为空

2.not in 语句不会对null值进行匹配,即查询不到null值记录

mysql查询_mysql的分页查询_mysql查询当天数据

mysql的分页查询_mysql查询当天数据_mysql查询

六、in与null

in语句中不会对null值进行匹配,即查询不到null值记录

mysql查询当天数据_mysql查询_mysql的分页查询

七、count(distinct 列名1,列名2,列名n)

当使用 count(distinct col1, col2)查询时,如果其中一列为 NULL,那么即使另一列有不同的值,那么查询的结果也会将数据丢失。

test2表新增一行数据

mysql查询_mysql查询当天数据_mysql的分页查询

SELECT distinct runoob_id,runoob_title FROM `test2`;

mysql查询_mysql的分页查询_mysql查询当天数据

可以看到,每条数据都是能查询到的。

SELECT count(distinct runoob_id,runoob_title) FROM `test2` 

mysql的分页查询_mysql查询_mysql查询当天数据

可以看到,runoob_title为’test3‘的记录没有被查询出来。

总结:

mysql的分页查询_mysql查询_mysql查询当天数据

微信号|数据分析之路data

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!