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

MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方

MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。

1. サンプルテーブルを作成する

まず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。

mysql> create table DemoTable1885
    (
    FirstName varchar(20),
    Subject varchar(50)
    );
Query OK, 0 rows affected (0.00 sec)

2. テーブルにレコードを挿入する

次に、INSERT文を使ってサンプルデータを登録します。

mysql> insert into DemoTable1885 values('John','MySQL');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('John','MongoDB');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('Carol','MySQL');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1885 values('David','Java');
Query OK, 1 row affected (0.00 sec)

3. 登録したデータを確認する

SELECT文で全件を表示し、データが正しく登録されているか確認しましょう。

mysql> select * from DemoTable1885;

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

+-----------+---------+
| FirstName | Subject |
+-----------+---------+
| John      |    MySQL|
| John      |  MongoDB|
| Carol     |    MySQL|
| David     |    Java |
+-----------+---------+
4 rows in set (0.00 sec)

4. 複数の値をすべて満たす行を抽出するクエリ

ここからが本題です。「MySQL」と「MongoDB」の両方の科目を持つ人だけを抽出したい場合は、次のようにクエリを書きます。

mysql> select FirstName from DemoTable1885
    where Subject IN('MySQL','MongoDB')
    group by FirstName
    having count(*)=2;

このクエリのポイントは以下の3つです。

  • WHERE句 + IN():対象となる値(MySQL、MongoDB)に該当する行だけを先に絞り込みます。
  • GROUP BY:氏名ごとに行をグループ化します。
  • HAVING count(*)=2:グループ内の行数が2件(=両方の科目を持っている)である人物のみを抽出します。

5. 実行結果

上記のクエリを実行すると、以下の出力が得られます。

+-----------+
| FirstName |
+-----------+
| John      |
+-----------+
1 row in set (0.00 sec)

Johnは「MySQL」と「MongoDB」の両方を履修しているため抽出されました。一方、CarolはMySQLのみ、DavidはJavaしか持っていないため、条件を満たさず結果には含まれません。

まとめ

ある列が複数の値をすべて満たすかどうかを判定したい場合は、「IN()で絞り込み → GROUP BYでグループ化 → HAVINGで件数をチェック」という流れが定番のパターンです。条件とする値の数が変わる場合は、HAVING count(*) = 値の数 の部分を適宜変更すれば応用できます。ぜひ実際の開発でも活用してみてください。

  1. MySQLで列の値の先頭に000(ゼロ埋め)を追加する方法

    MySQLで列の値に000(ゼロ)を追加するには?MySQLで数値の先頭に「000」のようなゼロを追加して表示したい場合は、ZEROFILL属性を使用します。ZEROFILLを指定した列では、設定された表示幅に満たない桁数が自動的に0で埋められます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1913 ( Code int(4) ZEROFILL AUTO_INCREMENT NOT NULL, PRIMARY KEY(Code) ); Query OK, 0 rows affected (0.00

  2. MySQLでLIMIT句を使ってページネーション(次の行)を取得する方法

    MySQLでページネーション(特定の範囲の行だけを取得すること)を実現したい場合は、LIMIT句を使用します。LIMIT句では「開始位置(オフセット)」と「取得する行数」を指定できるため、大量のデータの中から必要な部分だけを効率よく取り出せます。この記事では、実際にテーブルを作成し、データを挿入したうえで、次の行を取得するページネーションの具体的な手順を解説します。1. サンプルテーブルを作成するまずはデモ用のテーブルを作成しましょう。以下のSQLでは、自動採番されるidカラムと名前を格納するnameカラムを持つテーブル「demo40」を定義しています。mysql> create tab