SQL ServerのJOIN(結合)とは?4種類の結合方法を構文・図解・実例で徹底解説
SQL Server(Transact-SQL)では、複数のテーブルにまたがるデータを1つのクエリで取得するためにJOIN(結合)を使用します。SQLコマンド内で2つ以上のテーブルを連結する際に使われる、非常に重要な機能です。
SQL Serverで利用できるJOINには、主に次の4種類があります。
- INNER JOIN … 内部結合。最も基本的な結合形式です。
- LEFT OUTER JOIN … LEFT JOINとも記述できます。
- RIGHT OUTER JOIN … RIGHT JOINとも記述できます。
- FULL OUTER JOIN … FULL JOINとも記述できます。
以下では、それぞれの構文・ベン図によるイメージ・具体的な使用例を通して、SQL ServerにおけるJOINの動作を詳しく理解していきましょう。
INNER JOIN(内部結合)
INNER JOINは、おそらくこれまでの経験でも最も多く使ってきた結合方式でしょう。両方のテーブルで結合条件が一致した行だけを結果として返します。
INNER JOINの構文
SELECT 列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

INNER JOINのイメージ図
返される結果は、テーブル1とテーブル2の両方に共通して存在するレコード(図の重なり部分)です。
INNER JOINの使用例
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
この例では、「サプライヤー(suppliers)」テーブルと「注文(orders)」テーブルの間でsupplier_idが一致する行の情報が返されます。
具体的なデータで確認してみましょう。suppliersテーブルはsupplier_idとsupplier_nameの2つの列を持ちます。
| supplier_id | supplier_name |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
一方、ordersテーブルはorder_id、supplier_id、order_dateの3つの列で構成されています。
| order_id | supplier_id | order_date |
|---|---|---|
| 500125 | 10000 | 2003/05/12 |
| 500126 | 10001 | 2003/05/13 |
| 500127 | 10004 | 2003/05/14 |
ここで次のSELECT文(INNER JOINを使用)を実行します。
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
このとき返される結果セットは次のとおりです。
| supplier_id | supplier_name | order_date |
|---|---|---|
| 10000 | IBM | 2003/05/12 |
| 10001 | Hewlett Packard | 2003/05/13 |
MicrosoftとNVIDIAの行は、対応するsupplier_id(10002と10003)がordersテーブル側に存在しないため結果から除外されます。同様に、ordersテーブルのorder_id 500127の行も、supplier_id 10004がsuppliersテーブルに存在しないため削除されます。
旧構文によるINNER JOINの書き方
INNER JOINは、以下のような旧構文でも書き換え可能です(ただし、INNER JOINキーワードを使う構文の使用が推奨されます)。
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM orders, suppliers
WHERE suppliers.supplier_id = orders.supplier_id;
LEFT OUTER JOIN(左外部結合)
一部のデータベースでは、LEFT OUTER JOINの代わりにLEFT JOINという記述が使われます。この結合方式は、ON条件に関係なく左側のテーブルのすべての行を返し、右側のテーブルからは条件を満たす行だけを取得します。
LEFT JOINの構文
SELECT 列名
FROM テーブル1
LEFT [OUTER] JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

LEFT JOINのイメージ図(青色の領域が結果)
返される結果は、テーブル1の全レコードと、テーブル2のうちテーブル1に対応付けできるレコード(図の青色の領域)です。
LEFT JOINの使用例
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
上記の例では、suppliersテーブルのすべての行と、ordersテーブルのうち条件を満たす行が返されます。もしsuppliersテーブルのsupplier_idがordersテーブルに存在しない場合、orders側のすべてのフィールドはNULLとして表示されます。
具体的な例を見てみましょう。suppliersテーブルはsupplier_idとsupplier_nameを含みます。
| supplier_id | supplier_name |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
ordersテーブルはorder_id、supplier_id、order_dateで構成されます。
| order_id | supplier_id | order_date |
|---|---|---|
| 500125 | 10000 | 2003/05/12 |
| 500126 | 10001 | 2003/05/13 |
ここで次のSELECT文を実行します。
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
結果は次のようになります。
| supplier_id | supplier_name | order_date |
|---|---|---|
| 10000 | IBM | 2003/05/12 |
| 10001 | Hewlett Packard | 2003/05/13 |
| 10002 | Microsoft | NULL |
| 10003 | NVIDIA | NULL |
MicrosoftとNVIDIAの行も結果セットに残っています。これはLEFT OUTER JOIN(左側のテーブルをすべて取得する)を使っているためです。ただし、これらのレコードのorder_dateには値が存在しないため、NULLが表示されます。
RIGHT OUTER JOIN(右外部結合)
こちらも一部のデータベースではRIGHT JOINと記述されます。この結合方式は、ON条件に関係なく右側のテーブルのすべての行を返し、左側のテーブルからは条件を満たす行だけを取得します。
RIGHT JOINの構文
SELECT 列名
FROM テーブル1
RIGHT [OUTER] JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

RIGHT JOINのイメージ図
返される結果は、テーブル2の全レコードと、テーブル1のうちテーブル2に対応付けできるレコード(図の青色の領域)です。
RIGHT JOINの使用例
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
この例では、ordersテーブルのすべての行と、suppliersテーブルのうち条件を満たす行が返されます。ordersテーブルのsupplier_idがsuppliersテーブルに存在しない場合、suppliers側のすべてのフィールドはNULLとして結果に表示されます。
具体的な例で確認しましょう。suppliersテーブルはsupplier_idとsupplier_nameを持ちます。
| supplier_id | supplier_name |
|---|---|
| 10000 | Apple |
| 10001 |
ordersテーブルはorder_id、supplier_id、order_dateで構成されます。
| order_id | supplier_id | order_date |
|---|---|---|
| 500125 | 10000 | 2003/08/12 |
| 500126 | 10001 | 2003/08/13 |
| 500127 | 10002 | 2003/08/14 |
ここで次のSELECT文を実行します。
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
結果は次のようになります。
| order_id | order_date | supplier_name |
|---|---|---|
| 500125 | 2003/08/12 | Apple |
| 500126 | 2003/08/13 | |
| 500127 | 2003/08/14 | NULL |
order_id 500127の行も結果に残っています。これはRIGHT OUTER JOINを使用しているためです。このレコードのsupplier_nameには該当するサプライヤーが存在しないため、NULLが格納されている点に注意してください。
FULL OUTER JOIN(完全外部結合)
FULL JOINとも記述されるこの結合方式は、左右両方のテーブルのすべての行を返します。結合条件を満たさない行については、該当する側のフィールドにNULLが設定されます。
FULL JOINの構文
SELECT 列名
FROM テーブル1
FULL [OUTER] JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

FULL JOINのイメージ図(緑色の領域が結果)
返される結果には、テーブル1とテーブル2のすべてのレコードが含まれます。
FULL JOINの使用例
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
FULL OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
上記の例では、suppliersテーブルとordersテーブルのすべての行が返され、結合条件を満たさない行の該当フィールドにはNULLが設定されます。
つまり、suppliersテーブルのsupplier_idがordersテーブルに存在しない場合、またはordersテーブルのsupplier_idがsuppliersテーブルに存在しない場合でも、その行は欠落せずに結果に表示されます。
FULL OUTER JOINの具体的な例を見てみましょう。suppliersテーブルはsupplier_idとsupplier_nameを持ちます。
| supplier_id | supplier_name |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
ordersテーブルはorder_id、supplier_id、order_dateで構成されます。
| order_id | supplier_id | order_date |
|---|---|---|
| 500125 | 10000 | 2003/08/12 |
| 500126 | 10001 | 2003/08/13 |
| 500127 | 10004 | 2003/08/14 |
ここで次のSELECT文を実行します。
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
FULL OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
結果は次のようになります。
| supplier_id | supplier_name | order_date |
|---|---|---|
| 10000 | IBM | 2003/08/12 |
| 10001 | Hewlett Packard | 2003/08/13 |
| 10002 | Microsoft | NULL |
| 10003 | NVIDIA | NULL |
| NULL | NULL | 2003/08/14 |
MicrosoftとNVIDIAの行は、FULL OUTER JOINを使用しているため結果セットに残り、そのorder_dateにはNULLが入ります。また、supplier_id 10004に対応する注文(order_id 500127)の行も結果に含まれますが、このレコードのsupplier_idとsupplier_nameには該当するデータが存在しないため、NULLが表示されます。
まとめ
SQL ServerのJOINは、テーブル間の関係性に応じて適切な種類を選ぶことが重要です。
- INNER JOIN:両テーブルに一致する行のみが必要な場合
- LEFT OUTER JOIN:左テーブルの全行を保持したい場合
- RIGHT OUTER JOIN:右テーブルの全行を保持したい場合
- FULL OUTER JOIN:両テーブルの全行を漏れなく取得したい場合
ベン図のイメージと実際の結果セットを照らし合わせながら理解することで、複雑なクエリでも正確に結合を設計できるようになります。
-
SQL ServerのJOIN(結合)とは?4種類の結合方法を構文・図解・実例で徹底解説
SQL Server(Transact-SQL)では、複数のテーブルにまたがるデータを1つのクエリで取得するためにJOIN(結合)を使用します。SQLコマンド内で2つ以上のテーブルを連結する際に使われる、非常に重要な機能です。 SQL Serverで利用できるJOINには、主に次の4種類があります。 INNER JOIN … 内部結合。最も基本的な結合形式です。 LEFT OUTER JOIN … LEFT JOINとも記述できます。 RIGHT OUTER JOIN … RIGHT JOINとも記述できます。 FULL OUTER JOIN … FULL JOINとも記述できます。 以下
-
MS SQL Serverとは?特徴・主な用途・バージョン履歴・インスタンスの基インスタンスの基礎を徹底解説
SQL Server(MS SQL Server)とは? SQL Serverは、Microsoftが開発したリレーショナルデータベース管理システム(RDBMS)です。従来のRDBMSの枠組みにとどまらず、オブジェクト指向の概念も取り入れたORDBMS(オブジェクトリレーショナルデータベース管理システム)としての側面も併せ持っています。主な特徴は以下の通りです。 Microsoftが開発したRDBMSベースのデータベースソフトウェアである ORDBMS(オブジェクトリレーショナルデータベース管理システム)としても機能する 特定のプラットフォームに依存しない独立した環境で動作する コマンドライ