SQLite Join

SQLite のJoin句は、2つ以上のデータベース内のテーブルのレコードを結合するために使用されます。JOIN は、共通の値によって2つのテーブルのフィールドを結合する手段です。

SQL は3つの主要なタイプの結合を定義しています:

  • 交差結合 - CROSS JOIN

  • 内部結合 - INNER JOIN

  • 外部結合 - OUTER JOIN

先に進む前に、COMPANY と DEPARTMENT という2つのテーブルがあると仮定しましょう。COMPANY テーブルに入力するための INSERT 文はすでに確認しました。ここでは、COMPANY テーブルのレコードリストが次のようになっていると仮定しましょう:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

もう1つのテーブルは DEPARTMENT で、次のように定義されています:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

以下は DEPARTMENT テーブルに入力するための INSERT 文です:

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

最後に、DEPARTMENT テーブルには次のレコードリストがあります:

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineerin  2
3           Finance     7

交差結合 - CROSS JOIN

交差結合(CROSS JOIN)は、最初のテーブルの各行を2番目のテーブルの各行と照合します。2つの入力テーブルにそれぞれ x 行と y 行がある場合、結果のテーブルには x*y 行が含まれます。交差結合(CROSS JOIN)は非常に大きなテーブルを生成する可能性があるため、使用には注意が必要で、適切な場合にのみ使用してください。

交差結合の操作では、結合された2つのテーブルのすべてのデータ行のデカルト積が返されます。返されるデータ行の数は、最初のテーブルでクエリ条件に一致するデータ行の数に、2番目のテーブルでクエリ条件に一致するデータ行の数を掛けたものに等しくなります。

以下は交差結合(CROSS JOIN)の構文です:

SELECT ... FROM table1 CROSS JOIN table2 ...

上記のテーブルに基づいて、次のように交差結合(CROSS JOIN)を書くことができます:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

上記のクエリは次の結果を生成します:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineerin
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineerin
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineerin
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineerin
7           Mark        Finance
1           David       IT Billing
2           David       Engineerin
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineerin
7           Kim         Finance
1           James       IT Billing
2           James       Engineerin
7           James       Finance

内部結合 - INNER JOIN

内部結合(INNER JOIN)は、結合述語に基づいて2つのテーブル(table1 と table2)の列値を結合し、新しい結果テーブルを作成します。クエリは table1 の各行と table2 の各行を比較し、結合述語を満たす行のマッチングペアをすべて見つけます。結合述語を満たす場合、A 行と B 行の各マッチングペアの列値が1つの結果行に結合されます。

内部結合(INNER JOIN)は最も一般的な結合タイプであり、デフォルトの結合タイプです。INNER キーワードは省略可能です。

以下は内部結合(INNER JOIN)の構文です:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

冗長性を避け、表現を簡潔にするために、次のものを使用できます:USING式で内部結合(INNER JOIN)条件を宣言します。この式は1つ以上の列のリストを指定します:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

自然結合(NATURAL JOIN)は次のものに似ています:JOIN...USINGただし、2つのテーブルの両方に存在するすべての列について、値が等しいかどうかを自動的にテストします:

SELECT ... FROM table1 NATURAL JOIN table2...

上記のテーブルに基づいて、次のように内部結合(INNER JOIN)を書くことができます:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

上記のクエリは次の結果を生成します:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
7           James       Finance

外部結合 - OUTER JOIN

外部結合(OUTER JOIN)は内部結合(INNER JOIN)の拡張です。SQL 標準では LEFT、RIGHT、FULL の3種類の外部結合が定義されていますが、SQLite は次のもののみをサポートしています:左外部結合(LEFT OUTER JOIN)。

外部結合(OUTER JOIN)で条件を宣言する方法は内部結合(INNER JOIN)と同じで、ON、USING、または NATURAL キーワードを使用して表現します。最初の結果テーブルも同じ方法で計算されます。主結合の計算が完了すると、外部結合(OUTER JOIN)は1つまたは2つのテーブルから結合されなかった行を、外部結合の列に NULL 値を使用して結果テーブルに追加します。

以下は左外部結合(LEFT OUTER JOIN)の構文です:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

冗長性を避け、表現を簡潔にするために、次のものを使用できます:USING式で外部結合(OUTER JOIN)条件を宣言します。この式は1つ以上の列のリストを指定します:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

上記のテーブルに基づいて、次のように外部結合(OUTER JOIN)を書くことができます:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

上記のクエリは次の結果を生成します:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
            Teddy
            Mark
            David
            Kim
7           James       Finance
その他の拡張