MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLの1つのクエリでNOT IN・OR・IS NULLを組み合わせてレコードを抽出する方法

はじめに

MySQLでは、NOT IN句で特定の値を除外しつつ、IS NULLORを組み合わせることで、NULL値を含むレコードも一緒に取得できます。なぜなら、NOT IN句だけではNULLのレコードは結果から除外されてしまうためです。本記事では、実際のサンプルを使って手順を解説します。

1. テーブルの作成

まず、テーブルを作成します。

mysql> create table DemoTable793(
   StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   StudentName varchar(100)
);
Query OK, 0 rows affected (0.81 sec)

2. レコードの挿入

次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。ここでは意図的にNULL値のレコードも含めています。

mysql> insert into DemoTable793(StudentName) values('Adam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable793(StudentName) values('Bob');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable793(StudentName) values(null);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable793(StudentName) values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable793(StudentName) values('Robert');
Query OK, 1 row affected (1.03 sec)

3. テーブル内の全レコードを表示

SELECT文ですべてのレコードを確認してみましょう。

mysql> select *from DemoTable793;

実行すると、次のような出力が得られます。

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Adam        |
|         2 | Bob         |
|         3 | NULL        |
|         4 | Chris       |
|         5 | Robert      |
+-----------+-------------+
5 rows in set (0.00 sec)

4. NOT IN・OR・IS NULLを組み合わせたクエリ

それが本題です。「Chris」以外のレコードに加えて、StudentNameがNULLのレコードも取得したい場合、以下のようにNOT INORIS NULLを同じクエリ内で使用します。

mysql> select *from DemoTable793 where StudentName NOT IN('Chris') OR StudentName IS NULL;

実行結果は以下の通りです。

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Adam        |
|         2 | Bob         |
|         3 | NULL        |
|         5 | Robert      |
+-----------+-------------+
4 rows in set (0.00 sec)

ポイント解説

上記の出力を見ると、「Chris」のレコード(StudentId: 4)は除外され、NULLのレコード(StudentId: 3)は含まれていることがわかります。
もし「OR StudentName IS NULL」を付けずに「WHERE StudentName NOT IN('Chris')」だけを実行した場合、SQLではNULLとの比較がUNKNOWN(不明)として扱われるため、NULLのレコードは結果セットから消えてしまいます。
したがって、除外条件を適用しながらNULL値のレコードも残したい場合は、「OR カラム名 IS NULL」を必ず併用することを覚えておきましょう。

  1. 【MySQL】日付レコードから曜日を減算し、曜日名とともに結果を表示する方法

    はじめにMySQLで保存された日付レコードから、その週の開始日(月曜日)を計算して減算し、曜日名とともに結果を表示したい場合があります。このような処理には DATE_FORMAT() 関数を使用します。SUBDATE() と WEEKDAY() を組み合わせることで、各日付が属する週の月曜日の日付を「Mon 19 Oct」のような形式で取得できます。以下、具体的な手順をサンプルコードとともに解説します。1. テーブルの作成まず、日付を文字列として格納するテーブルを作成します。mysql> create table DemoTable1820 ( AdmissionDate

  2. MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?

    MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970     (