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 テーブルの製品データを見てみましょう:
| ProductID | ProductName | CategoryID | Price |
|---|---|---|---|
| 3 | Aniseed Syrup | 2 | 10.00 |
次に、Categories テーブルの行を見てみましょう:
| CategoryID | CategoryName | Description |
|---|---|---|
| 2 | Condiments | Sweet 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
JOIN と INNER 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 テーブルは以下の通りです:
| ShipperID | ShipperName | Phone |
|---|---|---|
| 1 | Speedy Express | (503) 555-9831 |
| 2 | United Package | (503) 555-3199 |
| 3 | Federal Shipping | (503) 555-9931 |