従来、WHERE
を使用して2つ以上のテーブルからデータをプルしていました クエリの句。ただし、リレーショナルデータベースシステム(RDBMS)では、これは単一のSELECT
を使用して実現できます。 クエリ。これがリレーショナルデータベースシステムの真の力です。このガイドでは、行とテーブルを比較および選択するための強力な方法であるSQL結合について学習します。
SQL結合とは何ですか?
SQLでは、join
句は、テーブルから行を比較および選択する機能を拡張します。これは、2つ以上のテーブルの関連する列に基づいて、それらのテーブルの行を組み合わせる代数的プロセスを使用します。 ANSI標準のSQL定義では、5種類の結合があります–相互結合 、内部結合 、左(外部)結合 、右(外部)結合 、および完全(外部)結合 。これらの結合は、すべてのリレーショナルデータベースシステムに実装されており、以下のセクションで説明されています。
注 結合は、特定のクエリ内の任意の数のテーブルで実行できます。簡潔さと明確さのために、このガイドでは2つのテーブルに適用される結合について説明します。
このガイドでは、Employees
という2つのテーブルを使用します およびAddress
、それぞれ、SQL結合を示します。これらの各テーブルには、次の列の定義とデータが含まれています。
-
従業員テーブル
EmployeeId EmployeeName 1 John 2 メアリー 3 Robert -
アドレステーブル
Id State 1 ニューヨーク 2 ニュージャージー 3 アイダホ 4 ハワイ
注 特に明記されていない限り、このガイドのすべてのコマンドは、両方の MySQLで適切に機能します。 およびPostgreSQL データベース。
SQL相互結合
デカルト結合とも呼ばれます 、クロス結合は、SELECT
のソースとして複数のテーブルを指定した場合に発生します 列リスト。この場合、WHERE
を省略します 句は、上の行に一致する式を結合します。結果セットには、テーブル間の行のすべての組み合わせの行が含まれます。 2つのテーブルのシナリオでは、1つのテーブルのすべての行が、他のテーブルのすべての行とペアになります。結果として得られる積は、デカルト積として知られています。 2つのテーブルの。クロスジョインの構文は次のとおりです。
(# Rows in Table A) TIMES (# of Rows in Table B)
注 集合論では、デカルト積は、指定された集合のすべての順序対を生成する乗算演算です。たとえば、set
A
について考えてみます。 要素{a,b}
B
を設定します 要素{1,2,3}
。A
のデカルト積 およびB
AxB
で表されます 結果は次のとおりです。AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
クロス結合のSQL構文は次のとおりです。
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM [Table_1]
CROSS JOIN [Table_2]
上記の構文から、Column_1
、Column_2
、Column_N
テーブル内の列を表し、CROSS JOIN
句は、2つのテーブルTable_1
を結合するのに役立ちます およびTable_2
。上記の例の表から、Employees
で相互結合を実行する必要がある場合 およびAddress
テーブルには、次のSQLコードを使用します。
SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address
上記のSQLコードの出力は、次のようになります。
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| John | New Jersey |
| John | Idaho |
| John | Hawaii |
| John | New York |
| Mary | New York |
| Mary | New Jersey |
| Mary | Idaho |
| Mary | Hawaii |
| Robert | New York |
| Robert | New Jersey |
| Robert | Idaho |
| Robert | Hawaii |
+------------+----------------+
SQL内部結合
内部結合は、両方のテーブルで値が一致する行を返します。一致するレコードがない場合、結果に行は返されません。
内部結合のSQL構文は次のとおりです。
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;
上記の例では、key
テーブルのそれぞれのキーです。 Employees
で内部結合を実行する必要がある場合 およびAddress
テーブルには、次のSQLコードを使用します。
SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id
上記のSQLコードの出力は、次のようになります。
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
+------------+----------------+
SQL左(外部)結合
左結合は、左側のテーブルからの行の完全なセットと、右側のテーブルからの一致する行を返します。一致するレコードがない場合は、NULL
値は右側のテーブルから返されます。
注 一部のリレーショナルデータベースの実装では、「左結合」ではなく「左外部結合」というキーワードを使用していますが、機能的には同等です。
左結合のSQL構文は次のとおりです。
SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key
上記の例では、key
テーブルのそれぞれのキーです。 Employees
で左結合を実行する必要がある場合 およびAddress
テーブルには、次のSQLコードを使用します。
SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id
上記のSQLコードの出力は次のとおりです。
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
+------------+----------------+
SQL Right(外部)結合
右結合は、右側のテーブルから行の完全なセットを返し、左側のテーブルから一致する行を返します。これは、右外部結合とも呼ばれます。一致するレコードがない場合は、NULL
左側のテーブルの影響を受ける行の値は、右側のテーブルから返されます。
注 一部のリレーショナルデータベースの実装では、「右結合」ではなく「右外部結合」というキーワードを使用していますが、機能的には同等です。
右結合のSQL構文は次のとおりです。
SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key
上記のコードから、key
テーブルのそれぞれのキーです。 Employees
で正しい結合を実行する必要がある場合 およびAddress
テーブルには、次のSQLコードを使用します。
SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id
上記のSQLコードの出力は次のとおりです。
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
SQLフル(外部)結合
完全結合は、左側のテーブルからすべての行を返し、右側のテーブルからすべての行を返します。これは、完全外部結合とも呼ばれます。完全結合は、利用可能な場合、両方のテーブルから一致するすべてのレコードも返します。一致するレコードがない場合は、NULL
値は左側のテーブルから返されます。また、NULL
を返します 右の表の値。
注 一部のリレーショナルデータベースの実装では、「完全結合」ではなく「完全外部結合」というキーワードを使用していますが、機能的には同等です。
フル結合のSQL構文は次のとおりです。
SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key
上記のコードでは、key
テーブルのそれぞれのキーです。 Employees
で完全な参加を実行する必要がある場合 およびAddress
テーブルには、次のSQLコードを使用します。
SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id
上記のSQLコードの出力は次のとおりです。
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
注 結合の計算中に、テーブルデータを NULL
と比較する場合 値、それらは互いに一致しません。したがって、NULL
値は結合結果の一部としてのみ返され、結合計算中は無視されます。
SQL結合のパフォーマンス比較
上記の表の例を考慮すると、内部結合は通常、データベースのパフォーマンスの観点から5つの結合句の中で最速です。 2つのテーブルのサイズに応じて、左結合と右結合が次に速くなります。フルジョインは通常、レフトジョインまたはライトジョインよりも低速です。 2つのテーブルのデカルト積に依存するクロス結合は、通常、データベースのパフォーマンスの点で最も低速です。指定されたパフォーマンス階層は、テーブルの列の長さ、列のデータ型、およびキーの定義によって異なる場合があります。
結論
SQL結合を使用すると、従来のWHERE
を超えて、テーブルの行を比較できる機能が拡張されます。 句クエリ。結合は、代数論理を2つ以上のテーブルに適用するための貴重なメカニズムです。