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

MySQLの1つのクエリで2つのSELECTステートメントを組み合わせ、特定の値を持たないレコードを抽出する方法

特定のフィールドに特定の値が存在しないレコードを取得したい場合、WHERE句サブクエリ(副問い合わせ)を組み合わせることで実現できます。本記事では、1つのクエリ内で2つのSELECTステートメントを使用して目的のレコードを抽出する方法を、テーブル作成から実行結果まで具体例とともに解説します。

テーブルの作成

まず、サンプル用のテーブルを作成しましょう。ここでは、UserNameとUserType(ENUM型)の2つのカラムを持つテーブルを定義します。

mysql> create table DemoTable1840
    (
    UserName varchar(20),
    UserType ENUM('GUEST','ADMIN')
    );
Query OK, 0 rows affected (0.00 sec)

レコードの挿入

次に、INSERTコマンドを使用してテーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable1840 values('Chris','Admin');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1840 values('David','Guest');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1840 values('Chris','Guest');
Query OK, 1 row affected (0.00 sec)

テーブルの内容を確認する

SELECTステートメントでテーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1840;

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

+----------+----------+
| UserName | UserType |
+----------+----------+
| Chris    |    ADMIN |
| David    |    GUEST |
| Chris    |    GUEST |
+----------+----------+
3 rows in set (0.00 sec)

Chrisは「Admin」と「Guest」の両方で登録されており、Davidは「Guest」のみで登録されていることが確認できます。

特定の値を持たないレコードを取得するクエリ

ここで本題です。「Admin(管理者)として登録されていないユーザー」、つまりUserTypeに「Admin」という値が存在しないUserNameを抽出するクエリは以下の通りです。

mysql> select UserName from DemoTable1840 where UserName NOT IN(select UserName from DemoTable1840 where UserType='Admin');

実行結果:

+----------+
| UserName |
+----------+
| David    |
+----------+
1 row in set (0.00 sec)

クエリの仕組み

このクエリの動作を分解して見てみましょう。

まず、サブクエリ(内側のSELECTステートメント)が、UserTypeが「Admin」であるUserNameの一覧を取得します。この例では「Chris」が該当します。

次に、外側のSELECTステートメントが、その一覧に含まれない(NOT IN)UserNameをテーブルから返します。ChrisはAdminとして登録されているため除外され、結果として「David」のみが出力されます。

このように、NOT IN演算子とサブクエリを組み合わせることで、1つのクエリだけで「特定の値が存在しないレコード」を簡単に抽出できます。なお、サブクエリの結果にNULLが含まれる可能性がある場合は、NOT INが意図しない結果を返すことがあるため、事前にNULLを除外するなどの注意が必要です。

  1. MySQLの1つのUPDATE文で2つの列を同時に更新する方法

    はじめにMySQLでは、1つのUPDATE文の中でSET句を一度だけ使えば、複数の列を同時に更新できます。各列の指定はカンマ(,)で区切って記述します。この記事では、実際にテーブルを作成し、1つのクエリで2つの列(FirstNameとLastName)を更新する手順を解説します。サンプルテーブルの作成まず、以下のようにCREATE TABLE文でテーブルを作成します。mysql> create table DemoTable1909 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20)

  2. 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)