SQL Server の LEFT JOIN (LEFT OUTER JOIN) のコード例
LEFT JOIN と LEFT OUTER JOIN の違い (SQL Server)
SQL Serverにおける LEFT JOIN と LEFT OUTER JOIN は、まったく同じものです。どちらも左外部結合と呼ばれ、左側のテーブルのすべての行を返し、右側のテーブルに一致する行があれば結合します。一致する行がない場合、右側のテーブルの列には NULL 値が返されます。
詳細説明
- LEFT JOIN と LEFT OUTER JOIN は同義語です。
- 左側のテーブルのすべての行が結果セットに含まれます。
- 右側のテーブルに一致する行がある場合、その行のデータが結合されます。
- 右側のテーブルに一致する行がない場合、結果セットの対応する列には NULL 値が入ります。
例
-- テーブル A
ID Name
1 Alice
2 Bob
3 Charlie
-- テーブル B
ID City
1 Tokyo
3 Osaka
SELECT A.ID, A.Name, B.City
FROM テーブルA A
LEFT JOIN テーブルB B ON A.ID = B.ID;
上記のクエリ結果は次のようになります:
ID Name City
1 Alice Tokyo
2 Bob NULL
3 Charlie Osaka
いつ使うか
- 例えば、顧客情報と注文情報を結合する場合、すべての顧客を表示したい場合に LEFT JOIN を使用します。
LEFT JOIN と LEFT OUTER JOIN は同じ意味を持ち、SQL Serverにおいてはどちらを使用しても問題ありません。どちらを使うかは個人の好みやコーディングスタイルによるでしょう。
注意: 他のデータベースシステムでは、LEFT JOIN と LEFT OUTER JOIN の挙動が異なる場合があります。
- LEFT JOIN vs LEFT OUTER JOIN in SQL Server - Stack Overflow
SQL Server の LEFT JOIN (LEFT OUTER JOIN) のコード例
コード例
テーブル定義
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(255)
);
CREATE TABLE Orders (
OrderID INT PRIMARY K EY,
CustomerID INT,
OrderDate DATE
);
データ挿入 (例)
INSERT INTO Customers (CustomerID, CustomerName)
VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES (10, 1, '2023-11-11'), (20, 1, '2023-12-12'), (30, 3, '2024-01-01');
SELECT
c.CustomerID, c.CustomerName, o.OrderID, o.OrderDate
FROM
Customers c
LEFT JOIN
Orders o ON c.CustomerID = o.CustomerID;
コードの説明
Customers
テーブルとOrders
テーブルを作成します。- サンプルデータとして顧客と注文情報を挿入します。
LEFT JOIN
を使用して、顧客テーブルのすべての顧客と、関連する注文情報を取得します。c.CustomerID = o.CustomerID
という条件で結合します。- 顧客に注文がない場合、
OrderID
とOrderDate
に NULL が表示されます。
結果
CustomerID CustomerName OrderID OrderDate
1 Alice 10 2023-11-11
1 Alice 20 2023-12-12
2 Bob NULL NULL
3 Charlie 30 2024-01-01
重要なポイント
- LEFT JOIN は、左側のテーブルのすべての行を保持します。
- 右側のテーブルにマッチする行がない場合、NULL 値が返されます。
- 結合条件は
ON
キーワードを使用して指定します。
LEFT JOIN の代替方法
通常、LEFT JOIN (または LEFT OUTER JOIN) は、左側のテーブルのすべての行を返し、右側のテーブルにマッチする行があれば結合する際に使用されます。しかし、特定の状況下では、他の方法も考慮できます。
代替方法
サブクエリ
- 左側のテーブルの各行に対して、右側のテーブルにマッチする行が存在するかチェックするサブクエリを使用します。
- 一般的に、パフォーマンス面で劣ることがあります。
SELECT
c.CustomerID, c.CustomerName,
(SELECT TOP 1 o.OrderID FROM Orders o WHERE o.CustomerID = c.CustomerID) AS OrderID
FROM
Customers c;
EXISTS 演算子
- サブクエリよりも効率的な場合がありますが、複雑な条件の場合はパフォーマンスが低下する可能性があります。
SELECT
c.CustomerID, c.CustomerName
FROM
Customers c
WHERE
EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID);
OUTER APPLY (SQL Server 2005 以降)
- CROSS APPLY と似ていますが、右側のテーブルから複数の行を返すことができます。
- LEFT JOIN と同様の結果を得ることができますが、パフォーマンスや可読性の観点から、必ずしも推奨されるわけではありません。
SELECT
c.CustomerID, c.CustomerName, o.OrderID
FROM
Customers c
OUTER APPLY (
SELECT TOP 1 OrderID FROM Orders o WHERE o.CustomerID = c.CustomerID
) o;
どの方法を選ぶべきか
- 通常は LEFT JOIN を使用するのが最もシンプルかつ効率的です。
- サブクエリや EXISTS は、特定の状況下で有用ですが、パフォーマンスに注意が必要です。
- OUTER APPLY は、複雑な結合や複数の行を返す必要がある場合に検討できますが、一般的には LEFT JOIN が推奨されます。
- 代替方法を使用する場合は、パフォーマンスを考慮し、適切なインデックスを作成することが重要です。
- LEFT JOIN が最も一般的な方法であり、多くの場合に最適な選択肢です。
sql-server t-sql left-join