-
表结构
-
初始化数据
insert into test_in(name, hobby, sex, school) values('张一','打球',1,'北京大学');
insert into test_in(name, hobby, sex, school) values('张二','看书',null,'清华大学');
insert into test_in(name, hobby, sex, school) values('张三','游泳',1,null);
insert into test_in(name, hobby, sex, school) values('张四','跳绳',1,'大连大学');
insert into test_in(name, hobby, sex, school) values('张五','健身',2,'青岛大学');
insert into test_in(name, hobby, sex, school) values('张六','学习',2,'吉林大学');
- 查询结果:
select * from test_in;
- 正常in的使用:
select * from test_in where sex in (1);
- 有null值的in使用:
select * from test_in where sex in (1,null);
划重点:SQL中使用in时,会忽略null值的记录,即不会查询出列值为null的数据。
- 正常not in的使用:
select * from test_in where sex not in (1);
划重点:SQL中使用not in时,如果 not in后面的选项中没有null,只会查询从列值不为空的列中过滤,即会过滤掉列值为null的数据。
- 有null值的not in的使用:
select * from test_in where sex not in (1, null);
划重点:SQL中使用not in时,如果not in后面的选项中有null,则不会查询出来任何数据。因为sql语句本身直接返回false,所以使用not in时候,要保证not in后的条件值不会出现null,不然可能会出现意想不到的情况。
一. 表结构和初始化数据表结构初始化数据insert into test_in(name, hobby, sex, school) values('张一','打球',1,'北京大学');insert into test_in(name, hobby, sex, school) values('张二','看书',null,'清华大学');insert into test_in(name, hobby, sex, school) values('张三','游泳',1,null);insert
1)in的逻辑规则是or not in 的逻辑规则是 and
2)判断null 的sql语句为 is not null 或者 is null
3)当遇到 null = null 的判断是时由于不符合null的判断规则,所以结果一定为flase
not in 中包含null值的情况
select *
from A
where A.name not in
(select B.name
from B )
在上面的not in的查询中如果B表的name字段.
select * from emp e where e.comm in (300, 500, null);
2. 使用not in的时候,如果 not in后面的选项中没有null,只会查询从comm列不为空的列中过滤,会过滤掉comm为null的数据
select * from emp e where e.comm not in (300, 500);
3.使用not in 的时候,如.
SELECT * FROM user WHERE password in (‘44’,null)
这样是无法将zhangsan 这条数据查出来但使用ifnull就能够解决这个问题
SELECT * FROM user WHERE IFNULL(password,‘’) in (‘44’,‘’)使用ifnull将Null值转换成 空串’’ 然后条件添加空串就能将null值查询出来
NULL表示不知道是什么,就是说NULL的原意是不知道是什么,表示可能什么都是。
NULL与?做比较
PRINT (Case When NULL ='Value' Then 'true' else 'false' end)
PRINT (Case When NULL!='Value' Then 'true' ...
Hive
中的not in函数有一个隐藏的陷阱,当not in()
中的数值
包含NULL,匹不上的数据会返回
NULL而不是True。
所以当在where
中使用not in子查询进行筛选,一定要记得去除
NULL值。
样例代码:
--not in的原始结果
select num,num not in (
null,'2'), num not in (
null,'2') and true from
原查询语句:
SELECT `DEVICE_NO`,`SYS_NO`,`STATION_NO` ,`DEVICE_NAME`,`DEVICE_TYPE_NO` FROM `dic_device`
WHERE `STATION_NO`=8
AND `DEVICE_NO` LIKE '%POWER%'
AND `DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TY
比如我们在使用这个sql:select deptnofrom dept where deptno not in (10,50,null)进行查询时,在有数据符合条件的情况下,始终是得不到数据的。究其原因如下:
1.IN和NOT IN本质上都是OR运算。
对于条件deptnoin (10,50,null),可以等价于where deptno=10 or deptno=50 or deptno...