SQLのinner joinの構文、各DBMSごとの構文や略記方法についてまとめてます。
SQL inner joinの構文
inner joinは結合の一種で、対象の結合カラムの値が存在するものだけを抽出します。内部結合とも呼ばれます。構文は以下のとおりです。
SELECT employees.first_name, employees.last_name, salaries.salary FROM employees inner join salaries on employees.emp_no = salaries.emp_no WHERE salaries.to_date = "9999-01-01"
実行するとこうなります。
+------------+-----------+--------+ | first_name | last_name | salary | +------------+-----------+--------+ | Georgi | Facello | 88958 | | Bezalel | Simmel | 72527 | | Parto | Bamford | 43311 | | Chirstian | Koblick | 74057 | | Kyoichi | Maliniak | 94692 | | Anneke | Preusig | 59755 | | Tzvetan | Zielinski | 88070 | | Sumant | Peac | 94409 | | Duangkaew | Piveteau | 80324 | | Patricio | Bridgland | 54423 |
【関連記事】
▶【初心者向け】SQLのINNER JOIN 内部結合の基本的な使い方を理解しよう!
inner joinに対するouter join(外部結合)は、結合対象の一方のレコードが存在しない場合でも強制的に結合をおこないます。存在しない方の値はNULLになります。
【関連記事】
▶SQL 外部結合サンプルコード 3テーブル結合とパフォーマンス比較
各DBMSのinner joinの構文
Oracleのinner join構文
Oracleのinner joinはinner joinまたは、単純にjoinと指定します。
DEFINE EmployeeTotals AS SELECT ARB(DimEmployee_FullName) AS Name, SUM(FactSales_SalesAmount) AS Total GROUP BY DimEmployee_EmployeeKey, ProductSubcategoryName; DEFINE SubcategoryTotals AS SELECT SUM(FactSales_SalesAmount) AS Total GROUP BY ProductSubcategoryName; RETURN Stars AS SELECT EmployeeTotals.Name AS Name, EmployeeTotals.ProductSubcategoryName AS Subcategory, 100 * EmployeeTotals.Total / SubcategoryTotals.Total AS Pct FROM EmployeeTotals JOIN SubcategoryTotals ON (EmployeeTotals.ProductSubcategoryName = SubcategoryTotals.ProductSubcategoryName) HAVING Pct > 10
Oracleでは、join項目が同じカラム名の場合、USINGを使って置き換えが可能です。以下の2つのSQLは同等になります。
select * from table1 join table2 on table1.col1 = table2.col1 -- USINGで置き換え select * from table1 join table2 using( col1 )
SQL Server inner join
SQL Serverのinner joinは、inner joinで指定します。
SELECT ProductID, Purchasing.Vendor.BusinessEntityID, Name FROM Purchasing.ProductVendor INNER JOIN Purchasing.Vendor ON (Purchasing.ProductVendor.BusinessEntityID = Purchasing.Vendor.BusinessEntityID) WHERE StandardPrice > $10 AND Name LIKE N'F%' GO
参考)結合 (SQL Server) – SQL Server | Microsoft Docs
SQL Serverでは結合操作を実行するために、ネステッドループ結合、マージ結合、ハッシュ結合、アダプティブ結合といった物理結合方式が採用されています。
MySQLのinner joinの構文
MySQLでは、inner joinで指定します。
SELECT t1.name, t2.salary FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9.2 JOIN 構文
MySQL では、JOIN、CROSS JOIN、INNER JOIN は同じものを指していて、置き換え可能。(構文上同等)。しかし、標準 SQL では、これらは同等ではないので注意が必要です。
PostgreSQLのinner join
PostgreSQLでは、inner joinで指定します。innerを省略してjoinのみで指定することも可能(joinのデフォルト値がinner)
SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num; num | name | num | value -----+------+-----+------- 1 | a | 1 | xxx 3 | c | 3 | yyy
USINGを使って、記述を省略することができます。上記のSQLと以下のSQLは同じ結果になります。
SELECT * FROM t1 INNER JOIN t2 USING(num);
まとめ
- inner joinは内部結合をおこなう構文
- 主要DBMSでは、inner joinとjoinは同等であるケースが多い
- PostgreSQLなど、USINGを使ってinner joinの記述を省略できるSQLもあり