mysqlのinとnot inの使い方(特にnot in結果セットにnullがないことに注意)
注意:1.not inの結果セットにnullが現れるとクエリの結果はnullになります.例えば、以下のsqlにはlistのnull値が含まれており、結果を正しくクエリーできません. in結果セットにnullは影響しません.
========================================
mysql> 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)
SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002', NULL);
========================================
mysql> 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)