mysql同时用and和or关联查询条件,并且值包含null所遇到的坑

SQL查询技巧

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

今天写sql的时候,发现当某个字段的值为‘0’,‘1’,或者数据库默认的null的时候,用“!=”查询,结果集中是不包含null的

假如你这样写

SELECT
	*
FROM
	common_message
WHERE
	message_category = 'READ'
AND message_status != '0' 

查询出来的结果集是这样的:

然后我想,既然他缺少包含null的,我在用or拼接一下不就大功告成了嘛,遂把sql改成了这样,发现结果集还是不行,真是崩溃。

假如你这样写

SELECT
	*
FROM
	common_message
WHERE
	message_category = 'READ'
AND message_status != '0' or message_status IS NULL

查询出来的结果确实这样的


你会发现结果集中不仅包含READ还包含OPERATE,oh my god,我的and条件竟然失效了。

假如你这个时候你给or拼接的条件加个“()”,你会惊奇的发现,and有起作用了

SELECT
	*
FROM
	common_message
WHERE
	message_category = 'READ'
AND (message_status != '0' or message_status IS NULL)

PS:原因是and和or优先级一样,sql执行的时候按照顺序,所以结果集就不对了,如果加了“()”之后,优先级高了,就会先查找不等于0的和为null的,然后在这个基础上进行and条件的查询。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值