关于SQL语句中null值导致查询失效的原因

今天在写实验时,发现一下SQL语句没有达到预期结果:

select distinct au_lname, state 
from authors
where state not in
(
    select state from publishers
);

上网搜寻,发现大家跟我写的语句不一样,以下为网上写的语句(同样的查询需求):

select distinct au_lname, state 
from authors
where state not in
(
    select state from publishers
    where state is not null
);

这我就想不明白了:为什么子查询中的null值会导致not in失效呢?找了很久也没怎么有头绪。
后来一篇博客给我了启示,发现null值有以下特点:

NULL不能进行如何的“操作”
- 如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/)
- 如果null参与比较运算,则结果可视为false。(例如:>=,<=,<>等)
- 如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。
- 如果在not in子查询中有null值的时候,则不会返回数据

为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录?原因如下:

select *
from TableA as A
where a.id not in ( 2, null );
--等同于:
select *
from TableA as A
where a.id <> 2
and a.id <> null

由于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值