SQLの結合とDISTINCT(SQL join / DISTINCT)
2つの表を条件に合う行どうしで結び付けるのが結合。結合で増えた同じ行を1行にまとめるのがDISTINCT。
もう少し詳しい説明
なぜ結合するのか
関係データベースでは、同じ事実を1か所にまとめるために表を分けます(正規化)。
| 表 | 持つもの |
|---|---|
| 講師表 | 講師コード、講師名 |
| 講座表 | 講座コード、講座名、講師コード |
「講座名と講師名を並べて出したい」とき、2つの表をつなぎ直します。 これが結合です。
INNER JOINの書き方
SELECT 講座.講座名, 講師.講師名
FROM 講座
INNER JOIN 講師
ON 講座.講師コード = 講師.講師コード
| 部分 | 役割 |
|---|---|
| FROM 講座 | 一方の表 |
| INNER JOIN 講師 | もう一方の表 |
| ON … | どの列どうしで結び付けるか |
ON の条件を書き忘れると、すべての行の組合せが出ます。 100行と100行で10,000行です。
結合の種類
| 種類 | 残る行 |
|---|---|
| 内部結合(INNER JOIN) | 両方にそろっている行だけ |
| 左外部結合(LEFT OUTER JOIN) | 左の表の行は全部残す。相手が無い部分はNULL |
| 右外部結合(RIGHT OUTER JOIN) | 右の表の行を全部残す |
| 完全外部結合(FULL OUTER JOIN) | 両方の行を全部残す |
担当する講師が決まっていない講座も出したい場合は、左外部結合を使います。内部結合では、その講座が消えます。
| 結合の種類 | 講師が未定の講座 |
|---|---|
| INNER JOIN | 出てこない |
| LEFT OUTER JOIN(講座を左に置く) | 出てくる。講師名はNULL |
「件数が合わない」とき、ここが原因であることが多くあります。
結合で行が増える場合
1対多の関係を結合すると、1の側の行が多の側の件数だけ現れます。
講師1人が3つの講座を担当している場合:
| 講師名 | 講座名 |
|---|---|
| A | 講座1 |
| A | 講座2 |
| A | 講座3 |
講師名だけを取り出すと、同じ名前が3行出ます。
SELECT 講師.講師名
FROM 講師 INNER JOIN 講座 ON …
結果:A、A、A
DISTINCT
重複している行を1行にまとめる指定です。
SELECT DISTINCT 講師.講師名
FROM 講師 INNER JOIN 講座 ON …
結果:A
| 決まり | 中身 |
|---|---|
| 書く場所 | SELECTの直後。1回だけ |
| 判定の対象 | SELECTで選んだすべての列の値 |
| NULLの扱い | NULLどうしは同じものとして扱われ、まとめられる |
列を1つ足すと、まとまらなくなることがあります。
| 取り出す列 | 結果の行数 |
|---|---|
| DISTINCT 講師名 | 1行 |
| DISTINCT 講師名, 講座名 | 3行(講座名が違うため) |
GROUP BYとの違い
| DISTINCT | GROUP BY | |
|---|---|---|
| すること | 重複を取り除く | グループに分ける |
| 集計できるか | できない | できる(COUNT、SUMなど) |
| 条件を付ける | WHERE(分ける前) | HAVING(分けたあと) |
件数や合計が要るならGROUP BY、重複を消すだけならDISTINCTです。
-- 講師ごとの担当講座数
SELECT 講師.講師名, COUNT(*)
FROM 講師 INNER JOIN 講座 ON …
GROUP BY 講師.講師名
DISTINCTで消すより、設計を見る
DISTINCTで消している重複が、本当は結合の条件の不足であることがあります。
| 重複の原因 | 直し方 |
|---|---|
| ON の条件が足りない | 条件を足す |
| 1対多の結合で、多の側の列を使っていない | 結合そのものが要らないか見直す |
| 本当に同じ行が複数ある | DISTINCTで消す |
DISTINCTを付けて行数が大きく減るときは、結合の条件を確かめてください。 条件の書き漏れを覆い隠している場合があります。
試験ではこう出る
科目A(旧・午前)では、内部結合と外部結合の違いが問われます。相手が無い行が残るかどうかです。
DISTINCTとGROUP BYの違いも出ます。集計できるかどうかが分かれ目です。
結合の結果の行数を数える形も出ます。1対多で何行になるかを数えます。
午後や応用情報(データベース)では、SQLの空欄を埋める形で出ます。INNER JOIN、ON の条件、DISTINCT のどれが入るかです。解答群が無く、字句を自分で書くことがあります。
関連する用語
- SELECT文の基本(SELECT・FROM・WHERE)
- どの列を、どの表から、どの条件で取り出すか
- 主キー
- 結合の条件に使う列。1行を1つに決める
- 外部キー
- 結合の相手側になる列
- 関係データベース
- 表を分けて持つ仕組み。結合はそれをつなぎ直す操作
ミニクイズ
SELECT文にDISTINCTを付ける効果として、最も適切なものはどれか。
正解は 2番:取り出した結果の中で、すべての列の値が同じ行が複数あるとき、1行にまとめる
DISTINCTは、取り出した結果の中で重複している行を1行にまとめる指定です。判定はSELECTで選んだすべての列の値で行います。グループごとの集計はGROUP BY、並べ替えはORDER BY、件数を絞るのはLIMITやFETCH FIRSTで、いずれも別の指定です。重複を取り除くだけで、集計はしない点が要点です。
この分野をまとめて解く → データベースのミニテスト(全35問)
最終更新:2026-11-09