English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite 聯結

SQLite 結合子句はデータベースの二つ以上のテーブルのレコードを結合するために使用されます。JOINは、各テーブルの共通値を使用して二つのテーブルのフィールドを結合する方法です。

SQLは主な結合の種類が三つあります-

  • クロス結合

  • 内部結合

  • 外結合

続ける前に、COMPANYとDEPARTMENTの二つのテーブルについて考えてみましょう。すでにCOMPANYテーブルにINSERT文を使ってデータを入れたことを見ましたので、ここではCOMPANYテーブルに利用可能なレコードリストを仮定します-

ID NAME AGE ADDRESS SALARY
----------  ----------  ----------  ----------  ----------
1           ポール        32          カリフォルニア  20000.0
2           アレン       25          テキサス       15000.0
3           Teddy       23          ノルウェー      20000.0
4           Mark        25          リッチ-モンド   65000.0
5           David       27          テキサス       85000.0
6           Kim         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     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           エンジニアリング 2
3           財務     7

CROSS JOIN - クロス結合

CROSS JOINは最初のテーブルの各行を第二のテーブルの各行とマッチングします。入力テーブルがそれぞれ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 請求
2           ポール エンジニアリング
7           ポール 財務
1           アレン IT Billing
2           Allen       工学
7           アレン 財務
1           テディ IT Billing
2           テディ エンジニアリング
7           テディ 財務
1           マーク IT Billing
2           マーク エンジニアリング
7           マーク 財務
1           デイビッド IT Billing
2           デイビッド エンジニアリング
7           デイビッド 財務
1           キム IT Billing
2           キム エンジニアリング
7           キム 財務
1           ジェームズ IT Billing
2           ジェームズ エンジニアリング
7           James       金融

INNER JOIN - 内部結合

INNER JOINは、結合述語に基づいて二つのテーブルを組み合わせます(table1とtable2)の列値を使用して新しい結果テーブルを作成します。このクエリはtable1とtable2の各行をtable

INNER JOINは最も一般的なデフォルトの結合类型です。INNERキーワードを使用することができます。

以下はINNER JOINの構文です-

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

冗長を避け、短縮するために、以下を使用できます:USING表現を使用してINNER JOIN条件を宣言します。この表現は、一つまたは複数の列のリストを指定します。

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 請求
2           Allen       工学
7           James       金融

OUTER JOIN - 外結合

OUTER JOINはINNER JOINの拡張です。SQL標準では、LEFT、RIGHTおよびFULLの三种の外部結合类型が定義されていますが、SQLiteは以下をサポートしています:LEFT OUTER JOIN

外部結合の条件は内部結合の条件と同じで、ON、USINGまたはNATURALキーワードを使用して表示されます。初期の結果テーブルの計算方法は同じです。一旦主JOINが計算されると、OUTER JOINは一つまたは二つのテーブルから未接続の行を取得し、それらをNULLで埋め込み、結果テーブルに追加します。

以下はLEFT OUTER JOINの構文です-

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

冗長を避け、短縮するために、USING表現を使用してOUTER JOIN条件を宣言することができます。この表現は、一つまたは複数の列のリストを指定します。

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 請求
2           Allen       工学
            Teddy
            Mark
            David
            Kim
7           James       金融