テーブルの結合は SQL Server で最も重要な概念の1つで、複数のテーブルのデータを組み合わせて意味のあるレポートや分析を作成できます。複雑なレポートを作成する場合でも、データ分析を行う場合でも、JOIN の仕組みを理解することはすべての SQL 開発者にとって不可欠です。
この包括的なガイドでは、SQL Server の各 JOIN の種類を、実践的な例、わかりやすい解説、実際のシナリオとともに順を追って説明します。
🔖 クイックリファレンス: すぐに確認したい方は、すべての JOIN の種類、図解、コード例を1か所にまとめた SQL JOIN チートシートをご覧ください。
SQL Server の JOIN を理解する
SQL Server の JOIN は、2つ以上のテーブルの行を、テーブル間で関連する列に基づいて結合する操作です。最も一般的な JOIN の種類は次のとおりです:
- INNER JOIN: 両方のテーブルで一致するレコードのみを返します
- LEFT JOIN: 左テーブルのすべてのレコードと、右テーブルの一致するレコードを返します
- RIGHT JOIN: 右テーブルのすべてのレコードと、左テーブルの一致するレコードを返します
- FULL OUTER JOIN: いずれかのテーブルに一致がある場合にすべてのレコードを返します
サンプルデータの準備
例では、一般的なビジネスシナリオを表す2つのシンプルなテーブルを使用します:
Orders テーブル:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
Product NVARCHAR(50),
OrderDate DATE
);
INSERT INTO Orders VALUES
(1, 1, 'Laptop', '2024-01-15'),
(2, 2, 'Mouse', '2024-01-16'),
(3, 3, 'Keyboard', '2024-01-17');
| OrderID | CustomerID | Product | OrderDate |
|---|---|---|---|
| 1 | 1 | Laptop | 2024-01-15 |
| 2 | 2 | Mouse | 2024-01-16 |
| 3 | 3 | Keyboard | 2024-01-17 |
Customers テーブル:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name NVARCHAR(50),
City NVARCHAR(50)
);
INSERT INTO Customers VALUES
(1, 'John Doe', 'New York'),
(2, 'Jane Smith', 'Los Angeles'),
(4, 'Alex Johnson', 'Chicago');
| CustomerID | Name | City |
|---|---|---|
| 1 | John Doe | New York |
| 2 | Jane Smith | Los Angeles |
| 4 | Alex Johnson | Chicago |
INNER JOIN
INNER JOIN は、両方のテーブルに一致する値がある行のみを返します。最もよく使われる JOIN で、両方のテーブルに存在するレコードだけを確認したい場合に最適です。
INNER JOIN を使うべき場面
- 両方のテーブルに存在するデータが必要な場合
- 完全な関連を示すレポートを作成する場合
- 不完全なレコードを除外したい場合
SQL クエリの例
SELECT
o.OrderID,
c.Name,
c.City,
o.Product,
o.OrderDate
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID;
結果
| OrderID | Name | City | Product | OrderDate |
|---|---|---|---|---|
| 1 | John Doe | New York | Laptop | 2024-01-15 |
| 2 | Jane Smith | Los Angeles | Mouse | 2024-01-16 |
ポイント:
- 返されるのは2行のみです(CustomerID 3 が Customers テーブルに存在しないため、OrderID 3 は除外されます)
- 注文したことのある顧客のみが結果に表示されます
- 結合条件(
o.CustomerID = c.CustomerID)によって一致する行が決まります
LEFT JOIN
LEFT JOIN(LEFT OUTER JOIN とも呼ばれます)は、左テーブルのすべての行と、右テーブルの一致する行を返します。一致がない場合、右テーブルの列には NULL が表示されます。
LEFT JOIN を使うべき場面
- メインのテーブル(左テーブル)のすべてのレコードが必要な場合
- データの欠落や関連の欠如を示すレポートを作成する場合
- 一致しないレコードを見つけたい場合
SQL クエリの例
SELECT
o.OrderID,
c.Name,
c.City,
o.Product,
o.OrderDate
FROM Orders o
LEFT JOIN Customers c ON o.CustomerID = c.CustomerID;
結果
| OrderID | Name | City | Product | OrderDate |
|---|---|---|---|---|
| 1 | John Doe | New York | Laptop | 2024-01-15 |
| 2 | Jane Smith | Los Angeles | Mouse | 2024-01-16 |
| 3 | NULL | NULL | Keyboard | 2024-01-17 |
ポイント:
- 3件の注文すべてが結果に表示されます(左テーブルのデータはすべて保持されます)
- CustomerID 3 が Customers テーブルに存在しないため、OrderID 3 の顧客情報は NULL と表示されます
- 有効な顧客データがない注文を特定するのに役立ちます
RIGHT JOIN
RIGHT JOIN(RIGHT OUTER JOIN とも呼ばれます)は、右テーブルのすべての行と、左テーブルの一致する行を返します。一致がない場合、左テーブルの列には NULL が表示されます。
RIGHT JOIN を使うべき場面
- 右テーブルのすべてのレコードが必要な場合
- LEFT JOIN ほど一般的ではありません(通常は LEFT JOIN に書き換えられます)
- 「メイン」のデータが2番目のテーブルにある場合に便利です
SQL クエリの例
SELECT
o.OrderID,
c.Name,
c.City,
o.Product,
o.OrderDate
FROM Orders o
RIGHT JOIN Customers c ON o.CustomerID = c.CustomerID;
結果
| OrderID | Name | City | Product | OrderDate |
|---|---|---|---|---|
| 1 | John Doe | New York | Laptop | 2024-01-15 |
| 2 | Jane Smith | Los Angeles | Mouse | 2024-01-16 |
| NULL | Alex Johnson | Chicago | NULL | NULL |
ポイント:
- 3人の顧客すべてが結果に表示されます(右テーブルのデータはすべて保持されます)
- Alex Johnson は注文をしていないため、注文情報は NULL と表示されます
- 購入履歴のない顧客を特定するのに役立ちます
FULL OUTER JOIN
FULL OUTER JOIN(または単に FULL JOIN)は、いずれかのテーブルに一致がある場合にすべての行を返します。LEFT JOIN と RIGHT JOIN の結果を組み合わせ、どちらかに一致がない箇所には NULL を表示します。
FULL OUTER JOIN を使うべき場面
- 両方のテーブルのすべてのレコードが必要な場合
- 包括的なデータ分析を行う場合
- テーブル間のすべての関連と欠落を特定する場合
SQL クエリの例
SELECT
o.OrderID,
c.Name,
c.City,
o.Product,
o.OrderDate
FROM Orders o
FULL OUTER JOIN Customers c ON o.CustomerID = c.CustomerID;
結果
| OrderID | Name | City | Product | OrderDate |
|---|---|---|---|---|
| 1 | John Doe | New York | Laptop | 2024-01-15 |
| 2 | Jane Smith | Los Angeles | Mouse | 2024-01-16 |
| 3 | NULL | NULL | Keyboard | 2024-01-17 |
| NULL | Alex Johnson | Chicago | NULL | NULL |
ポイント:
- 考えられる4行すべてが結果に表示されます
- 孤立した注文(OrderID 3)と注文のない顧客(Alex Johnson)の両方が表示されます
- LEFT JOIN と RIGHT JOIN の両方の包括的な視点を組み合わせます
- テーブル間の関係を最も完全に把握できます
まとめ
SQL Server の JOIN を理解することは、効果的なデータベースクエリに不可欠です。以下にクイックリファレンスを示します:
| JOIN の種類 | 返す内容 | ユースケース |
|---|---|---|
| INNER JOIN | 一致するレコードのみ | 最も一般的。完全な関連が必要な場合 |
| LEFT JOIN | 左のすべて + 一致する右 | 左テーブルが主の場合。右側の欠落データの検出 |
| RIGHT JOIN | 右のすべて + 一致する左 | あまり一般的でない。右テーブルが主の場合 |
| FULL OUTER JOIN | 両方のすべてのレコード | 完全な分析。すべての関連と欠落の検出 |
ベストプラクティス
-
テーブルエイリアスを使う(Orders には
o、Customers にはc)とクエリがすっきりします - 迷ったらINNER JOIN から始め、要件に応じて調整しましょう
- 読みやすさのため、RIGHT JOIN よりもLEFT JOIN を多く使いましょう
-
ON句で必ず結合条件を指定しましょう - パフォーマンスを考慮する - インデックス付きの列での JOIN は高速です
練習のヒント
SQL Server の JOIN をマスターするには:
- 上記の例のような小さなデータセットから始める
- ベン図を描いて各 JOIN が返す内容を視覚化する
- さまざまなテーブル構造や関連で試してみる
- SQL Server Management Studio や Beekeeper Studio を使って練習する
- NULL 値や関連の欠如などのエッジケースをテストする
覚えておいてください: JOIN はリレーショナルデータベースの基本です。マスターすれば、データから有意義なインサイトを引き出す強力なクエリを作成できるようになります。
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studio は以前の SQL ワークフローを完全に置き換えました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベース GUI を試しましたが、Beekeeper は機能とシンプルさのバランスが完璧です。とにかくちゃんと動きます。」