MySQLでサブクエリを使って特定の行を除外する方法
MySQLでは、サブクエリとNOT IN演算子を組み合わせることで、テーブルから特定の行を簡単に除外できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、特定の行を除外するサブクエリの書き方を手順に沿って解説します。
1. テーブルの作成
まず、以下のコマンドでサンプル用のテーブル「DemoTable」を作成します。
mysql> create table DemoTable
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100),
-> Age int
-> );
Query OK, 0 rows affected (0.87 sec)
IdカラムはAUTO_INCREMENTにより自動採番され、主キーとして機能します。
2. レコードの挿入
次に、INSERT文を使って3件のレコードを登録します。
mysql> insert into DemoTable(Name,Age) values('John',21);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Name,Age) values('Carol',22);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Name,Age) values('David',23);
Query OK, 1 row affected (0.54 sec)
3. 全レコードの確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
+----+-------+------+
| Id | Name | Age |
+----+-------+------+
| 1 | John | 21 |
| 2 | Carol | 22 |
| 3 | David | 23 |
+----+-------+------+
3 rows in set (0.00 sec)
この時点では、John・Carol・Davidの3件が登録されていることが確認できます。
4. サブクエリで特定の行を除外する
ここでは例として、名前が「Carol」である行を除外してみます。WHERE句の中でサブクエリを実行し、その結果をNOT IN演算子で判定します。
mysql> select *from DemoTable
-> where Name not in (select Name from DemoTable where Name='Carol'
-> );
出力結果
+----+-------+------+
| Id | Name | Age |
+----+-------+------+
| 1 | John | 21 |
| 3 | David | 23 |
+----+-------+------+
2 rows in set (0.00 sec)
実行結果から「Carol」の行だけが除外され、JohnとDavidの2件のみが返されていることがわかります。
仕組みの解説
このクエリは、次の順序で処理されます。
- まずサブクエリ
select Name from DemoTable where Name='Carol'が実行され、結果として「Carol」という値が返されます。 - 続いて外側のクエリが、NOT IN演算子によってその値と一致しない行だけを抽出します。
補足:よりシンプルな代替手段
単一条件で特定の行を除外するだけであれば、比較演算子を使って次のように書くこともできます。
mysql> select *from DemoTable where Name <> 'Carol';
また、対象カラムにNULL値が含まれる可能性がある場合は、NOT INが意図しない結果を返すことがあるため、NOT EXISTSを使用する方が安全です。状況に応じて適切な方法を選択しましょう。
-
MySQLのZF(ZEROFILL)とは?カラム宣言におけるゼロ埋めの意味と使い方を解説
MySQLにおけるZF(ZEROFILL)の意味「ZF」とは ZEROFILL の略で、MySQLのカラム宣言において数値の桁数が足りない場合に先頭を0で埋める(ゼロ埋め)ことを指します。この属性を指定すると、定義した表示幅に合わせて自動的に左側へ0が補完されます。まず、int型のフィールドサイズを10に設定したテーブルを作成してみましょう。mysql> create table DemoTable1332 -> ( -> Number int(10) ZEROFILL NOT N
-
【MySQL】LIKE句で「a」が3つ以上含まれるレコードを抽出する方法
MySQLで「a」が3つ以上含まれるレコードを抽出する方法MySQLで、ある文字列の中に特定の文字が複数回出現するレコードを検索したい場合は、LIKE句とワイルドカード「%」を組み合わせます。「%」は任意の0文字以上の文字列に一致するため、「a」が3つ以上含まれる文字列は「%a%a%a%」というパターンで表現できます。基本構文SELECT * FROM テーブル名 WHERE カラム名 LIKE %a%a%a%;サンプルテーブルの作成それでは、実際に動作を確認していきましょう。まずは国名を格納するテーブルを作成します。mysql> create table DemoTable1393