SQLのDISTINCTとは?(OracleやMySQLで使用する方法)

SQLのDISTINCT
OracleやMySQLなどのデータベースを操作するにはSQLを使用します。SQLにはDISTINCTというものがあります。
ここではOracleやMySQLなどのデータベースで使用されるDISTINCTについて説明します。
DISTINCTとは?
DISTINCTは重複した行を排除することが出来るコマンドです。
列の値が重複する行を排除することで確認作業を簡単にしたい時などに使用します。
基本構文
SELECT DISTINCT カラム名,カラム名…
FROM テーブル
DISTINCT カラム名を指定すると、そのカラムの重複行を排除することができます。また、複数のカラムを指定した場合、指定した列の値の組み合わせが一意になる行のみが抽出されます。
DISTINCTを指定したい場合はSELECTの直後に1度だけ記述するというルールがあります。そのため、複数DISTINCTを記述したり、SELECTの直後ではない場所にDISTINCTを記述するとエラーとなります。
DISTINCTで1つのみカラムを指定した場合
+-----------+------+--------+------+
| DEPT | ID | NAME | SAL |
+-----------+------+--------+------+
| 東京 | 1001 | 山田 | 1000 |
| 大阪 | 1002 | 田中 | 1000 |
| 名古屋 | 1003 | 山内 | 1500 |
| 仙台 | 1004 | 山中 | 2000 |
| 広島 | 1006 | 花田 | 3000 |
| 東京 | 1007 | 山内 | 4000 |
| 名古屋 | 1008 | 加藤 | 1000 |
| 東京 | 1009 | 加藤 | 2000 |
| 大阪 | 1010 | 田中 | 3000 |
| 広島 | 1011 | 山内 | 1500 |
+-----------+------+--------+------+
このテーブルはsampleという名前です。
このテーブルのDEPTから重複した行を排除して表示するには以下のコードを使用します。
SELECT DISTINCT DEPT
-> FROM sample;
+-----------+
| DEPT |
+-----------+
| 東京 |
| 大阪 |
| 名古屋 |
| 仙台 |
| 広島 |
+-----------+
このように重複した行を排除して表示されています。
また、このサンプルコードではMySQLを使用していますがOracleなどのデータベースでも使用することができます。
複数のカラムを指定した場合
先ほどは1つのみDISTINCTで指定しました。
次はDEPTとNAMEを指定した場合どうなるかを紹介します。
SELECT DISTINCT DEPT, NAME
-> FROM sample;
+-----------+--------+
| DEPT | NAME |
+-----------+--------+
| 東京 | 山田 |
| 大阪 | 田中 |
| 名古屋 | 山内 |
| 仙台 | 山中 |
| 広島 | 花田 |
| 東京 | 山内 |
| 名古屋 | 加藤 |
| 東京 | 加藤 |
| 広島 | 山内 |
+-----------+--------+
DISTINCTの後にDEPTとNAMEを指定しています。ですのでDEPTとNAMEの値の組み合わせが一意になる行が表示されます。
そのため、DEPTが「大阪」、NAMEが「田中」の行は2つありますが1つしか表示されていません。
このコードもMySQLだけでなくOracleなどのデータベースで使用することができます。
関数内のDISTINCT
DISTINCTはCOUNT関数など様々な関数内に指定されることがあります。
ここではDISTINCTに指定できる関数を一部紹介します。サンプルコードで使用するテーブルは先ほどから使用しているsampleを使用しています。
COUNT
COUNT関数は取り出された件数を戻す関数です。
DISTINCTを指定した場合重複した値を一回だけカウントしたデータの件数(NULLは含まれません)を抽出します。
サンプルコード
SELECT COUNT(DISTINCT DEPT) FROM sample;
+----------------------+
| COUNT(DISTINCT DEPT) |
+----------------------+
| 5 |
+----------------------+
COUNT関数もMySQLだけでなくOracleなどのデータベースで使用できます。
AVG
AVG関数は平均値を戻す関数です。
DISTINCTを指定した場合重複した値を1回だけ処理し平均値を戻します。
サンプルコード
SELECT AVG(DISTINCT SAL) FROM sample;
+-------------------+
| AVG(DISTINCT SAL) |
+-------------------+
| 2300.0000 |
+-------------------+
AVG関数もMySQLだけでなくOracleなどのデータベースで使用できます。
SUM
SUM関数は合計値を戻す関数です。
DISTINCTを指定した場合重複した値を1回だけ処理し合計値を戻します。
サンプルコード
SELECT SUM(DISTINCT SAL) FROM sample;
+-------------------+
| SUM(DISTINCT SAL) |
+-------------------+
| 11500 |
+-------------------+
SALを全て合計すると20000となりますがDISTINCTを指定しているため重複したものは1度しか合計値に使用されません。
そのため11500となります。
SAL関数もMySQLだけでなくOracleなどのデータベースで使用可能です。
まとめ
OracleやMySQLなどのデータベースで使用できるDISTINCTについて説明しました。
DISTINCTはSELECT句の後に記述すると重複した行を排除することができます。また関数内に指定することで重複したものの処理を1度だけにすることが出来ます。
OracleやMySQLなど様々なデータベースがあり、データベースによって使用できるコマンドや記述方法が少し違ったりしますので注意が必要です。