Truy vấn SQL DISTINCT được sử dụng để tìm nạp các giá trị duy nhất từ các bảng bằng cách sử dụng câu lệnh SELECT trong SQL.
Có thể có một tình huống phát sinh khi bạn muốn tìm nạp các giá trị duy nhất từ các bảng, nhưng các giá trị trùng lặp cũng có bên trong bảng. Trong trường hợp đó, bạn nên sử dụng truy vấn CHỌN DISTINCT để loại bỏ các giá trị trùng lặp và tìm nạp các giá trị duy nhất từ bảng.
Cú pháp của câu lệnh SELECT DISTINCT:
SELECT DISTINCT columnname1, columnname2 FROM table_name;
Hãy xem xét các bảng của nhân viên hiện có có các bản ghi sau:
EMPLOYEEID | FIRST_NAME | LAST_NAME | TIỀN LƯƠNG | THÀNH PHỐ | KHOA | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65500 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | ORACLE | 1 |
1003 | NIKHIL | VANI | 50500 | JAIPUR | FMW | 2 |
2001 | PRACHI | SHARMA | 55500 | ĐIỀU CHỈNH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50000 | MUMBAI | KIỂM TRA | 4 |
3001 | PRANOTI | CHIA SẺ | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | DÂY | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | MỤC TIÊU | 60500 | MUMBAI | KIỂM TRA | 4 |
4002 | ASHWINI | TÚI XÁCH | 54500 | NOIDA | JAVA | 3 |
4003 | RUCHIKA | AGARWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | KIỂM TRA | 4 |
Hãy hiểu rõ CHỌN DISTINCT với sự trợ giúp của một ví dụ.
Ví dụ 1: Viết truy vấn để tìm nạp thông tin chi tiết về nhân viên có mức lương của nhân viên lớn hơn 55000 mà không sử dụng từ khóa DISTINCT.
SELECT * FROM EMPLOYEES WHERE SALARY > 55000;
Trong câu lệnh trên, chúng tôi đã tìm nạp thông tin chi tiết về nhân viên từ bảng của nhân viên có mức lương của nhân viên lớn hơn 55000, bao gồm cả các giá trị trùng lặp.
Kết quả cho câu lệnh sau:
EMPLOYEEID | FIRST_NAME | LAST_NAME | TIỀN LƯƠNG | THÀNH PHỐ | KHOA | MANAGERID |
1001 | VAIBHAVI | MISHRA | 65000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60000 | NOIDA | ORACLE | 1 |
2001 | PRACHI | SHARMA | 55500 | ĐIỀU CHỈNH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
3001 | PRANOTI | CHIA SẺ | 55500 | PUNE | JAVA | 3 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | MỤC TIÊU | 60500 | MUMBAI | KIỂM TRA | 4 |
4003 | RUCHIKA | AGARWAL | 60000 | DELHI | ORACLE | 1 |
5001 | ARCHIT | SHARMA | 55500 | DELHI | KIỂM TRA | 4 |
Kết quả trên cho thấy chúng tôi đã tìm nạp thông tin chi tiết về nhân viên, bao gồm cả các giá trị trùng lặp.
Ví dụ 2: Viết truy vấn để hiển thị mức lương của nhân viên từ bảng nhân viên có mức lương của nhân viên lớn hơn 55000 bằng từ khóa DISTINCT.
SELECT DISTINCT (SALARY) FROM EMPLOYEES WHERE SALARY > 55000;
Trong câu lệnh trên, chúng tôi đang truy xuất lương của nhân viên từ bảng của nhân viên có mức lương lớn hơn 55000, nơi chúng tôi đang loại bỏ các giá trị trùng lặp. Mức lương riêng biệt sẽ hiển thị mức lương duy nhất từ bảng của nhân viên.
Kết quả cho câu lệnh sau:
SALARY |
65000 |
60000 |
55500 |
65500 |
58500 |
60500 |
Trong ví dụ đầu tiên, chúng tôi đã tìm nạp chi tiết nhân viên có mức lương lớn hơn 55000. Kết quả truy vấn bao gồm các giá trị trùng lặp. Nhưng trong ví dụ thứ hai, chúng tôi thực hiện cùng một truy vấn để hiển thị mức lương của nhân viên có mức lương lớn hơn 55000. Truy vấn hiển thị kết quả loại bỏ các giá trị trùng lặp vì chúng tôi đã sử dụng từ khóa DISTINCT theo sau là cột lương.
Ví dụ 3: Viết truy vấn để hiển thị thành phố của nhân viên và mức lương từ bảng nhân viên mà không sử dụng từ khóa riêng biệt.
SELECT SALARY, CITY FROM EMPLOYEES;
Chúng tôi đã hiển thị mức lương của nhân viên và tên thành phố từ bảng của nhân viên trong câu lệnh trên, bao gồm các giá trị trùng lặp.
Kết quả cho câu lệnh sau:
SALARY | THÀNH PHỐ |
65500 | PUNE |
60000 | NOIDA |
50500 | JAIPUR |
55500 | ĐIỀU CHỈNH |
65500 | PUNE |
50000 | MUMBAI |
55500 | PUNE |
50500 | JAIPUR |
58500 | MUMBAI |
60500 | MUMBAI |
54500 | NOIDA |
60000 | DELHI |
55500 | DELHI |
Ví dụ 4: Viết truy vấn để hiển thị thành phố của nhân viên và mức lương từ bảng nhân viên bằng cách sử dụng các từ khóa riêng biệt.
CHỌN TIỀN LƯƠNG DISTINCT, THÀNH PHỐ TỪ NHÂN VIÊN;
Chúng tôi đã lấy mức lương của nhân viên và thành phố từ bảng nhân viên trong câu lệnh trên. Nhưng chúng tôi đã tìm nạp một giá trị duy nhất không được lặp lại trong toàn bộ bảng bằng từ khóa DISTINCT.
Kết quả cho câu lệnh sau:
SALARY | THÀNH PHỐ |
65500 | PUNE |
60000 | NOIDA |
50500 | JAIPUR |
55500 | ĐIỀU CHỈNH |
50000 | MUMBAI |
55500 | PUNE |
58500 | MUMBAI |
60500 | MUMBAI |
54500 | NOIDA |
60000 | DELHI |
55500 | DELHI |
Ví dụ 5: Viết truy vấn để hiển thị họ của nhân viên và bộ phận từ bảng của nhân viên trong đó tên bộ phận bắt đầu bằng 'O' mà không sử dụng từ khóa DISTINCT;
SELECT LAST_NAME, DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT LIKE 'O%';
Trong câu lệnh trên, chúng tôi đã tìm nạp họ của nhân viên, các phòng ban từ bảng của nhân viên gồm những nhân viên có tên phòng ban bắt đầu bằng 'O', bao gồm các giá trị trùng lặp.
Kết quả cho câu lệnh sau:
LAST_NAME | KHOA |
MISHRA | ORACLE |
SHARMA | ORACLE |
SHARMA | ORACLE |
AGARWAL | ORACLE |
Chỉ có bốn bản ghi được hiển thị về những nhân viên có bộ phận bắt đầu bằng chữ 'O'.
Ví dụ 6: Viết truy vấn để hiển thị họ của nhân viên và bộ phận từ bảng của nhân viên trong đó tên bộ phận bắt đầu bằng 'O' bằng cách sử dụng từ khóa DISTINCT;
SELECT DISTINCT LAST_NAME, DEPARTMENT FROM EMPLOYEES WHERE DEPARTMENT LIKE 'O%';
Chúng tôi đã sử dụng cùng một truy vấn trong ví dụ 5, chỉ cần thêm từ khóa DISTINCT ngay trước tên cột sẽ hiển thị các giá trị duy nhất từ bảng của nhân viên có tên bộ phận bắt đầu bằng 'O'.
Kết quả cho câu lệnh sau:
LAST_NAME | KHOA |
MISHRA | ORACLE |
SHARMA | ORACLE |
AGARWAL | ORACLE |
Cùng một truy vấn mà chúng tôi đã thực hiện trong truy vấn trên, chúng tôi đã thêm từ khóa DISTINCT ngay trước các cột. Kết quả mà chúng ta nhận được khác với ví dụ trên vì kết quả hiển thị có các giá trị duy nhất.
Ví dụ 7: Viết truy vấn để tính lương của nhân viên từ bảng nhân viên mà không sử dụng từ khóa riêng biệt.
SELECT COUNT (SALARY) AS TOTAL SALARY FROM EMPLOYEES;
Trong câu lệnh trên, chúng tôi đã đếm tổng số tiền lương từ bảng của nhân viên, bao gồm cả các giá trị trùng lặp.
Kết quả cho câu lệnh sau:
TỔNG LƯƠNG |
13 |
Ví dụ 8: Viết truy vấn để tính lương của nhân viên từ bảng nhân viên bằng cách sử dụng từ khóa riêng biệt.
SELECT COUNT(DISTINCT SALARY) AS TOTAL SALARY FROM EMPLOYEES;
Trong câu lệnh trên, chúng tôi đã đếm tổng số tiền lương từ bảng của nhân viên, không bao gồm các giá trị trùng lặp.
Kết quả cho câu lệnh sau:
TỔNG LƯƠNG |
8 |