sql >> データベース >  >> RDS >> Mysql

SQL結合の概要

    従来、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_1Column_2Column_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つ以上のテーブルに適用するための貴重なメカニズムです。


    1. プリペアドステートメントを使用したMySQLのLIMITキーワード

    2. PerconaDBとは

    3. OracleParameterおよびIN句

    4. PostgreSQLの監査ログ