SQL JOINは、それらの関係に基づいて1つまたは複数のテーブルを結合します。 SQL JOINには、親テーブルと子テーブルの関係が含まれます。
SQL JOINSにはさまざまな種類があります:
- 内部参加
- 左アウタージョイン
- 右外部結合
- 完全な外部参加
- クロスジョイン。
例を使用して、各タイプのSQL結合を理解しましょう。
内部参加
SQLの内部結合は、広く使用されている結合です。条件が一致するまで、および一致しない限り、両方のテーブルからすべてのレコードをフェッチしました。これは、この結合が両方のテーブルに共通する行のみを返すことを意味します。
SQL内部結合の構文:
SELECT Table_Name1.Colum_Name1、Table_Name1.Column_Name2、Table_Name1.Column_Name3、Table_Name2.Column_Name1、Table_Name2.Column_Name2、Table_Name2.Column_Name3、FROM Table_Name1 INNER JOIN Table_Name2 ON table_Name1.Column_Name=Table_Name。特定のデータを持つ既存のテーブルについて考えてみます。
表1:従業員
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | C# | 5 |
1003 | NIKHIL | VANI | 50500 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | C# | 5 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | ルチカ | AGARWAL | 60000 | デリー | ORACLE | 1 |
5001 | ARCHIT | シャルマ | 55500 | デリー | テスト | 4 |
表2:マネージャー
Managerid | manager_name | manager_department |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | アヌパムミシュラ | テスト |
5 | Akash Kadam | C# |
表3:ラップトップ:
LAPTOPID | 名前 | EMPLOYEEID |
L101 | DELL | NULL |
L102 | HP | 1002 |
L103 | LENOVO | NULL |
L104 | HP | 3003 |
L105 | DELL | 4002 |
L106 | LENOVO | 4003 |
L107 | DELL | 5001 |
L108 | HP | NULL |
L109 | DELL | NULL |
L110 | HP | NULL |
SQL内部結合の例
例1: クエリを実行して従業員テーブルとマネージャーテーブルを結合し、従業員ID、従業員名、従業員テーブルの給与、マネージャーテーブルのマネージャーIDとマネージャー名などの従業員の詳細を表示します。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、E.SALARY、M.MANAGERID、M.MANAGER_NAME FROM EMPLOYEES E INNER JOIN MANAGER M ON E.MANAGERID =M.MANAGERID;
上記のクエリでは、従業員のテーブルから従業員ID、名、姓、給与、マネージャーID、マネージャーテーブルからマネージャー名を取得しました。ここで、従業員のテーブルマネージャーID列はマネージャーテーブルマネージャーID列と同じです。クエリは、両方のテーブルからすべての一致レコードを返します。マネージャーIDは、両方のテーブルに共通の列です。 Eは従業員のテーブルのエイリアス名であり、Mはマネージャーのテーブルのエイリアス名です。 manager idフィールドは、employeeテーブルに外部キーとして配置されます。マネージャーIDは、マネージャーテーブルの主キーとして機能し、2つのテーブル間に親子関係を作成します。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | MANAGERID | MANAGER_NAME |
1001 | VAIBHAVI | MISHRA | 65500 | 1 | Sneedeep Kaur |
2001 | PRACHI | シャルマ | 55500 | 1 | Sneedeep Kaur |
4003 | ルチカ | AGARWAL | 60000 | 1 | Sneedeep Kaur |
1003 | NIKHIL | VANI | 50500 | 2 | Kirti kirtane |
2002 | BHAVESH | JAIN | 65500 | 2 | Kirti kirtane |
3002 | ANUJA | WANRE | 50500 | 2 | Kirti kirtane |
3001 | PRANOTI | SHENDE | 55500 | 3 | Abhishek Manish |
3003 | DEEPAM | ジャウハリ | 58500 | 3 | Abhishek Manish |
4002 | ASHWINI | バガット | 54500 | 3 | Abhishek Manish |
4001 | RAJESH | GOUD | 60500 | 4 | アヌパムミシュラ |
5001 | ARCHIT | シャルマ | 55500 | 4 | アヌパムミシュラ |
1002 | VAIBHAV | シャルマ | 60000 | 5 | Akash Kadam |
2003 | ルチカ | JAIN | 50000 | 4 | Akash Kadam |
レコードは、マネージャーIDの昇順で表示されます。
例2: クエリを実行して従業員テーブルとマネージャーテーブルを結合し、従業員ID、従業員名、従業員テーブルの給与、および従業員給与が58000を超えるマネージャーテーブルのマネージャーIDとマネージャー部門などの従業員の詳細を表示します。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、E.SALARY、M.MANAGERID、M.MANAGER_DEPARTMENT FROM EMPLOYEES E INNER JOIN MANAGER M ON E.MANAGERID =M.MANAGERID WHERE SALARY> 58000;>
上記のクエリでは、従業員のテーブルの従業員ID、名、姓、給与、マネージャーID、およびマネージャーの部門をマネージャーテーブルから取得しました。ここで、従業員のテーブルのマネージャーIDはマネージャーのマネージャーIDと同じです。給与が58000を超える従業員レコードのみを表にします。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | MANAGERID | MANAGER_DEPARTMENT |
1001 | VAIBHAVI | MISHRA | 65500 | 1 | ORACLE |
4003 | ルチカ | AGARWAL | 60000 | 1 | ORACLE |
2002 | BHAVESH | JAIN | 65500 | 2 | FMW |
3003 | DEEPAM | ジャウハリ | 58500 | 3 | JAVA |
4001 | RAJESH | GOUD | 60500 | 4 | テスト |
1002 | VAIBHAV | シャルマ | 60000 | 5 | C# |
従業員の給与が58000を超える場合、6つのレコードのみが表示されます。
例3: クエリを実行して従業員テーブルとラップトップテーブルを結合し、従業員ID、従業員名、給与などの従業員の詳細、従業員テーブルからの都市、ラップトップID、ラップトップテーブルからのラップトップ名を表示します
SELECT EMP.EMPLOYEEID、EMP.FIRST_NAME、EMP.SALARY、EMP.CITY、LAP.LAPTOPID、LAP。従業員からの名前EMPINNERJOIN LAPTOP LAP ON EMP.EMPLOYEEID =LAP.EMPLOYEEID;
上記のクエリでは、従業員ID、名、給与、都市を従業員のテーブルのラップトップIDから取得し、名前をラップトップテーブルから取得しました。ここで、従業員テーブルの従業員IDはラップトップテーブルの従業員IDと同じです。従業員IDは、ラップトップテーブルの外部キーであり、従業員テーブルとラップトップテーブルの間に親子関係を作成します。
出力:
EMPLOYEEID | FIRST_NAME | 給与 | CITY | LAPTOPID | 名前 |
1002 | VAIBHAV | 60000 | NOIDA | L102 | HP |
3003 | DEEPAM | 58500 | ムンバイ | L104 | HP |
4002 | ASHWINI | 54500 | NOIDA | L105 | DELL |
4003 | ルチカ | 60000 | デリー | L106 | LENOVO |
5001 | ARCHIT | 55500 | デリー | L107 | DELL |
5人の従業員の記録のみが表示されます。
例4: 内部結合を使用して、employeesテーブルのマネージャーIDとマネージャーテーブルのマネージャー名を表示するクエリを記述します。ここで、salary> 55000、departmentはOracleです。
SELECT EMPLOYEEID、FIRST_NAME、SALARY、DEPARTMENT、M.MANAGERID、M.MANAGER_NAME FROM EMPLOYEES E INNER JOIN MANAGER M ON E.MANAGERID =M.MANAGERID WHERE SALARY> 55000 AND DEPARTMENT ='ORACLE';
上記の結合クエリの例では、従業員のテーブルのID、名前、給与、部門などの従業員の詳細、マネージャーID、マネージャーテーブルのマネージャー名を表示します。ここで、従業員テーブルのマネージャーIDはからのマネージャーIDと同じです。マネージャーは、給与が55000を超え、部門がOracleである従業員のみです。
出力:
EMPLOYEEID | FIRST_NAME | 給与 | 部門 | MANAGERID | MANAGER_NAME |
1001 | VAIBHAVI | 65500 | ORACLE | 1 | Snehdeep Kaur |
2001 | PRACHI | 55500 | ORACLE | 1 | Snehdeep Kaur |
4003 | ルチカ | 60000 | ORACLE | 1 | Snehdeep Kaur |
給与が55000を超え、部門がOracleである従業員は3人だけです。
例5: 従業員、マネージャー、およびラップトップテーブルに対して結合クエリを実行し、従業員の詳細、マネージャーID、およびラップトップIDを表示します。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、M.MANAGERID、L.LAPTOPID FROM EMPLOYEES E INNER JOIN MANAGER M ON E.MANAGERID =M.MANAGERID INNER JOIN LAPTOP L ON E.EMPLOYEEID =L.EMPLOYEEID;
上記のクエリは、従業員、マネージャー、およびラップトップのテーブルからの従業員ID、名、姓、マネージャーID、およびラップトップIDを表示します。 3つのテーブルを結合します。従業員IDは、従業員とラップトップテーブルの間の共通の列であり、これら3つのテーブルの間に親子関係を作成します。従業員とマネージャーの間では、テーブルマネージャーIDが共通の列です。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | MANAGERID | LAPTOPID |
4003 | ルチカ | AGARWAL | 1 | L106 |
3003 | DEEPAM | ジャウハリ | 3 | L104 |
4002 | ASHWINI | バガット | 3 | L105 |
5001 | ARCHIT | シャルマ | 4 | L107 |
1002 | VAIBHAV | シャルマ | 5 | L102 |
左アウタージョイン
左外側結合は、結合の左側にあるすべてのテーブルレコードと、結合の右側にあるテーブルの一致するレコードを返します。結果セットには、右側で一般的ではないレコードのnullが含まれています。
左外部結合の構文:
SELECT Table_Name1.Colum_Name1、Table_Name1.Column_Name2、Table_Name1.Column_Name3、Table_Name2.Column_Name1、Table_Name2.Column_Name2、Table_Name2.Column_Name3、FROM Table_Name1 LEFT OUTER JOIN Table_Name2 ON Table_Name1;次のレコードがある既存のテーブルについて考えてみます。
表1:従業員
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | C# | 5 |
1003 | NIKHIL | VANI | 50500 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | C# | 5 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
4002 | ASHWINI | バガット | 54500 | NOIDA | JAVA | 3 |
4003 | ルチカ | AGARWAL | 60000 | デリー | ORACLE | 1 |
5001 | ARCHIT | シャルマ | 55500 | デリー | テスト | 4 |
表2:マネージャー
Managerid | manager_name | manager_department |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | アヌパムミシュラ | テスト |
5 | Akash Kadam | C# |
表3:ラップトップ
LAPTOPID | 名前 | EMPLOYEEID |
L101 | DELL | NULL |
L102 | HP | 1002 |
L103 | LENOVO | NULL |
L104 | HP | 3003 |
L105 | DELL | 4002 |
L106 | LENOVO | 4003 |
L107 | DELL | 5001 |
L108 | HP | NULL |
L109 | DELL | NULL |
L110 | HP | NULL |
SQL左外部結合の例
例1: 従業員のテーブルとラップトップのテーブルで左外部結合クエリを実行します。ここには、従業員ID、従業員名、およびラップトップIDが表示されます。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、L.LAPTOPID、L.NAME FROM EMPLOYEES E LEFT OUTER JOIN LAPTOP L ON E.EMPLOYEEID =L.EMPLOYEEID;
上記のクエリでは、従業員ID、名、従業員のテーブルのラップトップIDの名前、およびラップトップテーブルの名前を表示し、これら2つのテーブルに対して左外部結合クエリを実行しました。行がテーブル間で類似していない場合、クエリはテーブルの右側にnull値を返します。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | LAPTOPID | 名前 |
1001 | VAIBHAVI | MISHRA | NULL | NULL |
1002 | VAIBHAV | シャルマ | L102 | HP |
1003 | NIKHIL | VANI | NULL | NULL |
2001 | PRACHI | シャルマ | NULL | NULL |
2002 | BHAVESH | JAIN | NULL | NULL |
2003 | ルチカ | JAIN | NULL | NULL |
3001 | PRANOTI | SHENDE | NULL | NULL |
3002 | ANUJA | WANRE | NULL | NULL |
3003 | DEEPAM | ジャウハリ | L104 | HP |
4001 | RAJESH | GOUD | NULL | NULL |
4002 | ASHWINI | バガット | L105 | DELL |
4003 | ルチカ | AGARWAL | L106 | LENOVO |
5001 | ARCHIT | シャルマ | L107 | DELL |
例2: 従業員のID、名、姓、給与をラップトップテーブルの左側の外部結合から取得するクエリを記述します。給与は55000を超えます。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、E.SALARY、L.LAPTOPID、L.NAME FROM EMPLOYEES E LEFT OUTER JOIN LAPTOP L ON E.EMPLOYEEID =L.EMPLOYEEID WHERE SALARY> 55000;
上記のクエリでは、従業員のテーブルから従業員の詳細を取得し、ラップトップのテーブルからラップトップの詳細を取得しましたが、給与が55000を超える従業員の詳細のみを取得しました。これら2つのテーブルに対して左外部結合クエリを実行しました。行がテーブル間で類似していない場合、クエリはテーブルの右側にnull値を返します。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | LAPTOPID | 名前 |
1001 | VAIBHAVI | MISHRA | 65500 | NULL | NULL |
1002 | VAIBHAV | シャルマ | 60000 | L102 | HP |
2001 | PRACHI | シャルマ | 55500 | NULL | NULL |
2002 | BHAVESH | JAIN | 65500 | NULL | NULL |
3001 | PRANOTI | SHENDE | 55500 | NULL | NULL |
3003 | DEEPAM | ジャウハリ | 58500 | L104 | HP |
4001 | RAJESH | GOUD | 60500 | NULL | NULL |
4003 | ルチカ | AGARWAL | 60000 | L106 | LENOVO |
5001 | ARCHIT | シャルマ | 55500 | L107 | DELL |
右アウタージョイン
右側の外部結合は、結合の右側にあるすべてのテーブルレコードと、結合の左側にあるテーブルの一致するレコードを返します。結果セットには、左側で一般的ではないレコードのnullが含まれています。
右外部結合の構文:
SELECT Table_Name1.Colum_Name1、Table_Name1.Column_Name2、Table_Name1.Column_Name3、Table_Name2.Column_Name1、Table_Name2.Column_Name2、Table_Name2.Column_Name3、FROM Table_Name1 RIGHT OUTER JOIN Table_Name2 ON Table_Name1;SQLの右外部結合の例
例1: 従業員のテーブルとラップトップテーブルで右外部結合クエリを実行します。ここには、従業員ID、従業員の名前が表示されます。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、L.LAPTOPID、L.NAME FROM EMPLOYEES E Right OUTER JOIN LAPTOP L ON E.EMPLOYEEID =L.EMPLOYEEID;上記のクエリでは、従業員ID、名、従業員のテーブルのラップトップIDの名前、およびラップトップテーブルの名前を表示し、これら2つのテーブルに対して右外部結合クエリを実行しました。行がテーブル間で類似していない場合、クエリはテーブルの左側にnull値を返します。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | LAPTOPID | 名前 |
NULL | NULL | NULL | L101 | DELL |
1002 | VAIBHAV | シャルマ | L102 | HP |
NULL | NULL | NULL | L103 | LENOVO |
3003 | DEEPAM | ジャウハリ | L104 | HP |
4002 | ASHWINI | バガット | L105 | DELL |
4003 | ルチカ | AGARWAL | L106 | LENOVO |
5001 | ARCHIT | シャルマ | L107 | DELL |
NULL | NULL | NULL | L108 | HP |
NULL | NULL | NULL | L109 | DELL |
NULL | NULL | NULL | L110 | HP |
例2: 従業員のテーブルから従業員ID、名、および姓をフェッチするクエリを記述します。ラップトップ名にリストの1つが含まれているラップトップテーブルの右外側結合は、Dell、HPです。
SELECT E.EMPLOYEEID、E.FIRST_NAME、E.LAST_NAME、E.SALARY、L.LAPTOPID、L.NAME FROM EMPLOYEES E RIGHT OUTER JOIN LAPTOP L ON E.EMPLOYEEID =L.EMPLOYEEID WHERE L.NAME IN( ' DELL'、' HP');
上記のクエリでは、ラップトップテーブルの従業員テーブルのラップトップ詳細から従業員の詳細を表示しました。これらの2つのテーブルに対して右外部結合クエリを実行したのは、ラップトップ名にリストの1つが含まれている従業員だけがDellとHPです。行がテーブル間で類似していない場合、クエリはテーブルの左側にnull値を返します。
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | LAPTOPID | 名前 |
NULL | NULL | NULL | L101 | DELL |
1002 | VAIBHAV | シャルマ | L102 | HP |
3003 | DEEPAM | ジャウハリ | L104 | HP |
4002 | ASHWINI | バガット | L105 | DELL |
5001 | ARCHIT | シャルマ | L107 | DELL |
NULL | NULL | NULL | L108 | HP |
NULL | NULL | NULL | L109 | DELL |
NULL | NULL | NULL | L110 | HP |
完全な外部参加
完全外部結合は、左外部結合と右外部結合の両方の結果をマージします。フルアウタージョインはクロスジョインと同じです。完全外部結合は、行がテーブル間で共通または非共通である出力を返します。
完全な外部結合の構文:
SELECT COLUMNNAME1、COLUMNNAME2 FROM TABLE1 FULL JOIN TABLE2;
例1: 従業員の給与が65000を超える、従業員のテーブルの完全な外部結合マネージャーテーブルのマネージャーIDの従業員ID、名、姓を表示するクエリを記述します。
SELECT EMPLOYEEID、FIRST_NAME、LAST_NAME、M.MANAGERID FROM EMPLOYEES FULL JOIN MANAGER M WHERE SALARY> 65000;
上記のクエリでは、従業員の給与が65000を超える場合、従業員とマネージャーのテーブルから従業員の詳細とマネージャーの詳細を表示しました。完全に、マネージャーのテーブルの各行全体で従業員のテーブルの各行を結合します。つまり、デカルト積が発生します。 M * N
出力:
EMPLOYEEID | FIRST_NAME | LAST_NAME | MANAGERID |
1001 | VAIBHAVI | MISHRA | 1 |
1001 | VAIBHAVI | MISHRA | 2 |
1001 | VAIBHAVI | MISHRA | 3 |
1001 | VAIBHAVI | MISHRA | 4 |
1001 | VAIBHAVI | MISHRA | 5 |
2002 | BHAVESH | JAIN | 1 |
2002 | BHAVESH | JAIN | 2 |
2002 | BHAVESH | JAIN | 3 |
2002 | BHAVESH | JAIN | 4 |
2002 | BHAVESH | JAIN | 5 |
ご覧のとおり、従業員ID 1001は、従業員ID 2002と同じように、各マネージャーIDと相互結合します。
例2: 従業員の給与が60000を超え、従業員の場所がPuneである、従業員のテーブルとラップトップのテーブルに対して完全外部結合クエリを実行します。
SELECT LAPTOPID、E.EMPLOYEEID、E.FIRST_NAME、E.SALARY、E.CITY FROM LAPTOP FULL JOIN EMPLOYEES E WHERE SALARY> 60000 AND CITY ='PUNE';
上記のクエリでは、ラップトップID、従業員ID、名、給与、およびラップトップフルジョインの従業員からの市区町村は、給与が60000を超え、市区町村がプネである従業員のみを表示します。両方の条件が従業員のみに一致する場合、レコードがフェッチされます。
出力:
クロスジョイン
SQLの相互結合は、デカルト積と呼ばれています。 1つのテーブルの各行は、他のテーブルの各行と結合またはマージされます。 M*Nはクロスジョインです
クロス結合の構文:
SELECT COLUMNNAME1、COLUMNNAME2 FROM TABLE1 CROSS JOIN TABLE2;
例1: 従業員の名がAで始まるemployeesテーブルとmanagerテーブルでクロス結合操作を実行するクエリを記述します
SELECT EMPLOYEEID、FIRST_NAME、M.MANAGERID FROM EMPLOYEES CROSS JOIN MANAGER M WHERE FIRST_NAME LIKE'A%';
上記の完全外部結合クエリの例では、従業員テーブルとマネージャーテーブルから従業員の詳細とマネージャーの詳細を取得しましたが、従業員の名が文字「A」で始まるレコードのみを取得しました。
出力:
結果は、従業員IDが各マネージャーID行との相互結合であることを示しています。
M * Nここで、M =3;従業員テーブルの従業員ID
N =5;マネージャーテーブル3のマネージャーID*5=15行。
例2: 従業員の給与が58000およびムンバイを超えるラップトップテーブルと従業員テーブルでクロス結合操作を実行するクエリを記述します。
SELECT LAPTOPID、NAME、E.EMPLOYEEID FROM LAPTOP CROSS JOIN EMPLOYEES E WHERE SALARY> 58000 AND CITY ='MUMBAI';
上記のクエリでは、ラップトップテーブルのラップトップID、名前、および従業員IDを表示して、従業員の給与が58000を超え、都市がプネである従業員テーブルでクロス結合操作を実行しました。クロスジョインはM*Nのように機能します。
出力: