【初心者向け】SQLにおけるINNER JOIN(内部結合)を分かりやすく解説
INNER JOIN(内部結合)とは何か
INNER JOINは2つ以上のテーブルからデータを結合するSQL構文の一つです。
この結合方法は共通のキーを持つ行のみを抽出し、それらを結合して新しい結果セットを作成します。結果として得られるテーブルには結合条件を満たす行だけが含まれるため、データが一致しない行は除外されます。
以下に例を挙げます。
1つ目のテーブルが「Employees(従業員)」テーブルで、以下のような構造になっているとします。
EmployeeID | Name |
1 |
Tanaka |
2 | Suzuki |
3 | Yamada |
4 | Watanabe |
2つ目のテーブルが「Departments(部門)」テーブルで、以下のような構造になっているとします。
DepartmentID | Department | EmployeeID |
1 | Sales | 1 |
2 | Marketing | 2 |
3 | HR | 3 |
ここで、INNER JOINを使って、各従業員がどの部門に所属しているかを調べたいとします。その場合、次のようなSQLクエリを実行します。
SELECT Employees.Name, Departments.Department
FROM Employees
INNER JOIN Departments
ON Employees.EmployeeID = Departments.EmployeeID;
結果は以下のようになります。
Name | Department |
Tanaka | Sales |
Suzuki | Marketing |
Yamada | HR |
このように、INNER JOINは2つのテーブル間で一致するレコードを結合して、結果を得ることができます。
この例では、EmployeeIDが一致するレコードを結合しています。これで各従業員がどの部門に所属しているかが分かりました。
注目するべきなのは、Watanabeさんの情報が結果に含まれていないことです。これは、WatanabeさんのEmployeeIDがDepartmentsテーブルに存在しないため、INNER JOINの結果から除外されるからです。
これがINNER JOINの特性で、一致する情報がない行は結果に含まれません。
INNER JOIN(内部結合)の基本的な構文
INNER JOINの基本的な構文は以下の通りです。
SELECT 列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名;
この構文は以下の要素から成り立っています。
SELECT 列名: 結合した結果から取得する列を指定します。複数の列を指定することもできます。
FROM テーブル1: 結合元となる最初のテーブルを指定します。
INNER JOIN テーブル2: 結合する2番目のテーブルを指定します。
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名: 結合条件を指定します。この部分によってどの列を基準に行が結合されるかが決まります。
INNER JOINを使用する際には、結合条件が重要です。キーとなる列名を指定して2つのテーブルの関連性を確立し、結果として得られるデータを制御します。
これは例えば顧客ID、商品IDなどになる場合が多いです。
INNER JOINの使い方
ここでは実際のテーブルやデータを交えてINNER JOINのサンプルコードを示します。より具体的なINNER JOINの使い方をイメージしてみてください。
この例では顧客情報を格納するCustomersテーブルと注文情報を格納するOrdersテーブルを使用します。
テーブルのデータ
Customers テーブル:
| CustomerID | CustomerName | City |
|------------|--------------|------------|
| 1 | Alice | New York |
| 2 | Bob | Los Angeles|
| 3 | Carol | Chicago |
Orders テーブル:
| OrderID | CustomerID | OrderDate |
|---------|------------|-----------|
| 101 | 1 | 2023-07-15|
| 102 | 2 | 2023-07-16|
| 103 | 1 | 2023-07-17|
INNER JOIN サンプルコードと解説
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
このサンプルコードではCustomersテーブルとOrdersテーブルをCustomerID列を基準にINNER JOINしています。結果として、顧客ごとの名前と注文日が関連付けられたデータが取得されます。
SELECT Customers.CustomerName, Orders.OrderDate: 結果に表示する列を指定しています。ここでは、顧客の名前と注文日が表示されます。
FROM Customers INNER JOIN Orders: INNER JOINを使用してCustomersテーブルとOrdersテーブルを結合しています。
ON Customers.CustomerID = Orders.CustomerID: 結合条件を指定しています。ここでは、CustomersテーブルとOrdersテーブルをCustomerID列を基準に結合しています。
このクエリの結果は以下のようになります:
| CustomerName | OrderDate |
|--------------|------------|
| Alice | 2023-07-15 |
| Bob | 2023-07-16 |
| Alice | 2023-07-17 |
この結果は顧客の名前と注文日が関連付けられています。INNER JOINを使用することで、顧客ごとの注文履歴を一つの表にまとめることができました。
注文データの無いCustomerIDが3の顧客は抽出されていません。
3つ以上のテーブルでINNER JOIN(内部結合)を使用する場合
3つ以上のテーブルをINNER JOINする場合は、JOIN句を増やしていくことで対応できます。以下のように書きます。
SELECT 列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名
INNER JOIN テーブル3
ON テーブル2.キーとなる列名 = テーブル3.キーとなる列名;
INNER JOINを使うメリット
INNER JOINを使用することで異なるテーブルに分散しているデータを関連付け、一つの結果セットとして取得できます。
これにより必要な情報を一度のクエリで簡潔に取得できるというメリットがあります。
INNER JOINを使う場面
INNER JOINが利用される場面は以下のような例があります。集計や複数箇所に分散しているデータをまとめる際にとても便利です。
関連するデータの結合: 例えば、顧客情報を格納するテーブルと注文情報を格納するテーブルがある場合、これらのテーブルをINNER JOINして、顧客ごとの注文履歴を取得することができます。
カテゴリやタグの関連付け: 商品情報を格納するテーブルとカテゴリ情報を格納するテーブルをINNER JOINして、特定のカテゴリに属する商品を取得する際に活用できます。
INNER JOINを使わないほうが良い場面
INNER JOINはデータの関連付けが必要な場面で有用ですが、必ずしもすべてのクエリで使うべきではありません。特に結合するテーブルのサイズが大きくなると、クエリのパフォーマンスが低下する可能性があるため、適切なインデックスの使用やクエリの最適化が必要です。また、数多くのテーブルを結合する場合にもパフォーマンス低下に注意する必要があります。
INNER JOINを使用した結果、システムの実行速度が遅くなってしまう場合にはテーブルの構造やデータ量を確認してみましょう。
内部結合と外部結合の違い
SQLには外部結合という構文も存在します。INNER JOINとは対照的に、外部結合は一致しない行も含めて結合する方法です。外部結合には左外部結合、右外部結合、完全外部結合の3種類があります。INNER JOINは一致する行のみを取得するのに対し、外部結合は一致しない行も取得できるため、データの補完や欠損値の確認に有用です。それぞれの特徴を理解して、使う場面を切り分けましょう。
外部結合については、【初心者向け】SQLにおけるOUTER JOIN(外部結合)を分かりやすく解説 で詳しく解説しています。
まとめ
INNER JOIN(内部結合)は異なるテーブルから関連するデータを結合する際に役立つSQLの構文です。共通のキーを持つ行だけを結合し、新しい結果セットを生成します。適切な場面で使用することで、データの関連付けを効果的かつ簡潔に行える一方で、パフォーマンス低下のリスクがあるためクエリの最適化やデータの状態にも気を配る必要があります。外部結合との違いも理解して、適切な結合操作を選択しましょう。