複数列の【全てのカラム】に対してNULLが入っている行を抽出したい
ということでしたら、2つ目が正しいです。
1つ目のSQL文をMySQLで実行したところ、
複数列の【いずれか1つのカラム】に対してNULLが入っている行
を抽出してしまいます。
sql
1mysql> CREATE TABLE `test` (
2 -> `col1` int(11) DEFAULT NULL,
3 -> `col2` int(11) DEFAULT NULL
4 -> );
5Query OK, 0 rows affected (0.02 sec)
6
7mysql> INSERT INTO test VALUES (0, 1), (1, NULL), (NULL, NULL);
8Query OK, 3 rows affected (0.01 sec)
9Records: 3 Duplicates: 0 Warnings: 0
10
11mysql> SELECT * FROM test;
12+------+------+
13| col1 | col2 |
14+------+------+
15| 0 | 1 |
16| 1 | NULL |
17| NULL | NULL |
18+------+------+
193 rows in set (0.00 sec)
20
21# 1つ目のSQL文
22mysql> SELECT * FROM test WHERE (col1 AND col2) IS NULL;
23+------+------+
24| col1 | col2 |
25+------+------+
26| 1 | NULL |
27| NULL | NULL |
28+------+------+
292 rows in set (0.00 sec)
30
31# 2つ目のSQL文
32mysql> SELECT * FROM test WHERE col1 IS NULL AND col2 IS NULL;
33+------+------+
34| col1 | col2 |
35+------+------+
36| NULL | NULL |
37+------+------+
381 row in set (0.00 sec)
なぜなら、MySQLでは、AND
演算子は評価するカラムや値のいずれか1つがNULL
の場合、NULL
を返却するからです。
(a AND b AND ... AND NULL
はNULL
、という意味です)
https://dev.mysql.com/doc/refman/5.6/ja/logical-operators.html#operator_and
おそらく、この動作は他のデータベースでも同様と思われます。
http://otndnld.oracle.co.jp/document/products/lite10g/10.2.0/html/B19286-02/sqopr.htm#g1005904
https://technet.microsoft.com/ja-jp/library/ms188372(v=sql.105).aspx
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/12 13:53