Sqlite-using-joins
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