MySQLで特定のレコードを除外しつつNULL値を表示する単一クエリの書き方
NULLのレコードを確認するには IS NULL を使用します。一方、特定のレコードを除外したい場合には NOT IN 句を使います。この2つを同じクエリ内で組み合わせることで、不要なレコードを除外しながらNULL値を表示することが可能になります。
テーブルの作成
まず、動作確認用のサンプルテーブルを作成しましょう。
mysql> create table DemoTable793 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(100) ); Query OK, 0 rows affected (0.81 sec)
レコードの挿入
続いて、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)
全レコードの確認
SELECT文を実行して、テーブル内のすべてのレコードを表示してみます。
mysql> select *from DemoTable793;
以下のような出力が得られます。
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Adam | | 2 | Bob | | 3 | NULL | | 4 | Chris | | 5 | Robert | +-----------+-------------+ 5 rows in set (0.00 sec)
レコードを除外してNULL値を表示するクエリ
それでは本題です。特定のレコード(この例では「Chris」)を除外し、NULL値はそのまま表示するには、NOT IN 句と IS NULL をOR条件で組み合わせます。
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)
ポイント解説
StudentName NOT IN('Chris') という条件だけでは、NULL値を持つレコードは結果に含まれません。これはSQLにおいてNULLとの比較が常にUNKNOWNとして評価されるためです。そこで OR StudentName IS NULL を追加することで、NULL値のレコードも確実に結果セットへ含めることができます。
上記の出力結果を見ると、「Chris」(StudentId=4)が除外されている一方で、NULL値のレコード(StudentId=3)は正しく表示されていることが確認できます。このように、除外条件とNULL判定をORで組み合わせるのが実用的なテクニックです。
-
MySQLでORDER BY ASCとDESCを1つのクエリで実現し、指定した値からラップアラウンドする方法
MySQLでは、ORDER BY句に条件式を組み合わせることで、昇順(ASC)と降順(DESC)の並び替えを1つのクエリで実現できます。このテクニックを使うと、特定の値を起点として「ラップアラウンド(折り返し)」したような並び順を作成できます。この記事では、実際のサンプルを使ってその方法を解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Value int &
-
MySQLでAND・OR演算子を組み合わせた単一クエリを使って特定のレコードを取得する方法
MySQLでは、AND演算子とOR演算子をWHERE句で組み合わせることで、複数の条件を指定しながら特定のレコードを1つのクエリで取得できます。本記事では、実際にテーブルを作成し、データを挿入して、AND・ORを組み合わせたクエリの動作を確認していきます。 1. テーブルの作成 まず、CREATE TABLE文でサンプル用のテーブルを作成します。 mysql> create table DemoTable2015 -> ( -> StudentId int, -> StudentName varchar(20), -> Stude