MySQLで結果セットの重複行を除外する方法:DISTINCTキーワードの使い方
DISTINCTキーワードによる重複行の除外
MySQLでは、SELECT句にDISTINCTキーワードを使用することで、結果セットから重複する行を除外できます。重要なポイントとして、DISTINCTはSELECT句で指定されたすべてのカラムの組み合わせに対して適用されます。つまり、複数のカラムを指定した場合は、それらすべての値の組み合わせが一意である行のみが返されます。
検証に使用するテーブル
以下のような「Student」テーブルを例に、DISTINCTキーワードの実際の動作を確認してみましょう。
mysql> Select * from student; +------+---------+---------+-----------+ | Id | Name | Address | Subject | +------+---------+---------+-----------+ | 1 | Gaurav | Delhi | Computers | | 2 | Aarav | Mumbai | History | | 15 | Harshit | Delhi | Commerce | | 17 | Raman | Shimla | Computers | | 20 | Gaurav | Jaipur | History | +------+---------+---------+-----------+ 5 rows in set (0.00 sec)
このテーブルには5件のレコードが登録されており、「Address」カラムの「Delhi」と「Name」カラムの「Gaurav」にはそれぞれ重複が含まれています。
例1:AddressカラムにDISTINCTを適用
mysql> Select DISTINCT Address from student; +---------+ | Address | +---------+ | Delhi | | Mumbai | | Shimla | | Jaipur | +---------+ 4 rows in set (0.00 sec)
元のデータでは「Delhi」が2件存在しますが、DISTINCTにより1つにまとめられ、重複のない4行だけが返されます。
例2:すべてのカラムにDISTINCTを適用
mysql> Select DISTINCT * from student; +------+---------+---------+-----------+ | Id | Name | Address | Subject | +------+---------+---------+-----------+ | 1 | Gaurav | Delhi | Computers | | 2 | Aarav | Mumbai | History | | 15 | Harshit | Delhi | Commerce | | 17 | Raman | Shimla | Computers | | 20 | Gaurav | Jaipur | History | +------+---------+---------+-----------+ 5 rows in set (0.00 sec)
アスタリスク(*)を指定した場合は、すべてのカラムの組み合わせに対してDISTINCTが評価されます。この例ではIdカラムのおかげで各行が完全に一意であるため、全5行がそのまま返されます。
例3:NameカラムにDISTINCTを適用
mysql> Select DISTINCT name from student; +---------+ | name | +---------+ | Gaurav | | Aarav | | Harshit | | Raman | +---------+ 4 rows in set (0.00 sec)
「Gaurav」という名前はId 1とId 20の2件に登場しますが、DISTINCTにより1つに絞り込まれ、一意な名前だけが4行返されます。
まとめ
DISTINCTキーワードを使えば、指定したカラム(またはカラムの組み合わせ)の値が重複している行を簡単に排除できます。単一カラムだけでなく複数カラムにも対応しており、集計やレポート作成時にデータを整理する際に非常に便利です。
-
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で結果セットを指定した順序どおりに取得する方法
MySQLでIN句を使ってレコードを取得すると、通常はテーブル内の格納順どおりに結果が返されます。しかし、「指定した値の並び順どおりに結果セットを取得したい」というケースもあります。そんなときは、FIND_IN_SET()関数とORDER BY句を組み合わせることで簡単に実現できます。サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable1563 -> ( -> StudentId int, -> StudentName varchar(20) -> );Query OK