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
その他の拡張