SQLのJOINとは?初心者向けに基本構文と使い方をわかりやすく解説

この記事のポイント

SQL JOINはデータベースの複数テーブルを結合する重要な機能です。この記事では基本概念から実践的な使い方まで、初心者の方にもわかりやすく解説していきます。

  • 複数のテーブルを結合してデータを取得する仕組み
  • INNER JOINやLEFT JOINなど各種類の特徴と使い分け
  • ON句を使った結合条件の正しい書き方

以上のポイントを押さえることで、効率的なデータ取得が可能になります。

目次

JOINの基礎知識

JOINはSQLにおいて最も重要な機能の一つです。実際のビジネスでは、データは効率的な管理のために複数のテーブルに分けて保存されています。JOINを理解することで、これらの分散されたデータを組み合わせて、必要な情報を効率的に取得できるようになります。

【関連】
SQLをもっと詳しく学ぶならpaizaラーニング

JOINの役割と目的

データベースでは情報を効率的に管理するため、データを複数のテーブルに分けて保存します。例えば、ペットショップのシステムでは、動物の基本情報と飼い主情報を別々のテーブルで管理することが一般的です。JOINを使用することで、これらの関連するテーブルを結合し、一つのクエリで必要な情報をすべて取得できます。これにより、データの重複を避けながら、柔軟で効率的なデータ管理が実現できます。

まず、基本となるデータベースの構造を確認しましょう。

animalsテーブル(動物情報)

animal_id

name

species

owner_id

1

ポチ

イヌ

1

2

タマ

ネコ

2

3

ハナ

ウサギ

1

例で使用するデータベースを作成したい方は、次のSQLスクリプトを参考にしてください。

-- animalsテーブル(動物情報)の作成 CREATE TABLE animals ( animal_id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, species VARCHAR(50) NOT NULL, owner_id INT NOT NULL ); -- animalsテーブルへのデータ挿入 INSERT INTO animals (animal_id, name, species, owner_id) VALUES (1, 'ポチ', 'イヌ', 1), (2, 'タマ', 'ネコ', 2), (3, 'ハナ', 'ウサギ', 1); -- 確認 SELECT * FROM animals;

ownersテーブル(飼い主情報)

owner_id

owner_name

address

1

田中太郎

東京都

2

佐藤花子

大阪府

-- ownersテーブル(飼い主情報)の作成 CREATE TABLE owners ( owner_id SERIAL PRIMARY KEY, owner_name VARCHAR(50) NOT NULL, address VARCHAR(100) ); -- ownersテーブルへのデータ挿入 INSERT INTO owners (owner_id, owner_name, address) VALUES (1, '田中太郎', '東京都'), (2, '佐藤花子', '大阪府'); -- 確認 SELECT * FROM owners;

※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です

次に、基本となるテーブルを確認したところで、animalsテーブルとownersテーブルをJOINしてデータを取得してみましょう。  

以下のSQLを実行すると、各動物と飼い主の情報が結合された結果が得られます。

SELECT animals.name, animals.species, owners.owner_name FROM animals JOIN owners ON animals.owner_id = owners.owner_id;

出力結果

name

species

owner_name

ポチ

イヌ

田中太郎

タマ

ネコ

佐藤花子

ハナ

ウサギ

田中太郎

JOINとWHEREの違い

JOINとWHERE句は混同されやすいですが、役割が大きく異なります。

JOINはテーブル間の関係を定義してデータを結合する機能です。一方、WHERE句は既に結合されたデータから特定の条件に合致するレコードを絞り込む機能です。JOINはデータの結合条件を、WHERE句はデータの抽出条件を指定します。適切に使い分けることで、意図した結果を効率的に取得できます。

SELECT animals.name, owners.owner_name FROM animals JOIN owners ON animals.owner_id = owners.owner_id WHERE animals.species = 'イヌ';

出力結果

name

owner_name

ポチ

田中太郎

JOINの種類と特徴

SQLにはさまざまな種類のJOINが用意されており、それぞれ異なる結合方法を提供しています。最もよく使用されるINNER JOINから、より高度なFULL OUTER JOINまで、各JOINの特徴を理解することで、データの取得方法を柔軟に選択できるようになります。ここでは主要なJOINの種類とその使い分けについて詳しく解説します。

INNER JOINの構文と例

INNER JOINは最も基本的なJOINです。両方のテーブルに共通して存在するデータのみを取得します。結合条件に一致するレコードがない場合、そのデータは結果から除外されます。この特性により、確実に関連データが存在するレコードのみを取得したい場合に最適です。INNER JOINは単にJOINと書くことも可能で、最も頻繁に使用されるJOINの種類です。

以下の例では、飼い主が登録されている動物のみを取得しています。

SELECT animals.name, animals.species, owners.owner_name FROM animals INNER JOIN owners ON animals.owner_id = owners.owner_id;

出力結果

name

species

owner_name

ポチ

イヌ

田中太郎

タマ

ネコ

佐藤花子

ハナ

ウサギ

田中太郎

LEFT JOIN・RIGHT JOINの違い

LEFT JOINは左側のテーブルのすべてのレコードを取得し、右側のテーブルから一致するデータがあれば結合します。一致するデータがない場合は、右側の列にはNULLが設定されます。RIGHT JOINはその逆で、右側のテーブルのすべてのレコードを保持します。LEFT JOINの方が一般的に使用され、主テーブルのデータを漏らさずに関連情報を取得したい場合に有効です。

飼い主情報がない動物も含めて取得する例です。

まず、動物テーブルにowner_idが3の「モモ(ハムスター)」を追加します。

-- animalsテーブルへのデータ挿入 INSERT INTO animals (animal_id, name, species, owner_id) VALUES (4, 'モモ', 'ハムスター', 3);

追加したデータを含めて、LEFT JOIN を使用して各動物と飼い主の情報を取得してみましょう。

SELECT animals.name, animals.species, owners.owner_name FROM animals LEFT JOIN owners ON animals.owner_id = owners.owner_id;

出力結果

name

species

owner_name

ポチ

イヌ

田中太郎

タマ

ネコ

佐藤花子

ハナ

ウサギ

田中太郎

モモ

ハムスター

NULL

FULL OUTER JOINとCROSS JOIN

FULL OUTER JOINは両方のテーブルのすべてのレコードを取得します。どちらか一方にしか存在しないデータも含めて、完全な情報を把握したい場合に使用します。CROSS JOINは結合条件を指定せず、左右のテーブルのすべての組み合わせを生成します。これは直積とも呼ばれ、大量のデータが生成されるため注意が必要です。主にテストデータの生成や特殊な分析で使用されます。

SELECT animals.name, owners.owner_name FROM animals FULL OUTER JOIN owners ON animals.owner_id = owners.owner_id;

出力結果

name

owner_name

ポチ

田中太郎

タマ

佐藤花子

ハナ

田中太郎

モモ

NULL

JOINの書き方とON句の使い方

JOINを効果的に使用するには、正しい構文と結合条件の書き方を理解することが重要です。特にON句は結合の要となる部分で、適切に設定することでデータの整合性を保ちながら必要な情報を取得できます。ここではJOINの基本的な書き方から、ON句とWHERE句の使い分け、さらにサブクエリとの比較まで詳しく解説します。

JOINの基本構文

JOINの基本構文はSELECT文の中でFROM句の後に記述します。構文は「FROM テーブル1 JOIN テーブル2 ON 結合条件」という形になります。テーブル名が長い場合は、エイリアス(別名)を使用することで可読性を向上できます。複数のテーブルを結合する場合は、JOINを連続して記述します。結合条件は通常、主キーと外部キーの関係を指定しますが、任意の条件を設定することも可能です。

以下は基本的なJOIN構文の例です。

SELECT a.name, a.species, o.owner_name, o.address FROM animals a JOIN owners o ON a.owner_id = o.owner_id WHERE a.species = 'ネコ';

出力結果

name

species

owner_name

address

タマ

ネコ

佐藤花子

大阪府

ON句による結合条件の指定

ON句はJOINにおいて最も重要な部分で、どのような条件でテーブルを結合するかを定義します。多くの場合、主キーと外部キーの等価条件を指定しますが、範囲条件や複数条件を組み合わせることも可能です。WHERE句と混同されがちですが、ON句はテーブルの結合方法を決定し、WHERE句は結合後のデータをフィルタリングします。この違いを理解することで、意図した結果を正確に取得できます。

複数条件でのJOINの例です。

SELECT a.name, a.species, o.owner_name FROM animals a JOIN owners o ON a.owner_id = o.owner_id AND o.owner_name LIKE '%太郎%';

出力結果

name

species

owner_name

ポチ

イヌ

田中太郎

ハナ

ウサギ

田中太郎

JOINとサブクエリの使い分け

JOINとサブクエリは、どちらも複数テーブルからデータを取得する方法ですが、使い分けが重要です。JOINは複数テーブルの列を同時に取得したい場合に適しています。一方、サブクエリは特定の条件を満たすデータの存在確認や、集計値を条件として使用する場合に有効です。パフォーマンス面では、一般的にJOINの方が高速ですが、クエリの可読性や論理的な構造を重視する場合はサブクエリが適していることもあります。

サブクエリを使用した例との比較です。

-- JOINを使用 SELECT DISTINCT o.owner_name FROM owners o JOIN animals a ON o.owner_id = a.owner_id;

出力結果

owner_name

田中太郎

佐藤花子

実行順序とパフォーマンスへの影響

SQLクエリを効率的に実行するには、データベースエンジンがJOINをどのように処理するかを理解することが重要です。JOINの実行順序や複数テーブルの結合方法は、クエリのパフォーマンスに大きな影響を与えます。ここでは、SQLエンジンの内部動作と、効率的なJOINを書くためのポイントについて解説します。

JOINの実行順序

SQLエンジンはJOINを処理する際、最も効率的な順序を自動的に決定します。一般的に、結合するレコード数が少なくなるような順序で処理されます。

ただし、クエリの書き方によって実行計画が変わる場合があります。FROM句に記述されたテーブルの順序、インデックスの有無、テーブルのサイズなどを考慮して最適化されます。複雑なJOINでは、EXPLAIN文を使用して実行計画を確認し、パフォーマンスの改善点を見つけることができます。

実行順序を意識したクエリの例です。

SELECT a.name, a.species, o.owner_name FROM animals a JOIN owners o ON a.owner_id = o.owner_id WHERE a.species = 'イヌ' ORDER BY a.name;

出力結果

name

species

owner_name

ポチ

イヌ

田中太郎

複数JOINの注意点

複数のテーブルをJOINする場合、結合順序とパフォーマンスに特に注意が必要です。JOINを重ねるたびに処理されるデータ量が増加し、実行時間が長くなる可能性があります。適切なインデックスの設定、結合条件の最適化、WHERE句による早期フィルタリングを行うことで、パフォーマンスを改善できます。また、複数JOINでは結合の論理的な順序を意識し、関連性の強いテーブルから順番に結合することが重要です。

獣医情報テーブルを追加した複数JOINの例です。

veterinariansテーブル(獣医情報)

vet_id

vet_name

specialty

1

鈴木先生

小動物

2

高橋先生

大動物

-- veterinariansテーブル(獣医情報)の作成 CREATE TABLE veterinarians ( vet_id SERIAL PRIMARY KEY, vet_name VARCHAR(50) NOT NULL, specialty VARCHAR(50) NOT NULL ); -- veterinariansテーブルへのデータ挿入 INSERT INTO veterinarians (vet_id, vet_name, specialty) VALUES (1, '鈴木先生', '小動物'), (2, '高橋先生', '大動物'); -- 確認 SELECT * FROM veterinarians;

複数のテーブルをJOINする例として、animalsテーブルにvet_idカラムを追加した形で作成します。

※この項目内のみ冒頭のanimalsとは別のテーブルになります

animal_id

name

species

owner_id

vet_id

1

ポチ

イヌ

1

1

2

タマ

ネコ

2

1

3

ハナ

ウサギ

1

null

4

モモ

ハムスター

3

null

-- animalsテーブル(動物情報)の作成 CREATE TABLE animals ( animal_id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, species VARCHAR(50) NOT NULL, owner_id INT NOT NULL, vet_id INT ); -- animalsテーブルへのデータ挿入 INSERT INTO animals (animal_id, name, species, owner_id, vet_id) VALUES (1, 'ポチ', 'イヌ', 1, 1), (2, 'タマ', 'ネコ', 2, 1), (3, 'ハナ', 'ウサギ', 1, NULL), (4, 'モモ', 'ハムスター', 3, NULL); -- 複数JOINの例 -- animals・owners・veterinariansの3テーブルをJOINして、犬と猫の動物情報と飼い主・獣医情報を取得 SELECT a.name, a.species, o.owner_name, v.vet_name FROM animals a JOIN owners o ON a.owner_id = o.owner_id JOIN veterinarians v ON a.vet_id = v.vet_id WHERE a.species IN ( 'イヌ', 'ネコ' );

出力結果

name

species

owner_name

vet_name

ポチ

イヌ

田中太郎

鈴木先生

タマ

ネコ

佐藤花子

鈴木先生

よくある質問(Q&A)

Q: JOINとUNIONの違いは何ですか? 

A: JOINは複数テーブルを横方向に結合してデータを組み合わせる機能です。一方、UNIONは複数のクエリ結果を縦方向に結合して一つの結果セットにまとめます。

JOINは関連するテーブル同士を結合し、UNIONは同じ構造の結果を統合する際に使用します。用途が全く異なる機能です。

Q: ON句とWHERE句はどう使い分けるの? 

A: ON句はテーブルの結合条件を指定し、WHERE句は結合後のデータをフィルタリングします。INNER JOINでは結果が似ることもありますが、LEFT JOINなどでは大きく異なります。ON句の条件は結合処理時に評価され、WHERE句は結合完了後に評価されるため、実行タイミングが違います。

Q: JOINのパフォーマンスを向上させるには? 

A: 結合に使用する列にインデックスを作成することが最も効果的です。また、WHERE句で早期にデータを絞り込み、不要な列をSELECT句に含めないことも重要です。大きなテーブル同士の結合では、結合キーのデータ型を一致させ、NULL値の扱いにも注意が必要です。

Q: 自己結合とは何ですか? 

A: 同一テーブル内でJOINを行うことを自己結合といいます。階層構造を持つデータや、同じテーブル内の異なるレコード同士を比較する場合に使用します。テーブルエイリアスを使って、あたかも別のテーブルのように扱うことがポイントです。組織図や商品の関連商品情報などでよく使われます。

次のクエリは、同じ種(species)の動物を組み合わせて表示する自己結合の例です。

SELECT a1.name, a2.name FROM animals a1 JOIN animals a2 ON a1.species = a2.species;

Q: JOINでNULLの扱いはどうなりますか? 

A: JOINの結合条件でNULL同士は一致しないものとして扱われます。LEFT JOINで一致するデータがない場合、結果にはNULLが設定されます。

NULL値を判定する場合はIS NULL演算子を使用し、必要に応じてCOALESCE関数でNULLを別の値に置き換えることも可能です。

まとめ

SQL JOINを使いこなせば、複数テーブルから柔軟にデータを取得できます。リレーショナルデータベースにおいて、正規化されたテーブル構造から必要な情報を組み合わせて取得するには、JOINの理解が不可欠です。

この記事では、JOINの基本構文から実用的な使い方まで解説しました。JOINの活躍場面について確認しておきましょう。

JOINが活躍する場面

  • 複数テーブルから関連情報を一括取得
  • データの重複を避けつつ柔軟に分析
  • レポート作成や集計処理で効率化

JOINを使う上で押さえておきたいポイントは次の通りです。

重要なポイント

  • INNER JOINは両テーブルに存在するデータのみを取得
  • LEFT JOINは左テーブルのすべてのレコードを保持
  • ON句は結合条件、WHERE句はデータのフィルタリングに使用
  • 適切なインデックス設定でパフォーマンスが大幅に向上
  • 複数JOINでは結合順序と論理的な構造を意識

これらの基本概念を理解し、実際のデータで練習を重ねることで、効率的なSQLクエリが書けるようになります。データベースの設計思想を理解し、適切なJOINを選択することで、保守性の高いシステム構築が可能になります。

プログラミングスキルを体系的に学ぶなら、実践的な問題演習ができるpaizaラーニングがおすすめです。SQLの基本から応用まで、段階的にスキルアップできる環境が整っています。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. SQLのナレッジ記事一覧
  4. SQLのJOINとは?初心者向けに基本構文と使い方をわかりやすく解説