【SQL】重複データをすっきり1つにまとめる!「DISTINCT」構文|情報処理問題1000本ノック
データベースからデータを取り出す際、同じ値が何度も出てくると見づらくなってしまいます。重複を自動で削ぎ落としてくれる必須キーワード「DISTINCT」を攻略しましょう。
1. 【 問題 】:関係データベースのSQL(重複行の除外)
【 問題 】 次の「注文」表に対して、SQL文を実行したとき、得られる検索結果の行数(レコード数)として、最も適切なものはどれでしょうか?
| 注文番号 | 顧客ID | 商品名 |
|---|---|---|
| S001 | C100 | りんご |
| S002 | C200 | みかん |
| S003 | C100 | バナナ |
| S004 | C300 | りんご |
| S005 | C200 | ぶどう |
| S006 | C100 | りんご |
SELECT DISTINCT 顧客ID FROM 注文
① 3行
② 4行
③ 5行
④ 6行
2. 正解:
正解: ① 3行
3. 解説:同じ値は「1つだけ」にまとめる
SQLにおいて、通常通り `SELECT 顧客ID FROM 注文` とだけ書くと、表にあるデータがそのまま全部(6行)出てきてしまいます。しかし、列名の前に`DISTINCT`を付けることで、重複した値を自動的に綺麗にカットしてくれます。
元の「注文」表から「顧客ID」の列だけを抜き出すと、以下の6行になります。
・C100、C200、C100、C300、C200、C100
ここに DISTINCT が適用されると、ダブっている「C100(3回登場)」と「C200(2回登場)」がそれぞれ1つに集約されます。
【 実行結果の表(サンプル) 】 ← ココが問題の正解!
| 顧客ID |
|---|
| C100 |
| C200 |
| C300 |
重複が除外された結果、「C100」「C200」「C300」の合計3行が抽出されます。
★ ② 4行の罠:もしSQL文が `SELECT DISTINCT 商品名 FROM 注文` だった場合、商品名は「りんご(3つあるが1つにまとめられる)」「みかん」「バナナ」「ぶどう」の合計4種類になるため、4行が正解になります。列名を勘違いした人を落とす罠です。
★ ④ 6行の罠:`DISTINCT` の意味を忘れてしまい、単純に元の表の全レコード数(6行)をそのまま答えてしまった場合の数値です。
1. 理解のコツ: 「出席簿のスタンプラリー」に例えてみましょう。
・お店に遊びに来たお客さんの名前を、来た順番にノートに書くと、何度も来てくれる常連さんの名前は重複して何回もノートに載りますよね(これが元の「注文」表の6行です)。
・ある日、店長から「結局、うちの店には『合計で何人の異なるお客さん』が来てくれたの?名簿を作って」と言われました。このとき、同じ人の名前を2回以上書かずに、ダブりを消して「ユニークなメンバーだけ」をすっきり一覧にする作業。これこそがDISTINCTの役割です。
2. 試験対策の視点: 「SELECT DISTINCT 列名」という形を見たら、頭の中で「その列にある値の種類(バリエーション)の数を数える」と瞬時に変換してください。また、応用情報以上の試験では、行数を数える関数と組み合わせて `SELECT COUNT(DISTINCT 顧客ID) FROM 注文` (結果は「3」)という形で、重複を除いた件数をダイレクトに計算させる問題としても頻出します。
4. まとめ
「検索結果から全く同じデータの重複行を完全に排除し、一意(ユニーク)なデータだけを抽出するためのSQLキーワード」。これがDISTINCTです。データベースの基本中の基本でありながら、実務のデータ集計でも毎日必ず使う超重要コマンドですので、確実にマスターしておきましょう!