集計関数なしでGROUP BY句を使うとどうなる?DISTINCT句との違いを解説
はじめに:GROUP BY句は集計関数なしでも使える
MySQLでは、SELECT文においてGROUP BY句を集計関数(SUM、COUNTなど)なしで使用すると、DISTINCT句と同じように動作します。つまり、指定したカラムの重複した値が取り除かれ、一意な値だけが結果として返されるのです。
ここでは、次のサンプルテーブル「Student_info」を使って、その挙動を実際に確認してみましょう。
mysql> Select * from Student_info; +------+---------+------------+------------+ | id | Name | Address | Subject | +------+---------+------------+------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Chandigarh | Literature | | 125 | Raman | Shimla | Computers | | 130 | Ram | Jhansi | Computers | | 132 | Shyam | Chandigarh | Economics | | 133 | Mohan | Delhi | Computers | | 150 | Saurabh | NULL | Literature | +------+---------+------------+------------+ 7 rows in set (0.00 sec)
このテーブルには「Address」カラムに「Chandigarh」などの重複した値が含まれています。
DISTINCT句を使った場合
まずは比較のため、「Address」カラムに対してDISTINCT句を使用してみます。MySQLは次のような結果セットを返します。
mysql> Select DISTINCT ADDRESS from Student_info; +------------+ | ADDRESS | +------------+ | Amritsar | | Chandigarh | | Shimla | | Jhansi | | Delhi | | NULL | +------------+ 6 rows in set (0.07 sec)
重複が排除され、6件の一意な住所が取得できました。
GROUP BY句を使った場合
次に、同じ操作をGROUP BY句で行います。次のように記述することで、DISTINCT句を使った場合と同じ結果セットを得ることができます。
mysql> Select ADDRESS from Student_info GROUP BY Address; +------------+ | ADDRESS | +------------+ | NULL | | Amritsar | | Chandigarh | | Delhi | | Jhansi | | Shimla | +------------+ 6 rows in set (0.00 sec)
両者の違い:結果の並び順
2つの結果セットを見比べると、1つの違いに気づきます。GROUP BY句を使用したクエリの結果セットはソート(並べ替え)された状態で返されるのに対し、DISTINCT句を使用したクエリの結果セットは元の順序のままソートされていません。NULLが先頭に来ている点にも注目してください。
補足:MySQL 8.0以降の注意点
なお、MySQL 5.7以前ではGROUP BY句が暗黙的に結果をソートしていましたが、MySQL 8.0以降ではこの暗黙のソートは廃止されています。そのため、最新バージョンで確実にソートされた結果を得たい場合は、明示的にORDER BY句を組み合わせることをおすすめします。
このように、GROUP BY句は本来グループ化と集計のための機能ですが、集計関数なしで使えばDISTINCT句の代用としても機能します。ただし、意図を明確にするためには、単純な重複除去にはDISTINCT句を、グループごとの集計にはGROUP BY句を使い分けるのが良い設計と言えるでしょう。
-
MySQLで条件付きGROUP BYを使って重複データを集約・取得する方法
はじめにMySQLでは、GROUP BY句と集計関数(MAX()など)を組み合わせることで、条件付きのグループ化を行い、各グループから必要な値を効率的に取得できます。本記事では、学生名が重複しているデータから、各学生の最高得点を取り出す例を通して、その具体的な手順を解説します。 1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable ( StudentName varchar(40), StudentMarks int ); Query OK, 0 rows affected (0.64 sec) 2. テストデ
-
MySQLのGROUP BY句で各グループから1行だけを選択・抽出する方法
MySQLでは、GROUP BY句とサブクエリを組み合わせることで、各グループから特定の1行(たとえば最小のIDを持つ行)を取り出すことができます。本記事では、学生の点数データを例に、テーブル作成から実際のクエリ実行までの手順をわかりやすく解説します。 1. テーブルの作成 まず、以下のCREATE TABLE文でサンプル用のテーブルを作成します。 mysql> create table DemoTable1572 -> ( -> StudentId int, &nb