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