その他

SQL入門: ステップ4 – 結合(内部結合 INNER JOIN)、合併(Union)、副照会(サブクエリ)の理解

その他
この記事は約4分で読めます。

はじめに

株式会社インプルの奈良です。

前回は、スカラー関数、集約関数、グループ化(GROUP BY、HAVING)、行の並び替え(ORDER BY)について解説しました。

今回は結合(内部結合 INNER JOIN)、合併(Union)、副照会(サブクエリ)について学びます。

解説で使用するテーブル構成(Employeesテーブル・Departmentsテーブル)

Employeesテーブル:

EmpIDEmpNameDeptID
1John10
2Alice20
3Bob10
4Carol30
5Dave20

Departmentsテーブル:

DeptIDDeptName
10Marketing
20Sales
30HR

結合(内部結合 INNER JOIN)とは

結合(Join)は、2つ以上のテーブルを特定の列の値に基づいて一緒に連結する操作です。結合にはいくつかの種類があります。

  • 内部結合 (INNER JOIN): 2つのテーブルがマッチする行のみを結果として返します。
  • 外部結合 (OUTER JOIN): 一方または両方のテーブルのすべての行を返し、一致する値がない場合はNULLを返します。外部結合には、左外部結合 (LEFT OUTER JOIN), 右外部結合 (RIGHT OUTER JOIN), 完全外部結合 (FULL OUTER JOIN) の3つの種類があります。
  • 自己結合 (SELF JOIN): 自己結合は同じテーブル内で結合を行い、テーブル内の行が他の行とどのように関連しているかを調査します。
SELECT Employees.EmpName, Departments.DeptName
FROM Employees
INNER JOIN Departments ON Employees.DeptID = Departments.DeptID;

実行結果:

EmpNameDeptName
JohnMarketing
AliceSales
BobMarketing
CarolHR
DaveSales

内部結合は、2つのテーブル間で共通する値を持つ行のみを結合して取得します。今回の例では、“Employees” テーブルと “Departments” テーブルが “DeptID” という共通の列を持っています。内部結合により、”DeptID” の値が一致する行のみを結合して取得します。つまり、各従業員がどの部門に所属しているかを明示的に示すことができます。

合併(Union)とは

UNION演算子は、2つ以上のSELECT文の結果を一つの結果セットに結合します。UNIONはそれぞれのSELECT文の結果から重複する行を削除します。すべての行を含めたい場合は、UNION ALLを使用します。

演算子は、2つ以上のSELECT文の結果を一つの結果セットに結合します。UNIONはそれぞれのSELECT文の結果から重複する行を削除します。すべての行を含めたい場合は、UNION ALLを使用します。

SELECT EmpName FROM Employees
UNION
SELECT DeptName FROM Departments;

実行結果:

Name
John
Alice
Bob
Carol
Dave
Marketing
Sales
HR

UNIONは、2つ以上のSELECT文の結果を結合するために使用します。それぞれのSELECT文は、列の数とデータ型が同じである必要があります。また、UNIONはデフォルトで重複する行を除外します(すべての行を含めるにはUNION ALLを使用します)。今回の例では、”Employees” テーブルの “EmpName” 列と “Departments” テーブルの “DeptName” 列の内容を合併しています。

副照会(サブクエリ)とは

副照会(またはサブクエリ)は、他のSQLクエリの中で実行されるSQLクエリです。サブクエリは主にWHEREHAVING句内で使用され、その結果は外部のクエリによって使用されます。

SELECT EmpName 
FROM Employees
WHERE DeptID IN (SELECT DeptID FROM Departments WHERE DeptName = 'Sales');

実行結果:

EmpName
Alice
Dave

サブクエリ(副照会)は、SQL文の内部で別のSQL文を使用することを指します。サブクエリは、主要なSQL文の実行前に評価され、その結果は主要なSQL文で使用されます。今回の例では、”Departments” テーブルから “DeptName” が ‘Sales’ の “DeptID” を取得し、その “DeptID” を持つ “Employees” テーブルの行を選択しています。つまり、”Sales” 部門に所属する従業員の名前を取得しています。

さいごに

今回は、結合(内部結合 INNER JOIN)、合併(Union)、副照会(サブクエリ)について解説しました。

次回は、データの変更処理として、行の挿入(INSERT 追加)、データの更新(UPADTE)、行の削除(DELETE)についての記事をまとめたいと思います。