質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

30969閲覧

複数列に対してIS NULL演算子を使いたい場合の構文

kichul_24

総合スコア13

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2015/11/12 08:53

SQLの勉強で分からないところがあります。

掲題の通り、複数列に対してNULLが入っている行を抽出したい場合、どのような構文が正しいのでしょうか?

現在、自分が考えているのが2つあります。
1つ目が、
SELECT *
FROM テーブル名
WHERE (列名 AND 列名) IS NULL;

2つ目が、
SELECT *
FROM テーブル名
WHERE 列名 IS NULL AND 列名 IS NULL;

です。
どちらか合っているのか、もしくはどちらも間違っているのか、
ご存知の方教えて頂けたらと思います。
以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

2が正しいです。

MySQLは1も正しく動きます。

MySQLは他のRDBMSで構文エラーになるようなクエリでも動くものが多いですが、
どのRDBMSでも動く書き方をしたほうがいいと思いますよ。

投稿2015/11/12 09:25

rysh

総合スコア874

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kichul_24

2015/11/12 13:53

回答ありがとうございます! RDBMSごとで正しい構文は変わってくるのですね...! いろいろ試してみます!
guest

0

ベストアンサー

複数列の【全てのカラム】に対して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 NULLNULL、という意味です)
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 10:06

編集2015/11/12 10:07
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kichul_24

2015/11/12 13:50

回答ありがとうございます! MySQLでの実証もありがとうございます。 大変参考になりました。
guest

0

2つ目が正しい形です。

AND演算子は、両側にブール値を取るので、ブール以外の列にANDをかけてしまうとどうなるかはよくわかりません。

投稿2015/11/12 09:06

maisumakun

総合スコア145192

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kichul_24

2015/11/12 13:45

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問