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

MySQLのNOT IN句で特定条件のレコードを除外し、重複から一意の値を抽出する方法

MySQLでは、NOT IN句を活用することで、特定の条件に該当するレコードを除外した上で、残りのデータから重複を排除した一意の値を簡単に抽出できます。本記事では、サンプルテーブルを作成し、実際にクエリを実行しながらその手順をわかりやすく解説します。

1. サンプルテーブルの作成

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

mysql> create table DemoTable
(
    Id int,
    FirstName varchar(100)
);
Query OK, 0 rows affected (0.69 sec)

2. レコードの挿入

続いて、INSERTコマンドを使用してテーブルにレコードを挿入します。

mysql> insert into DemoTable values(100,'Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(100,'Robert');
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable values(100,'Mike');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(100,'Sam');
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable values(101,'David');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(101,'Robert');
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable values(210,'Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(210,'Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(210,'Sam');
Query OK, 1 row affected (0.17 sec)

3. テーブル内容の確認

SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行すると、以下のような結果が出力されます。

+------+-----------+
| Id   | FirstName |
+------+-----------+
|  100 | Chris     |
|  100 | Robert    |
|  100 | Mike      |
|  100 | Sam       |
|  101 | David     |
|  101 | Robert    |
|  210 | Chris     |
|  210 | Bob       |
|  210 | Sam       |
+------+-----------+
9 rows in set (0.00 sec)

4. NOT INを使った重複除外クエリ

ここで、特定の条件(FirstName='Chris')に該当するIdを除外し、残りのIdから重複を取り除いた一意の値を取得するクエリを見てみましょう。

mysql> select distinct Id from DemoTable
where Id not in
(
   select Id from DemoTable where FirstName='Chris'
);

このクエリの仕組みは以下のとおりです。
まずサブクエリが「Chris」という名前を持つレコードのId(100と210)を特定し、メインクエリのNOT IN句がそれらのIdを除外します。さらにDISTINCTキーワードによって、残ったIdの重複が排除され、一意の値のみが返されます。

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

+------+
| Id   |
+------+
| 101  |
+------+
1 row in set (0.08 sec)

まとめ

NOT INとサブクエリ、そしてDISTINCTを組み合わせることで、「特定の条件に一致するレコードを含まないId」だけを効率的に抽出できます。今回の例では、Id=101はChrisという名前のレコードを持たないため、結果として唯一残った値となりました。なお、大量のデータを扱う場合はパフォーマンスの観点から、NOT EXISTSLEFT JOIN ... IS NULLの利用も検討するとよいでしょう。

  1. MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法

    MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)

  2. MySQLで複数のキーワードに一致するレコードを抽出する方法|RLIKE演算子の使い方を解説

    RLIKE演算子を使った複数条件でのレコード絞り込み MySQLで複数の単語(キーワード)のいずれかに一致するレコードを抽出したい場合は、RLIKE演算子を使用します。RLIKEは正規表現によるパターンマッチングを行う演算子で、|(パイプ)で区切ることで、OR条件のように複数の値を指定できます。 基本的な構文は以下のとおりです。 SELECT * FROM yourTableName WHERE yourColumnName RLIKE yourValue1|yourValue2; サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> CREATE