SQLite-JOINS

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

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

  • クロスジョイン
  • 内部結合
  • アウタージョイン

先に進む前に、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

別のテーブルは、次の定義を持つ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は非常に大きなテーブルを生成する可能性があるため、適切な場合にのみ使用するように注意する必要があります。

以下は、CROSSJOINの構文です。

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

上記の表に基づいて、次のようにCROSSJOINを記述できます。

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の各行と比較して、結合述語を満たす行のすべてのペアを見つけます。結合述語が満たされると、AとBの一致した行の各ペアの列値が結合されて結果行になります。

INNER JOINは、最も一般的でデフォルトのタイプの結合です。オプションでINNERキーワードを使用できます。

以下は、INNERJOINの構文です。

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

冗長性を回避し、フレージングを短くするために、INNERJOIN条件を次のように宣言できます。 USING式。この式は、1つ以上の列のリストを指定します。

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

NATURAL JOINは、 JOIN...USING、それだけが、両方のテーブルに存在するすべての列の値が等しいかどうかを自動的にテストします-

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

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

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は、INNERJOINの拡張です。SQL標準では、LEFT、RIGHT、およびFULLの3種類の外部結合が定義されていますが、SQLiteはLEFT OUTER JOIN

OUTER JOINの条件は、INNER JOINと同じであり、ON、USING、またはNATURALキーワードを使用して表現されます。初期結果テーブルも同じ方法で計算されます。プライマリJOINが計算されると、OUTER JOINは、一方または両方のテーブルから結合されていない行を取得し、それらをNULLで埋めて、結果のテーブルに追加します。

以下は、LEFT OUTERJOINの構文です。

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

冗長性を回避し、フレージングを短くするために、OUTERJOIN条件をUSING式で宣言できます。この式は、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