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演習問題に挑戦するのもおすすめです。