SQLでは、おそらくJOIN句を使用して、1つまたは複数のテーブルから結合された結果を受け取ります。ただし、一方のテーブルのデータを含む結果が必要な場合があり、そのレコードをもう一方のテーブルで使用できないようにする必要があります。その場合、SQLの概念名はSQLExceptです。
複数のテーブルからデータを精製するために、SQLExceptを使用しました。 SQL Exceptは、数学で行うマイナス演算子と同じです。 SQL Exceptは、最初にクエリ内の2つまたは3つ以上のSELECTステートメントをマージし、最初のSELECTステートメントからデータを返します。別のSELECTステートメントの結果では利用できません。
SQLEXCEPTルール
SQLでEXCEPTクエリを使用する前に、すべてのルールと規制を理解する必要があります。
- 指定されたテーブルの列の数と順序は、SELECTクエリ全体で同じである必要があります。
- 列のデータ型は同じか互換性がある必要があります。
SQL EXCEPT
の構文SELECT * FROM table1 EXCEPT SELECT * FROM table2;
Table1とTable2がテーブルの名前になります。
例:
同じ列数と列の順序を持つ2つのテーブルがあると仮定します。
- 表1:T1、列数:3、データ:A、B、C、D
- 表2:T2、列数:3、データ:B、D、F、G
これらの2つのテーブルでEXCEPTクエリを実行すると、AとCが取得されます。これは、これら2つのデータがテーブルT2に存在しないため、BとDは両方のテーブルで共通であり、破棄されます。
例を使ってSQLEXCEPTの概念を理解しましょう。与えられたレコードと一緒に次の表を検討してください。
表1:Emp
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50000 | ジャイプール | FMW | 2 |
2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | ルチカ | JAIN | 50000 | ムンバイ | テスト | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | 場所 | 50500 | ジャイプール | FMW | 2 |
3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
表2:従業員
EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
1001 | Vaibhav | シャルマ | 65000 | PUNE | ORACLE | 1 |
1002 | ニキル | ヴァニ | 60000 | NOIDA | ORACLE | 1 |
1003 | Vaibhavi | ミシュラ | 50000 | ジャイプール | FMW | 2 |
2001 | ルチカ | Jain | 55500 | チャンディーガル | ORACLE | 1 |
2002 | プラチ | シャルマ | 65500 | PUNE | FMW | 2 |
2003 | Bhavesh | Jain | 50000 | ムンバイ | テスト | 4 |
3001 | Deepam | ジャウハリ | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | 場所 | 50500 | ジャイプール | FMW | 2 |
3003 | プラノティ | シェンデ | 58500 | ムンバイ | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
表3:マネージャー
Managerid | manager_name | manager_department |
1 | Snehdeep Kaur | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | アヌパムミシュラ | テスト |
表4:マネージャー1
Managerid | manager_name | manager_department |
1 | 石田アグラワル | ORACLE |
2 | Kirti Kirtane | FMW |
3 | Abhishek Manish | JAVA |
4 | Paul Oakip | テスト |
例1: EXCEPT演算子を使用して、SELECTクエリで上記の2つのテーブルEmpとEmployeeを結合するとします。
SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, DEPARTMENT MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER ON EMP.MANAGERID = MANAGER.MANAGERID EXCEPT SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, DEPARTMENT, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER1 ON EMPLOYEE.MANAGERID = MANAGER1.MANAGERID;
EmpテーブルとEmployeeテーブルの間にINNERJOIN句を使用しており、EXCEPT演算子を使用して、従業員ID、名前、都市、部門、マネージャーID、およびマネージャー名を表示しています。上記のクエリでは、両方のテーブル間で一意の値のみが表示されます。
上記のクエリは次の出力を提供します:
テーブルデータを観察すると、両方のテーブルEmpテーブルとEmployeeテーブルの間に2つの共通データがあります。つまり、従業員ID3002と4001です。従業員ID4001の詳細は3002を除いて表示されます。従業員ID3002マネージャー名は両方のテーブルマネージャーで同じであるためおよびManager1ですが、従業員ID 4001のマネージャー名は両方のテーブルで異なり、従業員ID4002の詳細が表示されます。
例2: EXCEPT演算子を使用してSELECTクエリで上記の2つのテーブルEmpとEmployeeを結合し、結果セットを給与で降順に並べ替えるとします。 ORDER BY句を使用して、SQLクエリの結果セットを並べ替えます。
SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, SALARY, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER ON EMP.MANAGERID = MANAGER.MANAGERID EXCEPT SELECT EMPLOYEEID, CONCAT(FIRST_NAME, LAST_NAME) AS NAME, CITY, SALARY, MANAGER1.MANAGERID, MANAGER1.MANAGER_NAME FROM EMPLOYEE INNER JOIN MANAGER1 ON EMPLOYEE.MANAGERID = MANAGER1.MANAGERID ORDER BY SALARY;
上記のクエリは、次の出力を示しています。
例3: EXCEPT演算子を使用してSELECTクエリで上記の2つのテーブルEmpとEmployeeを結合するとします。ここで、Empテーブルと従業員都市からの55000を超える従業員の給与には、Employeeテーブルからの「Pune」、「Mumbai」、「Jaipur」が含まれます。
>SELECT * FROM EMP WHERE SALARY > 55000 EXCEPT SELECT * FROM EMPLOYEE WHERE CITY IN ('Pune', 'Mumbai', 'Jaipur');
上記のクエリの最初のSELECTステートメントは、給与が55000を超える従業員のすべての詳細をEmpテーブルからフェッチします。 2番目のSELECTステートメントは、都市にプネ、ムンバイ、ジャイプールが含まれる従業員のすべての詳細をEmployeeテーブルからフェッチします。次に、EmpテーブルとEmployeeテーブルの間でEXCEPT演算子が実行されます。
これにより、次の出力が得られます。