English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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は最初のテーブルの各行を第二のテーブルの各行とマッチングします。入力テーブルがそれぞれ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は、結合述語に基づいて二つのテーブルを組み合わせます(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は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 金融