sql >> データベース >  >> RDS >> Database

SQLJOINの種類

    SQL JOINは、それらの関係に基づいて1つまたは複数のテーブルを結合します。 SQL JOINには、親テーブルと子テーブルの関係が含まれます。

    SQL JOINSにはさまざまな種類があります:

    1. 内部参加
    2. 左アウタージョイン
    3. 右外部結合
    4. 完全な外部参加
    5. クロスジョイン。

    例を使用して、各タイプの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のように機能します。

    出力:


    1. 可能な限り2番目に高い給与の最良の方法を見つける

    2. MySQLで10進数と16進数を変換する2つの方法

    3. 列SQLを動的に作成する

    4. MySQLエラーの回避ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してみてください