本記事では、
selectによる検索結果から重複を除去するDISTINCTの使い方を解説する。
DISTINCTによる重複削除は、
COUNTなどの他のselect部分で使える構文と合わせて使用することもでき、
場合によってはとても役に立つ構文なので使い方をしっかり押さえておこう。
DISTINCTの使い方
DISTINCTを使うと、
SQLのSelectの結果から重複を除去することが可能だ。
DISTINCTの基本的な使い方① –単一カラムの重複除去–
以下はDISTINCTを使って、動物名の重複を除去するサンプル。
DINSTINCTの最も基本的な使い方だ。
--テーブル1の件数を取得する
SELECT
DISTINCT 動物
FROM
テーブル1;
--テーブル1
+------+
| 動物 |
+------+
| かめ |
| いぬ |
| うし |
| うし |
| たぬき |
| たぬき |
| たぬき |
+------+
--実行結果
+-------+
| 動物 |
+------+
| かめ |
| いぬ |
| うし |
| たぬき |
+------+
「うし」「たぬき」はそれぞれレコードとして重複が存在するが、SELECT時にDISTINCTを使用しているため、結果として重複が除去され、純粋な動物名の種類だけが抽出された結果となった。
DISTINCTの基本的な使い方② –複数カラムでの重複除去–
以下はDISTINCTを使って、動物名の重複と年齢の複数カラムから重複を除去するサンプル。
DISTINCTは複数カラムに対しても指定することができ、より柔軟な重複除去が可能である。
--テーブル1の件数を取得する
SELECT
DISTINCT 動物, 年齢
FROM
テーブル1;
--テーブル1
+------+------+
| 動物 | 年齢 |
+------+------+
| かめ | 100 |
| いぬ | 1 |
| うし | 5 |
| うし | 5 |
| たぬき | 13 |
| たぬき | 13 |
| たぬき | 88 |
+------+------+
--実行結果
+------+------+
| 動物 | 年齢 |
+------+------+
| かめ | 100 |
| いぬ | 1 |
| うし | 5 |
| たぬき | 13 | --★ 複数DISTINCTで残ったレコード
| たぬき | 88 | --★ 複数DISTINCTで残ったレコード
+------+------+
「たぬき」のレコードのうち、年齢のカラムには、13と88のレコードが存在する。
DISTINCTでは「動物」「年齢」の両方を指定したため、重複行として判断できる最小の、
「たぬき、13」の組み合わせと、「たぬき、88」の組み合わせに分類された結果となった。
この様に、ちょっととっつきづらいかもしれないが、DISTINCTでは複数カラム指定の重複削除も実行できることを覚えておくとより便利な使い方が可能となる。
(おまけ)COUNTと合わせて使うDISTINCT
最後にCOUNTと合わせて使うDISTINCTの使い方を紹介する。
--テーブル1の件数を取得する
SELECT
COUNT(distinct 動物) AS 動物数
FROM テーブル1;
--テーブル1
+------+
| 動物 |
+------+
| かめ |
| いぬ |
| うし |
| うし |
| たぬき |
| たぬき |
| たぬき |
+------+
--実行結果
+------+
| 動物数 |
+------+
| 4 |
+------+
COUNT関数を使って動物の種類の数を抽出する際、
DISTINCTを使って、動物の種類の重複をなくしているのが分かるだろう。
この様に、DISTINCTは他の関数と組み合わせて使うことでより便利に使用することが可能である。
関連記事
https://www.shift-the-oracle.com/sql/distinct.html
https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/distinct-optimization.html
コメントを残す