忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、1問1問「徹底解説」ブログです。単なる過去問の暗記ではなく、なぜその答えになるのかを本質的に理解できるよう解説します。書籍などでは学べない最新用語やトレンドを踏まえてご紹介します。

【SQL】重複データをすっきり1つにまとめる!「DISTINCT」構文|情報処理問題1000本ノック

データベースからデータを取り出す際、同じ値が何度も出てくると見づらくなってしまいます。重複を自動で削ぎ落としてくれる必須キーワード「DISTINCT」を攻略しましょう。

1. 【 問題 】:関係データベースのSQL(重複行の除外)

【 問題 】 次の「注文」表に対して、SQL文を実行したとき、得られる検索結果の行数(レコード数)として、最も適切なものはどれでしょうか?

【 注文 表 】
注文番号顧客ID商品名
S001 C100 りんご
S002 C200 みかん
S003 C100 バナナ
S004 C300 りんご
S005 C200 ぶどう
S006 C100 りんご
【 実行するSQL文 】
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です。データベースの基本中の基本でありながら、実務のデータ集計でも毎日必ず使う超重要コマンドですので、確実にマスターしておきましょう!


PR