all_student表是所有的学生信息,fail_student表是不及格的学生信息
select * from all_student
select * from fail_student
查询及格的学生信息
select * from all_student
where name not in (
select name from fail_student
)
假如fail_student有一条name为null的记录
再次查询及格的学生信息,结果集为空
select * from all_student
where name not in (
select name from fail_student
)
解决方案
1.修改表结构,设置name字段为not null,并设置默认值
2.修改sql为
select * from all_student a
left join fail_student f on a.name = f.name
where f.name is null
这个问题的根源在于null。
众所周知,当判断一个值是否为null的时候,sql要用is null 或者is not null, 在SQL中,Null值并不是一个值,而是表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此任何与Null值进行比对的二元 *** 作符结果一定为Null,包括Null值本身。
解决:
not In 相当于 <>all,如果 Not In 后面跟的是子查询的话,子查询中只要包含一个 null 的返回值,则会造成整个 Not in 字句返回空值,结果就是查询不会返回任何结果。而 in 相当于 =any 的意思,可以有效处理子查询中返回空值的情况,返回正确的结果。
mysql中not in和not exists两种查询到底哪种快?
因为in会使用你的子查询字段去到主表匹配你需要的行,而exists是根据匹配项去判断是或者否,然后根据是否决定结果,子查询的表大,用exists判断,效率就会高,而当子查询很小的时候,直接匹配你需要的值则更快。比如主表4万行,子查询里面有5条数据,那么exists会把4万行在子查询里面进行匹配,匹配上了就显示,匹配不上就不显示,所以需要判断4万次,而in则会在主表4万行里面去检索这5条记录,由于索引等等的存在,in的效率通常会更高,但是如果反过来,主表5条记录,子查询里面有4万行,exists只进行5次判断,而in会用4万个数据去匹配这5条记录,当然exists更快。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)