リレーショナルデータベース(例:SQL Server)では、SQL JOIN ステートメントが使用され、複数のテーブル間のデータ関係に基づいてデータをクエリ、接続、取得します。SQL JOIN ステートメントは、2つ以上のテーブルと共に使用でき、異なるテーブル内で一致する値を持つレコードを基本的に返します。このチュートリアルでは、SQL INNER JOIN、SQL LEFT JOIN、SQL RIGHT JOIN、SQL OUTER JOIN など、最も一般的な SQL JOIN タイプの使用方法について説明します。
SQL Joins は、リレーショナルデータベースで作業する際に使用する必須機能です。これらは主に SQL SELECT ステートメントを使用して実行されます。T-SQL SELECT ステートメントの初め方については、以前の SQL Servers 記事「Using SQL SELECT and the WHERE and HAVING Clauses to Retrieve Data」で詳しく学ぶことができます。
SQL INNER JOIN
SQL INNER JOIN 操作は、2つ以上のテーブルで一致する値を持つ行を組み合わせて結果セットを作成します。これは、T-SQL で最も一般的に使用される結合操作です。SQL INNER JOIN は一致する値を持つ行のみを返し、すべてのテーブルに表示されるデータを取得するために使用されます。
次の図は、2つのテーブルでSQLのINNER JOIN操作がどのように機能するかを示しています。

INNER JOINの構文は非常に簡単です。SELECTステートメントの一部として、結合する2つのテーブルと行を一致させるために使用する列を指定します。
AdventureWorksLT2019サンプルデータベースから2つのテーブルを詳しく見てみましょう。SalesLT.CustomerとSalesLT.SalesOrderHeaderテーブルを使用すると、SalesLT.Customerテーブルの顧客の注文を取得するために、両方のテーブルを共通の列であるCustomerID列で結合できます。
これを達成するために使用できるT-SQLクエリは次のとおりです:
USE AdventureWorksLT2019 SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate FROM SalesLT.Customer c INNER JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
SQL INNER JOINの構文の動作は次のとおりです:
- ここでは、SalesLT.Customerテーブルから’CustomerID’、’FirstName’、’LastName’列を選択し、SalesLT.SalesOrderHeaderテーブルから’SalesOrderID’と’OrderDate’列を選択しています。
- ‘c’と’soh’は常にテーブル名を使用する必要がない省略形のテーブルエイリアスです。
- 2つのテーブルを結合するためにINNER JOINキーワードを使用しています。ONキーワードは結合に使用する列を指定します。ここでは’CustomerID’列です。
このクエリは、注文を出した各顧客の’CustomerID’、’FirstName’、’LastName’、’SalesOrderID’、および’OrderDate’列を含む結果セットを返します。以下の図をご覧ください。

SQL LEFT JOIN
SQL LEFT OUTER JOIN操作は、2つの前のテーブル間の行を一致させることで結果セットを作成します。ただし、SQL LEFT JOINでは、左のテーブルから一致するレコードがない場合、それらのレコードはNULL値で表示されます。
最初のテーブルのすべての行を含め、2番目のテーブルからの一致する行だけを含めたい場合に便利です。右のテーブルに一致がない場合でも、SQL LEFT OUTER JOINは右のテーブルの列のNULL値を返します。
以下の図は、2つのテーブルでSQL LEFT OUTER JOIN操作がどのように機能するかを示しています。

LEFT JOINの構文もかなりシンプルです。SELECTステートメントの一部として、結合する2つのテーブル、行を一致させるために使用する列、およびLEFT JOIN句を指定します。
AdventureWorksLT2019データベースの2つのテーブルをより詳しく見てみましょう。たとえば、すべての顧客とそれらが持っている注文を取得するには、SalesLT.CustomerテーブルとSalesLT.SalesOrderHeaderテーブルを使用し、以下のリストで示すようにLEFT JOINを実行できます。
USE AdventureWorksLT2019 SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate FROM SalesLT.Customer c LEFT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
- この例では、SalesLT.CustomerテーブルとSalesLT.SalesOrderHeaderテーブルから’CustomerID’、’FirstName’、’LastName’、’SalesOrderID’、および’OrderDate’列を選択しています。
- 私たちはLEFT JOINキーワードを使用して2つのテーブルを結合し、ONキーワードを使用して ‘CustomerID’列で2つのテーブルを結合します。
このSQL LEFT JOINクエリの結果を以下の図で確認できます。

このクエリは、SalesLT.Customerテーブルのすべての顧客と、SalesLT.SalesOrderHeaderテーブルからの対応する注文情報を含む結果セットを返します。SalesLT.SalesOrderHeaderテーブルに注文がない顧客の場合、そのテーブルの列はnullになります。前の図でいくつかのnull値が見られます。
SQL RIGHT JOIN
おそらくお察しの通り、SQL RIGHT OUTER JOIN操作は基本的にLEFT OUTER JOINの逆です。RIGHT OUTER JOINは右側のテーブル(テーブル2)からデータを選択し、これを左側のテーブル(テーブル1)の行と一致させます。
RIGHT JOINは、左側のテーブルと一致する行がなくても右側のテーブルのすべての行を含む結果セットを返します。右側のテーブルの行が左側のテーブルと一致する行がない場合、左側のテーブルの列の結果セットはnullになります。
次の図は、2つのテーブルで右JOINがどのように機能するかを示しています。

これをAdventuresLT2019データベースのSalesLT.CustomerとSalesLT.SalesOrderHeaderで示すことができます。すべての注文とそれに対応する顧客情報を取得するには、次の例に示すようにRIGHT JOINクエリを使用できます。
USE AdventureWorksLT2019 SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate FROM SalesLT.Customer c RIGHT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
- この例では、SalesLT.CustomerとSalesLT.SalesOrderHeaderテーブルから’CustomerID’、’FirstName’、’LastName’、’SalesOrderID’、’OrderDate’の列を選択しています。
- RIGHT JOINキーワードは、2つのテーブルを結合するために使用され、ONキーワードは、2つのテーブルを’CustomerID’列で結合していることを指定します。
このクエリは、SalesLT.SalesOrderHeaderテーブルのすべての注文と、SalesLT.Customerテーブルから利用可能な場合はその対応する顧客情報を含む結果セットを返します。SalesLT.Customerテーブルに対応する顧客がない場合、結果セットの顧客列はnullになります。
おそらくこのクエリは、前のクエリと非常によく似ていることに気付くかもしれません。ただし、LEFT JOINにより、SaleOrderHeaderテーブルからnull値を持つ行が多く生じました。しかし、最後のクエリでは、SaleOrderHeaderテーブルからnull値の行がありません。
SQL RIGHT OUTER JOIN操作の結果は、次の図に示されています。

SQL OUTER JOIN
SQL OUTER JOINは、最も一般的な結合操作ではありません。FULL JOINとも呼ばれるOUTER JOINクエリは、一致する行だけでなく、一致しない行も取得します。つまり、左のテーブルまたは右のテーブルのいずれかに一致するデータを返します。
これは、他の結合タイプよりも大きな結果セットを生成する傾向があることを想像できるでしょう。次の図は、2つのテーブルでSQL OUTER JOINがどのように機能するかを示しています。

I’ll give you an example of an SQL OUTER JOIN operation using the SalesLT.SalesOrderHeader and SalesLT.SalesOrderDetail tables. Here, we want to retrieve all sales orders and their associated details, including orders that don’t have any details records.
このために、FULL OUTER JOINを使用することができます。これにより、SalesOrderHeader行に対応するSalesOrderDetail行がない場合でも、任意のSalesOrderDetail行が返されます。ほとんどの通常のケースでは、すべてのSalesOrderDetails行に対応するSalesOrderHearder行があるべきですが、アプリケーションやシステムエラーが発生した場合には、これが検出に役立つことがあります。
ここにFULL OUTER JOINの例を示すT-SQLクエリがあります。
USE AdventureWorksLT2019 SELECT soh.SalesOrderID, soh.OrderDate, sod.ProductID, sod.OrderQty, sod.UnitPrice FROM SalesLT.SalesOrderHeader soh FULL OUTER JOIN SalesLT.SalesOrderDetail sod ON soh.SalesOrderID = sod.SalesOrderID
- この例では、SalesLT.SalesOrderHeaderおよびSalesLT.SalesOrderDetailテーブルから、’SalesOrderID’、’OrderDate’、’ProductID’、’Quantity’、および’UnitPrice’列を選択しています。
- 2つのテーブルを結合するためにFULL OUTER JOINキーワードを使用し、SalesOrderID列が2つのテーブルを結合するために使用されることを指定するためにONキーワードを使用しています。
- このクエリは、SalesLT.SalesOrderHeaderテーブル内のすべての販売注文と、SalesLT.SalesOrderDetailテーブルからの対応する詳細情報を含む結果セットを返します。また、利用可能な場合は、SalesLT.SalesOrderDetailテーブル内のすべての詳細と、対応するオーダーヘッダー情報も含まれます。
- 販売注文にSalesLT.SalesOrderDetailテーブル内の詳細がない場合、列はNULLになります。詳細に対応するSalesLT.SalesOrderHeaderテーブル内の販売注文がない場合、販売注文列はNULLになります。
このFULL OUTER JOIN操作の結果は、次の図に示されています。

SQL JOINの基本を学ぶ
このチュートリアルでは、最も一般的な種類のSQL JOINについて説明しました。INNER JOIN、LEFT JOIN、RIGHT JOIN、OUTER JOINの使い方を示し、それぞれの違いやどこで使用するかを説明しました。次回の投稿では、CROSS JOINやSELF JOINなどの一般的でないJOINについても取り上げる予定ですので、Petriをお楽しみに!
関連記事:
Source:
https://petri.com/sql-join/