【MySQL】MySQL 字段为 NULL 的5大坑

文章讨论了在SQL查询中NULL值如何影响count函数、distinct操作以及比较运算,导致数据丢失和潜在的空指针异常。解决方案包括使用ifnull()函数处理空值以及使用ISNULL或ISNOTNULL条件。此外,含有NULL值的字段增加了查询的复杂性,需要特定的语法进行非NULL或NULL查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据准备

建立一张表
在这里插入图片描述
数据如下:
在这里插入图片描述

1.count 数据丢失

count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。

select count(*),count(name) from person;
-----------------------
count(*) |  count(name)
 10      |  8
 -------------------------

从结果可以看出,count(*)和count(name)的值不一样,即当使用的是 count(name) 查询时,就丢失了两条值为 NULL 的数据。

2.distinct 数据丢失

当使用语句count(distinct column1,column2)时,如果有一个字段值为空,即使另一列有不同的值,那么查询的结果也会将数据丢失, SQL如下所示:

select count(distinct name,mobile) from person;
-----------------------
 count(distinct name,mobile)
 8
 -------------------------

3.select 数据丢失

如果某列存在 NULL 值时,如果执行非等于查询(<>或者!=)会导致为 NULL 值的结果丢失,比如下面的这些数据:

select * from person where name <> 'Java' order by id
-------------------------------------
id    |   name    |  mobile
2     |   MySQL   |  13333333333331
3     |   Redis   |  13333333333332
4     |   Kafka   |  13333333333333
5     |   Spring  |  13333333333334
6     |   MyBatis |  13333333333335
7     |   RabbitMQ|  13333333333336
8     |   Golang  |  13333333333337
 ------------------------------------

可以看出id=9和id=10的name为 NULL 的两条数据没有查询出来,这个结果并不符合我们的正常预期。
要全部查出可以用以下sql:

select * from person where name != 'Java' or isnull(name) order by id

4.导致空指针异常

表数据如下:
在这里插入图片描述

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

-----------------------
sum(num)
 NULL
 -------------------------

解决方法:可以使用ifnull()对空值进行处理来避免空指针异常:

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

5.增加了查询难度

当字段中有了空值,对于null值或者非null值的查询难度就增加了,必须使用与null匹配的查询方法,比如IS NULL或者IS NOT NULL又或者是IFNULL(cloumn)这样的表达式进行查询,传统的 =、!=、<>…这些表达式就不能使用了,这就增加了查询的难度。
在这里插入图片描述

select * from person where name !=null;
//没有任何数据
-------------------------------------
id    |   name    |  mobile

 ------------------------------------

select * from person where name is not null
//这种就有数据
-------------------------------------
id    |   name    |  mobile
2     |   MySQL   |  13333333333331
3     |   Redis   |  13333333333332
4     |   Kafka   |  13333333333333
5     |   Spring  |  13333333333334
6     |   MyBatis |  13333333333335
7     |   RabbitMQ|  13333333333336
8     |   Golang  |  13333333333337
 ------------------------------------
### PostgreSQL 查询错误解决方案 在 PostgreSQL 版本更新过程中,某些字段可能被移除或更改。对于 `datlastsysoid` 字段,在 Postgres 15 中已被从 `pg_database` 表中删除,这导致了查询语句 `SELECT DISTINCT datlastsysoid FROM pg_database;` 报错提示字段不存在[^4]。 针对这一情况,建议采取如下措施: #### 修改客户端配置文件 如果使用的是 Navicat 或其他第三方工具连接到 PostgreSQL 数据库并遇到了这个问题,则可能是由于这些工具内部使用的 SQL 查询包含了已废弃的字段名。此时应考虑联系软件供应商获取最新版本的应用程序,或者尝试手动调整应用程序所依赖的相关 DLL 文件来修正此问题[^2]。 #### 更新驱动程序和库文件 确保正在使用的 JDBC 驱动或其他接口层是最新的稳定版。旧版本可能会存在兼容性问题,特别是当它们试图访问已经被新版本数据库淘汰的数据结构时。官方发布的最新驱动通常会修复这类已知的问题,并提供更好的性能优化和支持更多特性。 #### 替换查询中的过期字段名称 直接编辑有问题的 SQL 脚本,去除对不再存在的列 `datlastsysoid` 的引用。根据实际需求重新构建合适的查询逻辑。例如可以改为只选择必要的信息而不涉及这个特定属性: ```sql -- 更改后的查询示例 SELECT oid, datname FROM pg_database; ``` 通过上述方法之一应该能够有效解决因为缺 `datlastsysoid` 列而导致的操作失败现象。值得注意的是,最佳实践是保持所有组件处于最新的维护状态以获得最广泛的支持和服务保障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值