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