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)
| CustomerID | Name |
|---|---|
| 1 | 佐藤太郎 |
| 2 | 鈴木花子 |
| 3 | 高橋一郎 |
注文テーブル(Orders)
| OrderID | CustomerID | Product |
|---|---|---|
| 101 | 1 | ノートパソコン |
| 102 | 2 | スマートフォン |
コード
SELECT Customers.Name, Orders.Product
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
結果
| Name | Product |
|---|---|
| 佐藤太郎 | ノートパソコン |
| 鈴木花子 | スマートフォン |
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;
結果
| Name | Product |
|---|---|
| 佐藤太郎 | ノートパソコン |
| 鈴木花子 | スマートフォン |
| 高橋一郎 | 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;
結果
| Name | Product |
|---|---|
| 佐藤太郎 | ノートパソコン |
| 鈴木花子 | スマートフォン |
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;
結果
| Name | Product |
|---|---|
| 佐藤太郎 | ノートパソコン |
| 鈴木花子 | スマートフォン |
| 高橋一郎 | 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テーブル
| SalesPersonID | Name |
|---|---|
| 1 | 山田太郎 |
| 2 | 木村次郎 |
Customerテーブル
| CustomerID | SalesPersonID | Name |
|---|---|---|
| 1 | 1 | 佐藤花子 |
| 2 | 1 | 鈴木一郎 |
| 3 | 2 | 高橋太郎 |
問題2
LEFT JOINを使って、販売員とその担当顧客をリストアップしてください。販売員に顧客がいない場合も結果に含めてください。
7. 解答例
問題1の解答
SELECT SalesPerson.Name AS SalesPersonName, Customer.Name AS CustomerName
FROM SalesPerson
INNER JOIN Customer
ON SalesPerson.SalesPersonID = Customer.SalesPersonID;
結果
| SalesPersonName | CustomerName |
|---|---|
| 山田太郎 | 佐藤花子 |
| 山田太郎 | 鈴木一郎 |
| 木村次郎 | 高橋太郎 |
問題2の解答
SELECT SalesPerson.Name AS SalesPersonName, Customer.Name AS CustomerName
FROM SalesPerson
LEFT JOIN Customer
ON SalesPerson.SalesPersonID = Customer.SalesPersonID;
結果
| SalesPersonName | CustomerName |
|---|---|
| 山田太郎 | 佐藤花子 |
| 山田太郎 | 鈴木一郎 |
| 木村次郎 | 高橋太郎 |
おわりに
本記事では、SQL ServerのJOINについて詳しく説明しました。INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いや使い方をしっかり理解し、実践的なスキルを身につけましょう。さらに深く学びたい場合は、他のSQL演習問題に挑戦するのもおすすめです。
