Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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 )

参考)Oracle公式ドキュメント:JOIN句

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);

参考)PostgreSQL公式ドキュメント:テーブル式

まとめ

ポテパンダの一言メモ
  • inner joinは内部結合をおこなう構文
  • 主要DBMSでは、inner joinとjoinは同等であるケースが多い
  • PostgreSQLなど、USINGを使ってinner joinの記述を省略できるSQLもあり

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。