忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、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

【SQL】文字のパターンを見抜いて狙い撃ち!「LIKE演算子とワイルドカード」|情報処理問題1000本ノック

データベースから「名前に『データ』が含まれる商品」や「型番が『A』から始まるデータ」を検索する。実務でも必須となる文字列のあいまい検索「LIKE演算子」を攻略しましょう。

1. 【 問題 】:文字列のパターンマッチング(あいまい検索)

【 問題 】 次の「社員」表に対して、SQL文を実行したとき、得られる検索結果の行数(レコード数)として、最も適切なものはどれでしょうか?
なお、SQL文中の「%」は0文字以上の任意の文字列を表すワイルドカード記号(パターン文字)とします。

【 社員 表 】
社員番号氏名部署名
E001 佐藤 敏夫 開発1課
E002 鈴木 データ DX推進課
E003 高橋 明美 開発2課
E004 データ 一郎 総務課
E005 田中 次郎 開発1課
E006 木村 データ太 企画課
【 実行するSQL文 】
SELECT 氏名 FROM 社員 WHERE 氏名 LIKE '%データ%'

① 3行
② 2行
③ 1行
④ 6行

2. 正解:

正解: ① 3行

3. 解説:前後をワイルドカードで挟むと「部分一致」になる

SQLで文字の「部分一致(あいまい検索)」を行いたいときは、`=` ではなく `LIKE` 演算子を使用します。そして、文字がどこにあっても引っかかるようにするために使われるのが「%(ワイルドカード)」です。

【ワイルドカード `%` の位置による検索パターンの違い】

・`'データ%'`(前方一致):頭に「データ」がつく人だけ(「データ 一郎」の1行のみ)
・`'%データ'`(後方一致):お尻に「データ」がつく人だけ(「鈴木 データ」の1行のみ)
`'%データ%'`(部分一致):今回の正解です。「データの前に文字があってもなくても、後ろに文字があってもなくても良い」という意味になります。つまり、氏名の中のどこかに「データ」という3文字が含まれていればすべて抽出されます。 ← ココが問題の正解!

【 実行結果の表(サンプル) 】
氏名
鈴木 データ
データ 一郎
木村 データ太

「鈴木 データ」「データ 一郎」だけでなく、前後に文字がある「木村 データ太」も条件に合致するため、合計3行が抽出されます。
[ 受験生を惑わせる「ワイルドカードの読み違え」の罠 ]
★ ② 2行の罠:「データという文字が、名前の最初か最後にきているもの」と勘違いして、途中に文字が入っている「木村 データ太」を数え落としてしまった人を落とす罠です。
★ ③ 1行の罠:`'%データ%'` ではなく `'データ%'`(前方一致)だと勘違いし、苗字がデータさんである「データ 一郎」の1行だけをカウントしてしまった場合の数値です。

1. 理解のコツ: 「ネットショッピングのキーワード検索」に例えてみましょう。
・検索窓に「チョコ」と入れて検索したとき、お菓子の「チョコ(完全一致)」だけでなく、「生チョコ(後方一致)」や「チョコバナナ(前方一致)」、さらには「高級チョコレート(部分一致)」も全部まとめてヒットしますよね。
・SQLの `LIKE '%データ%'` は、まさにこのネット検索と全く同じ動きをデータベースに命令しています。『とにかく、どこかにこの文字が入っていれば全部持ってきて!』という、一番よく使う便利な検索方法です。
2. 試験対策の視点: 試験では、今回の `%`(0文字以上の任意の文字列) に加えて、もう一つのワイルドカードである `_`(アンダースコア:任意の「1文字」) との引っ掛け問題が非常によく出題されます。例えば `LIKE 'データ_'` だと、「データ+後ろにちょうど1文字だけ」という意味になり、「データ太」は2文字なのでヒットしなくなります。この2つの記号の意味の違いを正確に見極めることが、午前試験のSQL問題を制するカギです。




4. まとめ

「特定の文字列が含まれるデータを柔軟に検索するために、LIKE演算子とワイルドカード記号(%や_)を組み合わせてパターンマッチングを行う手法」。これがSQLのあいまい検索です。新分野【SQL】の土台として、この条件抽出のルールをがっちり押さえておきましょう!