SQLを学ぶ中で「サブクエリとJOINはどちらを使えばいいの?」という疑問を持つ方は非常に多いです。
どちらも複数テーブルのデータを組み合わせる際に使われますが、それぞれに特徴と適した場面があります。
この記事では、サブクエリとJOINの違いと使い分けについて、内部結合・外部結合・パフォーマンス・可読性の観点からわかりやすく比較解説しています。
SQL設計の判断力を高めたい方はぜひ参考にしてください。
サブクエリとJOINの基本的な違いを理解しよう
それではまず、サブクエリとJOINの基本的な違いについて解説していきます。
| 比較項目 | サブクエリ | JOIN |
|---|---|---|
| 基本的な仕組み | クエリの中に別のクエリを入れ子で記述 | 複数テーブルを結合して1つの結果セットを生成 |
| 結果の返し方 | サブクエリの結果をメインクエリが利用 | 結合された全テーブルの列を同時に参照可能 |
| 可読性 | 複雑になるとネストが深くなり読みづらい | テーブル間の関係を明示的に表現しやすい |
| パフォーマンス | 相関サブクエリは遅くなりやすい | 多くの場合で最適化されやすい |
| 向いている場面 | 集計値との比較・存在確認・段階的処理 | 複数テーブルのデータを同時に表示したい場合 |
同じ結果をサブクエリとJOINで書いた場合の比較
サブクエリを使った例:
SELECT 社員名 FROM 社員
WHERE 部署ID IN (SELECT 部署ID FROM 部署 WHERE 部署名 = ‘開発部’);
JOINを使った例:
SELECT 社員.社員名 FROM 社員
INNER JOIN 部署 ON 社員.部署ID = 部署.部署ID
WHERE 部署.部署名 = ‘開発部’;
この例では両方とも同じ結果が得られますが、JOINの方がテーブル間の関係を明確に表現でき、可読性が高い傾向があります。
サブクエリが優れている場面
サブクエリはJOINでは表現しにくい処理に向いています。
「平均値より大きい行を抽出する」「特定のテーブルに該当する行が存在するかどうかで絞り込む」といったケースは、サブクエリの方が自然に表現できます。
また、FROM句にサブクエリを使うインラインビューは、GROUP BYした結果をさらに絞り込む場合など、JOINでは対応しにくい複雑な処理を可能にします。
JOINの種類とサブクエリとの使い分けを解説
続いては、JOINの種類とサブクエリとの使い分けを確認していきます。
JOINにはいくつかの種類があり、それぞれの特性を理解することで使い分けがしやすくなります。
INNER JOIN(内部結合)との比較
INNER JOINは両テーブルに一致するデータのみを取得する結合です。
「部署に所属する社員のみ取得する」などの処理はINNER JOINで表現でき、サブクエリよりも明確で処理効率が良いことが多いでしょう。
INNER JOINの例:
SELECT 社員.社員名, 部署.部署名
FROM 社員
INNER JOIN 部署 ON 社員.部署ID = 部署.部署ID;
LEFT JOIN(外部結合)との比較
LEFT JOINは左テーブルの全行を取得し、右テーブルに一致しない場合はNULLを返す外部結合です。
「注文していない顧客を含む全顧客リスト」のような「存在しないデータも含めて取得する」場合にLEFT JOINが適しています。
NOT EXISTS(サブクエリ)でも同様の結果を得られますが、LEFT JOIN + WHERE IS NULLの方がパフォーマンスが良いケースがあります。
パフォーマンス面での選択基準
パフォーマンスの観点では、一般的にJOINがサブクエリより最適化されやすいとされています。
特に相関サブクエリは外側クエリの行数分だけ実行されるため、大量データでは処理が遅くなることがあります。
ただし、モダンなRDBMS(MySQL・PostgreSQL・SQL Serverなど)は内部でサブクエリをJOINに変換して最適化することもあるため、実際の性能は実行計画(EXPLAINコマンド)で確認することが推奨されます。
サブクエリとJOINを使い分ける判断基準
続いては、サブクエリとJOINを使い分ける実践的な判断基準を確認していきます。
サブクエリを選ぶべき場面
サブクエリが適しているのは以下のような場面です。
集計値(AVG・MAX・MIN・COUNTなど)との比較が必要な場合、EXISTS・NOT EXISTSで存在確認をする場合、FROM句でグループ集計後にさらに絞り込む場合が挙げられます。
「別テーブルから取得した単一の値と比較したい」という場面では、サブクエリが最もシンプルで直感的な書き方になることが多いです。
JOINを選ぶべき場面
JOINが適しているのは複数テーブルの列を同時に表示したい場合、一致しないデータも含めて取得したい場合(LEFT JOIN)、大量データを効率よく処理したい場合です。
「社員名と部署名を一覧で表示する」のような、複数テーブルの情報を並べて出力する用途ではJOINが圧倒的に使いやすいでしょう。
CTEで可読性を高める方法
サブクエリが複雑になりすぎる場合は、WITH句(CTE:Common Table Expression)を使うことで可読性が大幅に向上します。
CTEを使った例:
WITH 開発部社員 AS (
SELECT 社員ID FROM 社員
WHERE 部署ID = (SELECT 部署ID FROM 部署 WHERE 部署名 = ‘開発部’)
)
SELECT 社員名 FROM 社員
WHERE 社員ID IN (SELECT 社員ID FROM 開発部社員);
まとめ
この記事では、サブクエリとJOINの違いと使い分けについて、特徴比較・JOINの種類・パフォーマンス・実践的な判断基準まで詳しく解説しました。
集計値との比較や存在確認はサブクエリ、複数テーブルの列を同時に参照したい場合やパフォーマンスを優先したい場合はJOINが適しています。
どちらを使うべきかは状況によって異なるため、実行計画を確認しながら最適な方法を選ぶ習慣をつけましょう。
今回の内容を参考に、サブクエリとJOINを状況に応じて使い分けられるSQLスキルを磨いていきましょう。