众所周知,当判断一个值是否为null的时候,sql要用is null 或者is not null, 在SQL中,Null值并不是一个值,而是表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此任何与Null值进行比对的二元 *** 作符结果一定为Null,包括Null值本身。
解决:
in和exists不论是大数据表还是小数据表,有可利用的索引还是无可利用的索引的情况下,它们的运行效率是差不多的,exists也许会稍微高一点点,但是差别很小。not exists在有可被利用索引的情况下效率很高,但是在大数据表的情况下如果没有可被利用索引的情况下其运行效率很差。
not in 则在大数据表的情况下,不论有无可被利用的索引,其运行效率均极低,比无索引可用的not exists还要慢很多。
in和exists常用于求交集,它们的运行效率分别不大,可根据个人喜好选用。not in和not exists常用于求非交集,小数据表时可随便用,但是碰到大数据表时就要小心了。not in不论有无可被利用的索引都会出现效率上的悲剧,应避免使用。not 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,可以见名知义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)