MySQLで同じ列の値を持つ行を抽出する方法【GROUP BY活用】
はじめに
MySQLで「同じ列の値を持つ行」を取得したい場合は、GROUP BY句を使用します。本記事では、実際のサンプルを使いながら、特定の複数のIDに対して共通する値を持つ行を抽出する方法をわかりやすく解説します。
サンプルテーブルの作成
まず、デモ用のテーブルを作成しましょう。
mysql> create table DemoTable
-> (
-> StudentId int,
-> StudentMarks int
-> );
Query OK, 0 rows affected (4.71 sec)
テストデータの挿入
insertコマンドを使って、テーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable values(23,58);
Query OK, 1 row affected (0.70 sec)
mysql> insert into DemoTable values(25,89);
Query OK, 1 row affected (0.46 sec)
mysql> insert into DemoTable values(26,58);
Query OK, 1 row affected (1.13 sec)
mysql> insert into DemoTable values(28,98);
Query OK, 1 row affected (0.86 sec)
登録データの確認
selectステートメントで、テーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 23 | 58 |
| 25 | 89 |
| 26 | 58 |
| 28 | 98 |
+-----------+--------------+
4 rows in set (0.00 sec)
この時点で、StudentIdが「23」と「26」の両方とも、StudentMarksが「58」になっていることが確認できます。
同じ列の値を持つ行を返すクエリ
それでは、MySQLで同じ列の値を持つ行を返すためのクエリを見てみましょう。
mysql> select StudentMarks from DemoTable
-> group by StudentMarks
-> having sum(StudentId=23) > 0 and
-> sum(StudentId=26) > 0;
出力結果
+--------------+
| StudentMarks |
+--------------+
| 58 |
+--------------+
1 row in set (0.00 sec)
クエリの仕組みを解説
このクエリのポイントは、GROUP BY句とHAVING句の組み合わせです。
group by StudentMarks:StudentMarksの値ごとに行をグループ化します。having sum(StudentId=23) > 0:グループ内にStudentIdが「23」の行が1件以上存在するかを判定します。MySQLでは条件式が真の場合に1、偽の場合に0を返すため、sum()で合計すれば該当行の件数をカウントできます。and sum(StudentId=26) > 0:同様に、StudentIdが「26」の行も存在することを条件としています。
このように、両方の条件(StudentIdが23かつ26)を満たすStudentMarksの値、すなわち「58」だけが出力されました。応用すれば、3つ以上のIDに対しても同じロジックで共通する値を抽出できるので、ぜひ活用してみてください。
-
【MySQL】GROUP BYとHAVING句で同じテーブル内の共通する値を持つ行を抽出する方法
はじめにMySQLで、同じテーブル内に登録された複数の行の中から、特定の値が繰り返し登場するデータを抽出したいケースはよくあります。たとえば、「同じIDが何度も出現しているレコードを見つけたい」といった場合です。こうした処理には、GROUP BY句とHAVING句を組み合わせるのが効果的です。本記事では、実際のSQLコードと実行結果をもとに、その手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成しましょう。ここでは「Id」と「Name」の2つのカラムを持つシンプルなテーブルを用意します。mysql> create table DemoTable
-
【MySQL】EXISTSとサブクエリで別テーブルの列値と一致する行だけを抽出する方法
サブクエリとEXISTSを組み合わせるあるテーブルの列値が別のテーブルの列値と一致する場合にのみデータを取得したいときは、サブクエリとEXISTSを組み合わせると簡単に実現できます。まず、1つ目のテーブルを作成しましょう。mysql> create table DemoTable1 -> ( -> Id int, -> SubjectName varchar(20) -> )