DISTINCT句【DISTINCT clause】

データベースのテーブルには、同じ値が複数の行にわたって格納されていることが多い。たとえば、注文履歴テーブルの「顧客名」列には、同じ顧客が何度も購入するたびに同じ名前が繰り返し記録される。ここで、「SELECT 顧客名 FROM 注文履歴 」というSQL文を発行すれば、重複を含むすべての行が返される。
一方、DISTINCT句を用いて「SELECT DISTINCT 顧客名 FROM 注文履歴」と指定すると、重複が取り除かれ、注文履歴テーブルに登場する顧客名のリストが得られる。DISTINCT句は原則としてSELECTの直後、列名の直前に記述する。
「DISTINCT 列名1, 列名2, …」といったようにカンマ区切りで複数の列を同時に指定することもできる。その場合、列ごとには同じ値が重複していても、各列の値の組み合わせが異なっていれば異なるデータであると判断して列挙する。例えば、「SELECT DISTINCT 都道府県, 市区町村 FROM 顧客テーブル」と書いた場合、「東京都・渋谷区」という組み合わせが重複していれば一行に絞られるが、「東京都・新宿区」は別の組み合わせとして扱われる。
COUNT関数と組み合わせ、「COUNT(DISTINCT 列名)」のように記述すると、重複を排除した上で件数を数えることができる。注文履歴テーブルを用いて「何種類の商品が売れたか」「何人のユニーク顧客がいるか」といった問いに答える際に用いられる。
性能の観点では、DISTINCT句はテーブル全体をスキャンして重複を比較・排除する処理を伴うため、データ量が多い場合には負荷が高くなりやすい。同様の結果をGROUP BY句で得られる場合もあり、実行計画や索引の有無によってどちらが効率的かが変わることもある。大規模なテーブルに対して使用する際には、実行計画を確認した上で適切な方法を選択することが望ましいとされる。