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ảnCASE tìm kiếm.

a. CASE đơn giản

shell
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ếu expression khớp với value.
  • default_result: Giá trị trả về nếu không có điều kiện nào khớp (mệnh đề ELSE là tùy chọn).

b. CASE tìm kiếm

shell
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_idfirst_namelast_namedepartmentsalary
1JohnDoeSales1500000
2JaneSmithMarketing1700000
3BobJohnsonSales1300000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

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ọ:

shell
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_namelast_namesalary_category
JohnDoeMedium
JaneSmithMedium
BobJohnsonLow
AliceBrownHigh
CharlieGreenHigh

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"

shell
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_namelast_namedepartmentdepartment_group
JohnDoeSalesBusiness
JaneSmithMarketingBusiness
BobJohnsonSalesBusiness
AliceBrownHRSupport
CharlieGreenMarketingBusiness

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.

shell
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_namelast_namesalary
AliceBrown2000000
CharlieGreen1800000
JaneSmith1700000
JohnDoe1500000
BobJohnson1300000

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.

shell
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_grouptotal_salary
Low1300000
Medium3200000
High3800000

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.

shell
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

shell
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

shell
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

shell
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!