SQL DISTINCTクエリは、SQLのSELECTステートメントを使用してテーブルから一意の値をフェッチするために使用されます。
テーブルから一意の値をフェッチしたいが、テーブル内に重複した値が存在する場合に発生する可能性があります。このような場合は、SELECT DISTINCTクエリを使用して、重複する値を削除し、テーブルから一意の値をフェッチする必要があります。
SELECT DISTINCTステートメントの構文:
SELECT DISTINCT columnname1, columnname2 FROM table_name; 次のレコードを持つ既存の従業員のテーブルについて考えてみます。
| EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
| 1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
| 1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
| 1003 | NIKHIL | VANI | 50500 | ジャイプール | 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 | 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 |
例を使用してSELECTDISTINCTを理解しましょう。
例1: DISTINCTキーワードを使用せずに、従業員の給与が55000を超える従業員の詳細を取得するクエリを記述します。
SELECT * FROM EMPLOYEES WHERE SALARY > 55000; 上記のステートメントでは、重複する値を含め、従業員の給与が55000を超える従業員のテーブルから従業員の詳細を取得しています。
次のステートメントの出力:
| EMPLOYEEID | FIRST_NAME | LAST_NAME | 給与 | CITY | 部門 | MANAGERID |
| 1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
| 1002 | VAIBHAV | シャルマ | 60000 | NOIDA | ORACLE | 1 |
| 2001 | PRACHI | シャルマ | 55500 | チャンディーガル | ORACLE | 1 |
| 2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
| 3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
| 3003 | DEEPAM | ジャウハリ | 58500 | ムンバイ | JAVA | 3 |
| 4001 | RAJESH | GOUD | 60500 | ムンバイ | テスト | 4 |
| 4003 | ルチカ | AGARWAL | 60000 | デリー | ORACLE | 1 |
| 5001 | ARCHIT | シャルマ | 55500 | デリー | テスト | 4 |
上記の結果は、重複する値を含む従業員の詳細を取得したことを示しています。
例2: DISTINCTキーワードを使用して、従業員の給与が55000を超えるemployeesテーブルの従業員の給与を表示するクエリを記述します。
SELECT DISTINCT (SALARY) FROM EMPLOYEES WHERE SALARY > 55000; 上記のステートメントでは、給与が55000を超える従業員のテーブルから従業員の給与を取得しており、重複する値を削除しています。個別の給与には、従業員のテーブルからの固有の給与が表示されます。
次のステートメントの出力:
| SALARY |
| 65000 |
| 60000 |
| 55500 |
| 65500 |
| 58500 |
| 60500 |
最初の例では、給与が55000を超える従業員の詳細を取得しました。クエリ結果に重複する値が含まれています。ただし、2番目の例では、同じクエリを実行して、給与が55000を超える従業員の給与を表示します。このクエリは、DISTINCTキーワードの後にsalary列を使用したため、重複する値を削除した結果を表示します。
例3: 明確なキーワードを使用せずに、employeesテーブルのemployeecityとsalaryを表示するクエリを記述します。
SELECT SALARY, CITY FROM EMPLOYEES; 上記のステートメントでは、重複する値を含め、従業員のテーブルから従業員の給与と都市名を表示しています。
次のステートメントの出力:
| SALARY | CITY |
| 65500 | PUNE |
| 60000 | NOIDA |
| 50500 | ジャイプール |
| 55500 | チャンディーガル |
| 65500 | PUNE |
| 50000 | ムンバイ |
| 55500 | PUNE |
| 50500 | ジャイプール |
| 58500 | ムンバイ |
| 60500 | ムンバイ |
| 54500 | NOIDA |
| 60000 | デリー |
| 55500 | デリー |
例4: 個別のキーワードを使用して、employeesテーブルの従業員の都市と給与を表示するクエリを記述します。
従業員から異なる給与、都市を選択;
上記のステートメントの従業員テーブルから従業員の給与と都市を取得しました。ただし、DISTINCTキーワードを使用して、テーブル全体で繰り返されない一意の値をフェッチしました。
次のステートメントの出力:
| SALARY | CITY |
| 65500 | PUNE |
| 60000 | NOIDA |
| 50500 | ジャイプール |
| 55500 | チャンディーガル |
| 50000 | ムンバイ |
| 55500 | PUNE |
| 58500 | ムンバイ |
| 60500 | ムンバイ |
| 54500 | NOIDA |
| 60000 | デリー |
| 55500 | デリー |
例5: DISTINCTキーワードを使用せずに、部門名が「O」で始まる従業員のテーブルから従業員の姓と部門を表示するクエリを記述します。
SELECT LAST_NAME, DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT LIKE 'O%'; 上記のステートメントでは、重複する値を含め、部門名が「O」で始まる従業員の従業員のテーブルから、従業員の姓、部門を取得しました。
次のステートメントの出力:
| LAST_NAME | 部門 |
| MISHRA | ORACLE |
| SHARMA | ORACLE |
| SHARMA | ORACLE |
| AGARWAL | ORACLE |
部門が「O」で始まる従業員のレコードは4つだけ表示されます。
例6: DISTINCTキーワードを使用して、部門名が「O」で始まる従業員のテーブルから従業員の名前と部門を表示するクエリを記述します。
SELECT DISTINCT LAST_NAME, DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT LIKE 'O%'; 例5でも同じクエリを使用しましたが、列名の直前にDISTINCTキーワードを追加しました。これにより、部門名が「O」で始まる従業員のテーブルの一意の値が表示されます。
次のステートメントの出力:
| LAST_NAME | 部門 |
| MISHRA | ORACLE |
| SHARMA | ORACLE |
| AGARWAL | ORACLE |
上記のクエリで実行したのと同じクエリで、列の直前にDISTINCTキーワードを追加しました。結果の表示には一意の値があるため、取得する出力は上記の例とは異なります。
例7: 個別のキーワードを使用せずに、employeesテーブルから従業員の給与をカウントするクエリを記述します。
SELECT COUNT (SALARY) AS TOTAL SALARY FROM EMPLOYEES; 上記のステートメントでは、重複する値を含む、従業員のテーブルからの給与の総数をカウントしています。
次のステートメントの出力:
| TOTAL SALARY |
| 13 |
例8: 個別のキーワードを使用して、employeesテーブルから従業員の給与をカウントするクエリを記述します。
SELECT COUNT(DISTINCT SALARY) AS TOTAL SALARY FROM EMPLOYEES; 上記のステートメントでは、重複する値を除いて、従業員のテーブルからの給与の総数をカウントしています。
次のステートメントの出力:
| TOTAL SALARY |
| 8 |