MySQLでTINYINT型カラムが「1以外」または「NULL」のレコードを取得する方法
MySQLでは、TINYINT型のカラムに対して「1以外の値」または「NULL」を含むレコードを抽出したいケースはよくあります。しかし、<> 1 の比較条件だけではNULLのレコードは取得できないため、IS NULL を組み合わせる必要があります。この記事では、具体的な手順をサンプルコードとともに解説します。
1. サンプルテーブルの作成
まず、TINYINT型のカラムを含むテーブルを作成します。
mysql> create table DemoTable
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY ,
-> EmployeeName varchar(20),
-> isMarried tinyint
-> );
Query OK, 0 rows affected (0.83 sec)
このテーブルには、従業員ID(EmployeeId)、従業員名(EmployeeName)、結婚しているかどうかを示すフラグ(isMarried)の3つのカラムがあります。isMarried はTINYINT型で、1が「既婚」、0が「未婚」、NULLが「未登録」を表します。
2. レコードの挿入
次に、INSERT文を使ってサンプルデータを挿入します。ここでは意図的にNULLの値も含めています。
mysql> insert into DemoTable(EmployeeName,isMarried) values('Chris',NULL);
Query OK, 1 row affected (0.76 sec)
mysql> insert into DemoTable(EmployeeName,isMarried) values('David',1);
Query OK, 1 row affected (0.35 sec)
mysql> insert into DemoTable(EmployeeName,isMarried) values('Mike',0);
Query OK, 1 row affected (0.69 sec)
mysql> insert into DemoTable(EmployeeName,isMarried) values('Sam',NULL);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(EmployeeName,isMarried) values('Bob',0);
Query OK, 1 row affected (0.10 sec)
3. 挿入した全レコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------------+--------------+-----------+ | EmployeeId | EmployeeName | isMarried | +------------+--------------+-----------+ | 1 | Chris | NULL | | 2 | David | 1 | | 3 | Mike | 0 | | 4 | Sam | NULL | | 5 | Bob | 0 | +------------+--------------+-----------+ 5 rows in set (0.00 sec)
5件のレコードが登録されており、ChrisとSamのisMarriedにはNULLが格納されていることがわかります。
4. 「1以外またはNULL」のレコードを取得するクエリ
ここが本題です。isMarried が1以外、またはNULLであるレコードを取得するには、以下のようにOR条件でIS NULLを組み合わせます。
mysql> select *from DemoTable where isMarried <> 1 or isMarried IS NULL;
実行結果:
+------------+--------------+-----------+ | EmployeeId | EmployeeName | isMarried | +------------+--------------+-----------+ | 1 | Chris | NULL | | 3 | Mike | 0 | | 4 | Sam | NULL | | 5 | Bob | 0 | +------------+--------------+-----------+ 4 rows in set (0.00 sec)
既婚(1)のDavidを除く4件のレコードが正しく取得できました。
ポイント:なぜIS NULLが必要なのか
isMarried <> 1 だけの条件では、NULLのレコード(ChrisとSam)は結果に含まれません。これはSQLにおいて、NULLとの比較演算(= や <> など)の結果が「UNKNOWN(不明)」と評価され、WHERE句では偽として扱われるためです。
そのため、NULL値も対象に含めたい場合は、必ず OR カラム名 IS NULL を明示的に追加する必要があります。これはブーリアン値をTINYINTで管理する際によくある落とし穴なので、覚えておくと便利です。
-
MySQLでテーブル内の最大値を持つレコードを取得する方法
MySQLでは、MAX()関数とサブクエリを組み合わせることで、特定のカラムにおける最大値と、その値を持つレコード全体を簡単に取得できます。この記事では、実際にテーブルを作成し、データを挿入して、最大値のレコードを抽出する手順を解説します。1. テーブルを作成するまず、プレイヤーのスコアを管理するためのサンプルテーブルを作成します。mysql> create table DemoTable1449 -> ( -> PlayerId int NOT NULL AUTO_INCREME
-
MySQLで複数のカラムにNULL値を含むレコードを検索する方法
はじめにMySQLで複数のカラムの中にNULL値が1つでも含まれているレコードを抽出したい場合、GREATEST()関数を活用するのが効果的です。GREATEST()は引数の中から最大値を返す関数ですが、引数のいずれかにNULLが含まれている場合、結果もNULLを返すという特性があります。この特性を利用すれば、複数カラムにわたるNULL値のチェックをシンプルな条件式で実現できます。この記事では、実際にテーブルを作成し、サンプルデータを挿入して、NULL値を含むレコードを検索する手順を順番に解説します。テーブルの作成まず、4つのINT型カラムを持つテーブルを作成しましょう。mysql> c