SQLite-結合

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

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

  • クロスジョイン
  • インナージョイン *アウタージョイン

先に進む前に、2つのテーブルCOMPANYとDEPARTMENTについて考えてみましょう。 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

別のテーブルは、次の定義を持つ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           Engineering 2
3           Finance     7

クロスジョイン

CROSS JOINは、最初のテーブルのすべての行と2番目のテーブルのすべての行を一致させます。 入力テーブルにそれぞれx行とy行がある場合、結果のテーブルにはx* y行があります。 CROSS JOINは非常に大きなテーブルを生成する可能性があるため、適切な場合にのみ使用するように注意する必要があります。

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        Engineering
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineering
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineering
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineering
7           Mark        Finance
1           David       IT Billing
2           David       Engineering
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineering
7           Kim         Finance
1           James       IT Billing
2           James       Engineering
7           James       Finance

インナージョイン

INNER JOINは、結合述語に基づいて2つのテーブル(table1とtable2)の列値を組み合わせて、新しい結果テーブルを作成します。 クエリは、table1の各行とtable2の各行を比較して、結合述語を満たす行のすべてのペアを見つけます。 join-predicateが満たされると、AとBの行の各一致ペアの列値が結果行に結合されます。

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 に似ていますが、両方のテーブルに存在するすべての列の値が等しいかどうかを自動的にテストするだけです-

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       Engineering
7           James       Finance

アウタージョイン

OUTER JOINはINNER JOINの拡張です。 SQL標準では、LEFT、RIGHT、FULLの3種類のOUTER JOINが定義されていますが、SQLiteは LEFT OUTER JOIN のみをサポートしています。

OUTER JOINには、ON、USING、またはNATURALキーワードを使用して表されるINNER JOINと同じ条件があります。 初期結果テーブルも同じ方法で計算されます。 プライマリJOINが計算されると、OUTER JOINは一方または両方のテーブルから結合されていない行を取得し、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 ,... ) ...

上記の表に基づいて、次のように内部結合を記述できます-

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       Engineering
            Teddy
            Mark
            David
            Kim
7           James       Finance