1. Giới thiệu
CASE là một mệnh đề điều kiện được sử dụng trong MySQL để thực hiện các thao tác logic. Nó cho phép bạn thực hiện các phép so sánh và trả về các giá trị khác nhau tùy thuộc vào điều kiện đã được chỉ định. CASE hoạt động tương tự như câu lệnh IF-THEN-ELSE trong các ngôn ngữ lập trình khác, giúp xử lý các điều kiện phức tạp ngay trong câu truy vấn SQL.
Mệnh đề CASE có thể được sử dụng trong các câu lệnh SELECT, UPDATE, INSERT, và các câu lệnh khác để điều kiện hóa dữ liệu.
2. Cú pháp của CASE trong MySQL
Có hai dạng cú pháp cơ bản của CASE: CASE đơn giản và CASE tìm kiếm.
a. CASE đơn giản
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END;expression: Biểu thức cần kiểm tra.value1,value2, ...: Các giá trị mà biểu thức có thể có.result1,result2, ...: Kết quả sẽ trả về nếuexpressionkhớp vớivalue.default_result: Giá trị trả về nếu không có điều kiện nào khớp (mệnh đềELSElà tùy chọn).
b. CASE tìm kiếm
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END;condition1,condition2, ...: Các điều kiện logic cần kiểm tra.result1,result2, ...: Kết quả trả về nếu điều kiện tương ứng là đúng.default_result: Giá trị trả về nếu không có điều kiện nào đúng (tùy chọn).
3. Bảng dữ liệu giả định
Giả sử chúng ta có bảng employees với các thông tin sau:
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 1500000 |
| 2 | Jane | Smith | Marketing | 1700000 |
| 3 | Bob | Johnson | Sales | 1300000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
4. Cách sử dụng CASE trong MySQL
a. Sử dụng CASE để tạo cột tùy chỉnh
Ví dụ 1: Phân loại nhân viên theo mức lương
Trong ví dụ này, chúng ta sẽ phân loại nhân viên thành các nhóm "Low", "Medium", và "High" dựa trên mức lương của họ:
SELECT first_name, last_name,
CASE
WHEN salary < 1500000 THEN 'Low'
WHEN salary BETWEEN 1500000 AND 1800000 THEN 'Medium'
ELSE 'High'
END AS salary_category
FROM employees;Kết quả:
| first_name | last_name | salary_category |
|---|---|---|
| John | Doe | Medium |
| Jane | Smith | Medium |
| Bob | Johnson | Low |
| Alice | Brown | High |
| Charlie | Green | High |
Trong ví dụ này, CASE giúp tạo ra một cột salary_category dựa trên giá trị của salary.
b. Sử dụng CASE với điều kiện tùy chỉnh
Ví dụ 2: Gán phòng ban "Sales" và "Marketing" vào nhóm "Business"
SELECT first_name, last_name, department,
CASE
WHEN department = 'Sales' THEN 'Business'
WHEN department = 'Marketing' THEN 'Business'
ELSE 'Support'
END AS department_group
FROM employees;Kết quả:
| first_name | last_name | department | department_group |
|---|---|---|---|
| John | Doe | Sales | Business |
| Jane | Smith | Marketing | Business |
| Bob | Johnson | Sales | Business |
| Alice | Brown | HR | Support |
| Charlie | Green | Marketing | Business |
Trong ví dụ này, CASE giúp phân chia các phòng ban vào hai nhóm là "Business" và "Support".
c. Sử dụng CASE trong mệnh đề ORDER BY
Ví dụ 3: Sắp xếp nhân viên dựa trên nhóm lương
Bạn có thể sử dụng CASE trong mệnh đề ORDER BY để sắp xếp kết quả theo điều kiện tùy chỉnh.
SELECT first_name, last_name, salary
FROM employees
ORDER BY
CASE
WHEN salary > 1800000 THEN 1
WHEN salary BETWEEN 1500000 AND 1800000 THEN 2
ELSE 3
END;Kết quả:
| first_name | last_name | salary |
|---|---|---|
| Alice | Brown | 2000000 |
| Charlie | Green | 1800000 |
| Jane | Smith | 1700000 |
| John | Doe | 1500000 |
| Bob | Johnson | 1300000 |
Trong ví dụ này, nhân viên có lương cao nhất sẽ được ưu tiên sắp xếp trước, tiếp theo là những người có lương trung bình và thấp.
d. Sử dụng CASE với các hàm tổng hợp
Ví dụ 4: Tính tổng lương cho từng nhóm lương
Bạn có thể kết hợp CASE với các hàm tổng hợp như SUM() để tính toán các giá trị dựa trên điều kiện.
SELECT
CASE
WHEN salary < 1500000 THEN 'Low'
WHEN salary BETWEEN 1500000 AND 1800000 THEN 'Medium'
ELSE 'High'
END AS salary_group,
SUM(salary) AS total_salary
FROM employees
GROUP BY salary_group;Kết quả:
| salary_group | total_salary |
|---|---|
| Low | 1300000 |
| Medium | 3200000 |
| High | 3800000 |
Trong ví dụ này, CASE giúp phân loại nhân viên theo nhóm lương và SUM() tính tổng lương cho mỗi nhóm.
e. Sử dụng CASE trong câu lệnh UPDATE
Ví dụ 5: Cập nhật dữ liệu dựa trên điều kiện
Bạn có thể sử dụng CASE trong câu lệnh UPDATE để cập nhật dữ liệu theo các điều kiện khác nhau.
UPDATE employees
SET salary =
CASE
WHEN department = 'Sales' THEN salary * 1.1
WHEN department = 'Marketing' THEN salary * 1.05
ELSE salary
END;Trong ví dụ này, các nhân viên trong phòng "Sales" sẽ được tăng lương 10%, và nhân viên trong phòng "Marketing" sẽ được tăng 5%. Nhân viên ở các phòng khác sẽ không thay đổi lương.
5. Các ví dụ khác về CASE trong MySQL
Ví dụ 1: Xác định trạng thái thưởng dựa trên lương
SELECT first_name, last_name, salary,
CASE
WHEN salary > 1800000 THEN 'Eligible for Bonus'
ELSE 'Not Eligible'
END AS bonus_status
FROM employees;Ví dụ 2: Phân loại nhân viên theo phòng ban và tính lương trung bình
SELECT department,
CASE
WHEN AVG(salary) > 1700000 THEN 'High-Paying'
ELSE 'Low-Paying'
END AS pay_category
FROM employees
GROUP BY department;Ví dụ 3: Hiển thị thông báo tùy chỉnh dựa trên số lượng đơn hàng
SELECT customer_id,
CASE
WHEN COUNT(order_id) > 5 THEN 'VIP Customer'
ELSE 'Regular Customer'
END AS customer_type
FROM orders
GROUP BY customer_id;6. Một số lưu ý khi sử dụng CASE trong MySQL
a. Cú pháp CASE phải kết thúc bằng END
Mệnh đề CASE trong SQL luôn phải kết thúc bằng từ khóa END, nếu không, bạn sẽ gặp lỗi cú pháp.
b. Sử dụng ELSE để xử lý kết quả không khớp
Mệnh đề ELSE trong CASE là tùy chọn, nhưng rất hữu ích để xử lý các trường hợp khi không có điều kiện nào thỏa mãn. Nếu không có ELSE, và không có điều kiện nào đúng, NULL sẽ được trả về.
c. Không sử dụng được CASE ngoài mệnh đề SELECT, ORDER BY, UPDATE, v.v.
Mệnh đề CASE không thể được sử dụng độc lập mà phải nằm trong các câu lệnh như SELECT, UPDATE, ORDER BY, và một số câu lệnh SQL khác.
Kết luận
CASE là một công cụ mạnh mẽ và linh hoạt giúp bạn thực hiện các điều kiện và logic phức tạp trong các câu lệnh MySQL. Bằng cách sử dụng CASE, bạn có thể tạo các cột tùy chỉnh, tính toán giá trị dựa trên điều kiện, và thực hiện các phép tính tổng hợp trong SQL. CASE rất hữu ích khi bạn cần xử lý các tình huống yêu cầu các điều kiện phức tạp mà không cần phải viết nhiều truy vấn khác nhau.
Hãy thử áp dụng các ví dụ này trong các bài tập và dự án thực tế trên CodeTutHub để hiểu rõ hơn về cách sử dụng CASE trong MySQL!








