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 |