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との違い

DISTINCTGROUP 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