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更快。
MySQL中NOT IN语句对NULL值的处理2007-07-23 16:01mysql>SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002')+-------------+
| count(name) |
+-------------+
| 17629 |
+-------------+
1 row in set (0.02 sec)
mysql>SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002', NULL)
+-------------+
| count(name) |
+-------------+
| 0 |
+-------------+
1 row in set (0.01 sec)
当在子查询中出现NULL的时候,结果就一定是0了。查了一下手册,确实有这样的说法。所以最后实际采用了这样的查询:
SELECT COUNT(DISTINCT name)
FROM CVE
WHERE name NOT IN (SELECT cveID FROM cve_sig WHERE cveID IS NOT NULL)
顺便提一下MySQL中正则表达式匹配的简单使用:
SELECT COUNT(alarmID)
FROM Alarm
WHERE (CVE NOT RLIKE '^CVE-[0-9]{4}-[0-9]{4}$' OR CVE IS NULL)
当然,RLIKE也可以写作REGEXP,我个人倾向于使用RLIKE,因为拼写接近LIKE,可以见名知义。
from_id有(37, 56, 57,28,null), not in (37, 56, 57)与28比较时是true,所以结果集中出现28,null与not in (37, 56, 57)这个条件比较时,结果false,所以不出现在结果集中
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)