内部結合では、2つの結合テーブルの各行に一致する列値が必要であり、アプリケーションで一般的に使用される結合操作ですが、最良の選択であるとは限りません。すべての状況で。内部結合は、結合述語に基づいて2つのテーブル(AとB)の列値を組み合わせることにより、新しい結果テーブルを作成します。クエリは、Aの各行をBの各行と比較して、結合述語を満たす行のすべてのペアを見つけます。 NULL以外の値を照合することで結合述語が満たされると、AとBの一致した行の各ペアの列値が結合されて結果行になります。
結合の結果は次のように定義できます。最初にテーブル内のすべての行のカルテシアン積(またはクロス結合)を取得し(テーブルAのすべての行をテーブルBのすべての行と結合)、次に結合述語を満たすすべての行を返す結果。実際のSQL実装では、通常、ハッシュ結合やソート/マージ結合などの他のアプローチが使用されます。これは、直積の計算が遅く、格納するために非常に大量のメモリが必要になることが多いためです。
SQLは、2つの異なる構文を指定します。結合を表現する方法:「明示的結合表記」と「暗黙的結合表記」。 「暗黙的な結合表記」は、データベースシステムで引き続きサポートされていますが、ベストプラクティスとは見なされなくなりました。
「明示的な結合表記」では、JOIN
キーワードを使用します。オプションで、前にINNER
キーワードを付けて結合するテーブルを指定し、ON
キーワードを使用して結合の述語を指定します。次の例:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
事務 |
ジョーンズ |
33 |
エンジニアリング |
スミス |
34 |
クレリカル |
ハイゼンベルグ |
33 |
エンジニアリング |
ラファティ |
31 |
セールス |
「暗黙の結合表記」は単にtをリストします結合するためのテーブルは、SELECT
ステートメントのFROM
句で、コンマを使用して区切ります。したがって、クロス結合を指定し、WHERE
句は追加のフィルター述語を適用する場合があります(明示的な表記の結合述語と同等に機能します)。
次の例は前の例と同等ですが、今回は暗黙的な結合表記を使用しています。
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
例に示されているクエリ上記は、両方のテーブルのDepartmentID列を使用してEmployeeテーブルとDepartmentテーブルを結合します。これらのテーブルのDepartmentIDが一致する場合(つまり、結合述語が満たされる場合)、クエリは2つのテーブルのLastName、DepartmentID、およびDepartmentName列を結果行に結合します。 DepartmentIDが一致しない場合、結果行は生成されません。
したがって、上記のクエリの実行結果は次のようになります。
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
ロビンソン |
34 |
クレリカル |
ジョーンズ |
33 |
エンジニアリング |
スミス |
34 |
クレリカル |
ハイゼンベルグ |
33 |
エンジニアリング |
ラファティ |
31 |
販売 |
従業員「Williams」と部門「Marketing」はクエリの実行結果に表示されません。これらのいずれにも、他のそれぞれのテーブルに一致する行はありません。「Williams」には関連する部門がなく、従業員には部門ID 35(「マーケティング」)がありません。目的の結果によっては、この動作は微妙なバグである可能性があります。これは、内部結合を外部結合に置き換えることで回避できます。
内部結合とNULL値編集
プログラマーはNULL値を含む可能性のある列でテーブルを結合する場合は、特に注意してください。結合条件で、結合列が残りの述語条件を適用する前。内部結合は、参照整合性を強制するデータベース、または結合列がNULLにならないことが保証されているデータベースでのみ安全に使用できます。多くのトランザクション処理リレーショナルデータベースは、原子性、整合性、分離、耐久性(ACID)データ更新標準に依存してデータの整合性を確保し、内部結合を適切な選択にします。ただし、トランザクションデータベースには通常、NULLにすることが許可されている望ましい結合列もあります。多くのレポートリレーショナルデータベースおよびデータウェアハウスは、大量の抽出、変換、読み込み(ETL)バッチ更新を使用するため、参照整合性を適用することが困難または不可能になり、SQLクエリの作成者が変更できない潜在的にNULLの結合列が生成され、内部結合が省略されます。エラーの兆候のないデータ。内部結合を使用するかどうかは、データベースの設計とデータの特性によって異なります。 1つのテーブルの結合列にNULL値が含まれている可能性がある場合、通常、左外部結合を内部結合の代わりに使用できます。
NULL(空)の可能性があるデータ列をリンクとして使用しないでください。意図した結果がNULL値の行を削除することでない限り、内部結合。 NULL結合列を結果セットから意図的に削除する場合、テーブルの結合とフィルタリングは1つのステップで実行されるため、内部結合は外部結合よりも高速になる可能性があります。逆に、内部結合は、SQL Where句のデータベース関数と組み合わせて大量のクエリで使用すると、パフォーマンスが大幅に低下したり、サーバーがクラッシュしたりする可能性があります。 SQL Where句の関数を使用すると、データベースが比較的コンパクトなテーブルインデックスを無視する可能性があります。データベースは、計算値に依存するフィルターを使用して行数を減らす前に、両方のテーブルから選択した列を読み取り、内部結合する場合があります。その結果、処理が比較的大量になります。
結果セットの場合数値識別子コードの全文記述を検索するために使用されるマスターテーブル(ルックアップテーブル)を含むいくつかのテーブルを結合することによって生成されます。外部キーのいずれかでNULL値を指定すると、結果セットから行全体が削除される可能性があります。エラーの兆候はありません。 1つ以上の内部結合と複数の外部結合を含む複雑なSQLクエリでは、内部結合リンク列のNULL値に対して同じリスクがあります。
内部結合を含むSQLコードへのコミットメントでは、NULL結合列はベンダーの更新、設計変更、データ変換、移行、一括インポート、マージなどのアプリケーションのデータ検証ルール外の一括処理など、将来の変更によって導入されます。
内部結合をさらに次のように分類できます。等結合、自然結合、または相互結合として。
Equi-joinEdit
等結合は、等価比較のみを使用する特定のタイプのコンパレータベースの結合です。結合述語内。他の比較演算子(<
など)を使用すると、結合は等結合として不適格になります。上記のクエリは、等結合の例をすでに提供しています。
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
次のように等結合を記述できます。
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
共同の場合等結合のlumnは同じ名前であり、SQL-92は、USING
構文を使用して、等結合を表現するためのオプションの省略表記を提供します。
SELECT
read more