SQL Serverの結合の基本:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いと使い方

SQL Serverは、多くのデータベース管理者や開発者に利用されている強力なRDBMS(リレーショナルデータベース管理システム)です。その中でも「結合(JOIN)」は、複数のテーブルを組み合わせてデータを取得する際に非常に重要な機能です。

この記事では、以下の内容を中心に解説します:

  • INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違い
  • 各JOINの使い方
  • 実際のSQLコードの例
  • 演習問題での理解の確認

これを読めば、SQL Serverでの結合の基礎をしっかりと習得できます!


JOINとは?

JOINは、2つ以上のテーブルを結合して、新しい結果セットを生成するSQLの操作です。
リレーショナルデータベースでは、複数のテーブルにまたがるデータを効率的に取得するために、JOINが不可欠です。

JOINには以下の主な種類があります:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN

INNER JOIN

概要

INNER JOINは、結合条件を満たす行のみを取得します。両方のテーブルに共通するデータが対象になります。

構文

SELECT 列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

以下のような2つのテーブルがあるとします:

顧客テーブル(Customers)
CustomerIDName
1佐藤太郎
2鈴木花子
3高橋一郎
注文テーブル(Orders)
OrderIDCustomerIDProduct
1011ノートパソコン
1022スマートフォン
コード
SELECT Customers.Name, Orders.Product
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
結果
NameProduct
佐藤太郎ノートパソコン
鈴木花子スマートフォン

LEFT JOIN

概要

LEFT JOINは、左側のテーブル(第一テーブル)のすべての行を取得し、結合条件を満たさない場合はNULLを埋めます。

構文

SELECT 列名
FROM テーブル1
LEFT JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

SELECT Customers.Name, Orders.Product
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
結果
NameProduct
佐藤太郎ノートパソコン
鈴木花子スマートフォン
高橋一郎NULL

RIGHT JOIN

概要

RIGHT JOINは、右側のテーブル(第二テーブル)のすべての行を取得し、結合条件を満たさない場合はNULLを埋めます。

構文

SELECT 列名
FROM テーブル1
RIGHT JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

SELECT Customers.Name, Orders.Product
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
結果
NameProduct
佐藤太郎ノートパソコン
鈴木花子スマートフォン

FULL JOIN

概要

FULL JOINは、両方のテーブルのすべての行を取得し、結合条件を満たさない場合はNULLを埋めます。

構文

SELECT 列名
FROM テーブル1
FULL JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

SELECT Customers.Name, Orders.Product
FROM Customers
FULL JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
結果
NameProduct
佐藤太郎ノートパソコン
鈴木花子スマートフォン
高橋一郎NULL

パフォーマンスに影響を与える要因

結合を使用する際には、パフォーマンスを意識した設計が重要です。以下に、パフォーマンスに影響を与える主要な要因を紹介します。

インデックスの活用

結合条件で指定する列にはインデックスを設定すると、検索の効率が向上します。特に、大規模なテーブルを結合する場合はインデックスが重要です。

例: Employees.DepartmentIDとDepartments.DepartmentIDにインデックスを追加する
CREATE INDEX idx_DepartmentID ON Employees(DepartmentID);
CREATE INDEX idx_DepartmentID ON Departments(DepartmentID);

結合対象データの絞り込み

結合前にフィルタリングを行い、対象データの量を減らすとパフォーマンスが向上します。

例: WHERE句でデータを事前に絞り込む
SELECT Employees.EmployeeName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.Location = 'Tokyo';

結合タイプの選択

INNER JOINは他の結合タイプ(LEFT JOINやFULL OUTER JOIN)よりも効率的である場合が多いです。不要な結合タイプを避けることで、クエリのパフォーマンスが向上します。

結合条件の適切な設定

結合条件を曖昧にすると、余計なデータが結果に含まれる可能性があります。結合条件は明確かつ簡潔に記述することが重要です。


演習問題

実際に手を動かして理解を深めましょう。以下の問題に挑戦してください。

問題1

次のテーブルを使って、INNER JOINを使い、販売員(SalesPerson)の名前と、その人が担当する顧客(Customer)のリストを取得するSQL文を書いてください。

SalesPersonテーブル

SalesPersonIDName
1山田太郎
2木村次郎

Customerテーブル

CustomerIDSalesPersonIDName
11佐藤花子
21鈴木一郎
32高橋太郎

問題2

LEFT JOINを使って、販売員とその担当顧客をリストアップしてください。販売員に顧客がいない場合も結果に含めてください。


7. 解答例

問題1の解答

SELECT SalesPerson.Name AS SalesPersonName, Customer.Name AS CustomerName
FROM SalesPerson
INNER JOIN Customer
ON SalesPerson.SalesPersonID = Customer.SalesPersonID;

結果

SalesPersonNameCustomerName
山田太郎佐藤花子
山田太郎鈴木一郎
木村次郎高橋太郎

問題2の解答

SELECT SalesPerson.Name AS SalesPersonName, Customer.Name AS CustomerName
FROM SalesPerson
LEFT JOIN Customer
ON SalesPerson.SalesPersonID = Customer.SalesPersonID;

結果

SalesPersonNameCustomerName
山田太郎佐藤花子
山田太郎鈴木一郎
木村次郎高橋太郎

おわりに

本記事では、SQL ServerのJOINについて詳しく説明しました。INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いや使い方をしっかり理解し、実践的なスキルを身につけましょう。さらに深く学びたい場合は、他のSQL演習問題に挑戦するのもおすすめです。