SQL 速習チュートリアル

SQL INNER JOIN

1. SQL INNER JOIN

INNER JOIN は、両方のテーブルでマッチングする値を持つ行のみをリターンします。

       ヒント:INNER はデフォルトのジョインタイプであるため、INNER JOIN の代わりに単に JOIN と記述することも可能です。

2. INNER JOIN のシンタックス

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

       注意: このシンタックスは、リレーションのあるカラム(関連カラム)に基づいて2つのテーブルを組み合わせるもので、ON キーワードを使用して一致条件を指定します。

3. INNER JOIN の例

まず、Products テーブルの製品データを見てみましょう:

ProductIDProductNameCategoryIDPrice
3Aniseed Syrup210.00

次に、Categories テーブルの行を見てみましょう:

CategoryIDCategoryNameDescription
2CondimentsSweet and savory sauces, relishes, spreads, and seasonings

ここで、上記2つのテーブル間の関連カラムが "CategoryID" であることがわかります。

次に、CategoryID フィールドを介して "Products" テーブルと "Categories" テーブルの INNER JOIN を作成します。

3.1 例(自分専用の SQL Server を取得)

INNER JOIN キーワードを使用して "Products" と "Categories" を結合します:

SELECT ProductID, ProductName, CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

       注意:INNER JOIN は、両方のテーブルで一致するものがある行のみをリターンします。つまり、CategoryID を持たない製品や、Categories テーブルに存在しない CategoryID を持つ製品がある場合、それらの行は結果にリターンされません。

4. カラム名の命名規則

SQL ジョインでカラムを指定する際は、テーブル名も含めるのがベストプラクティスです。

4.1 例

カラム名の前にテーブル名を追加します:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID;

上記の例はテーブル名を指定しなくても動作します。なぜなら、指定されたカラム名のどれもが両方のテーブルに重複して存在しないからです。しかし、SELECT ステートメントに CategoryID カラムを追加した場合、テーブル名を指定しないとエラーが発生します。これは CategoryID カラムが両方のテーブルに存在し、どちらを参照すべきか曖昧になるためです。

5. JOIN または INNER JOIN

JOININNER JOIN は同じ結果をリターンします。

JOIN において INNER はデフォルトのジョインタイプです。そのため、JOIN と書くと、パーサーは実際には INNER JOIN として処理します。

5.1 例

JOIN は INNER JOIN と同じです:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Products
JOIN Categories ON Products.CategoryID = Categories.CategoryID;

6. 複数のテーブルをジョインする

クエリ内に複数の INNER JOIN 句を追加することで、2つ以上のテーブルをジョインできます。

次の SQL は、顧客情報と配送業者情報を含むすべての注文(Orders)を選択します。

6.1 例

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID;

参考までに、Shippers テーブルは以下の通りです:

ShipperIDShipperNamePhone
1Speedy Express(503) 555-9831
2United Package(503) 555-3199
3Federal Shipping(503) 555-9931