Điều Kiện Trong Truy Vấn Với CASE WHEN và Wildcard, REGEXP trong MySQL
- 08-07-2025
- Toanngo92
- 0 Comments
CASE WHEN trong MySQL — một tính năng cực kỳ mạnh mẽ và linh hoạt để xử lý điều kiện trong truy vấn SQL, tương tự như câu lệnh if...else trong lập trình.
Mục lục
✅ 1. CASE WHEN Là Gì?
CASE WHENcho phép bạn gắn điều kiện logic vào cột kết quả trong truy vấn.- Rất hữu ích khi muốn hiển thị nội dung tùy theo điều kiện, ví dụ như phân loại tuổi, đánh giá kết quả học tập, v.v.
✅ 2. Cú Pháp Cơ Bản
SELECT
cot,
CASE
WHEN dieu_kien1 THEN gia_tri1
WHEN dieu_kien2 THEN gia_tri2
ELSE gia_tri_mac_dinh
END AS ten_cot_moi
FROM ten_bang;
✅ 3. Ví Dụ Thực Tế
📌 Bảng Students
CREATE TABLE Students (
id INT PRIMARY KEY,
name VARCHAR(50),
score INT
);
INSERT INTO Students VALUES
(1, 'Nam', 85),
(2, 'Linh', 70),
(3, 'Hà', 55),
(4, 'Khoa', 40);
🎯 Phân loại học lực:
SELECT
name,
score,
CASE
WHEN score >= 80 THEN 'Giỏi'
WHEN score >= 65 THEN 'Khá'
WHEN score >= 50 THEN 'Trung bình'
ELSE 'Yếu'
END AS hoc_luc
FROM Students;
📌 Kết quả:
| name | score | hoc_luc |
|---|---|---|
| Nam | 85 | Giỏi |
| Linh | 70 | Khá |
| Hà | 55 | Trung bình |
| Khoa | 40 | Yếu |
✅ 4. Dùng CASE WHEN trong ORDER BY, GROUP BY, HAVING
Bạn có thể dùng trong:
ORDER BYđể sắp xếp theo logic tùy ýGROUP BYphân nhóm theo điều kiệnHAVINGlọc nhóm theo điều kiện phức tạp
Ví dụ: Sắp xếp học lực theo thứ tự Giỏi → Khá → Trung bình → Yếu
SELECT name, score,
CASE
WHEN score >= 80 THEN 'Giỏi'
WHEN score >= 65 THEN 'Khá'
WHEN score >= 50 THEN 'TB'
ELSE 'Yếu'
END AS hoc_luc
FROM Students
ORDER BY
CASE
WHEN score >= 80 THEN 1
WHEN score >= 65 THEN 2
WHEN score >= 50 THEN 3
ELSE 4
END;
✅ 5. Dùng CASE trong UPDATE
UPDATE Students
SET score =
CASE
WHEN name = 'Hà' THEN 60
WHEN name = 'Khoa' THEN 50
ELSE score
END;
Cập nhật điểm cho 2 sinh viên theo tên.
✅ 6. Dùng CASE trong SELECT COUNT
Đếm số sinh viên giỏi, khá, yếu:
SELECT
COUNT(CASE WHEN score >= 80 THEN 1 END) AS gioi,
COUNT(CASE WHEN score >= 65 AND score < 80 THEN 1 END) AS kha,
COUNT(CASE WHEN score < 50 THEN 1 END) AS yeu
FROM Students;
📘 Kết Luận
CASE WHENlà công cụ cực kỳ linh hoạt và mạnh mẽ trong SQL.- Có thể dùng ở bất kỳ đâu trong truy vấn:
SELECT,WHERE,ORDER BY,GROUP BY,HAVING,UPDATE, … - Giúp hiển thị dữ liệu theo logic tùy chỉnh mà không cần thay đổi dữ liệu trong bảng.
🔍 Wildcard Trong MySQL – Ký Tự Đại Diện Trong Tìm Kiếm
Wildcard – ký tự đại diện trong MySQL, thường dùng trong các biểu thức tìm kiếm kết hợp với LIKE. Đây là một phần không thể thiếu khi bạn cần tìm kiếm dữ liệu linh hoạt, không chính xác tuyệt đối.
✅ 1. Wildcard là gì?
- Wildcard (ký tự đại diện) là các ký hiệu đặc biệt dùng để đại diện cho một hoặc nhiều ký tự trong biểu thức so khớp chuỗi (
LIKE). - Wildcard thường dùng kết hợp với toán tử
LIKE(hoặcNOT LIKE) trong mệnh đềWHERE.
✅ 2. Các Wildcard phổ biến trong MySQL
| Ký tự | Ý nghĩa |
|---|---|
% | Đại diện cho 0 hoặc nhiều ký tự bất kỳ |
_ | Đại diện cho một ký tự đơn bất kỳ |
[] | ❌ Không hỗ trợ trong MySQL (chỉ trong SQL Server) |
[^] | ❌ Không hỗ trợ trong MySQL |
📌 MySQL chỉ hỗ trợ
%và_là hai wildcard chính.
✅ 3. Cú pháp sử dụng LIKE
SELECT * FROM table_name
WHERE column_name LIKE 'pattern';
✅ 4. Ví dụ thực tế
Giả sử bạn có bảng Students(name):
CREATE TABLE Students (
id INT PRIMARY KEY,
name VARCHAR(100)
);
INSERT INTO Students (id, name) VALUES
(1, 'Nam'),
(2, 'Linh'),
(3, 'Thanh'),
(4, 'Lan'),
(5, 'An');
🔸 4.1. Dùng % – đại diện cho chuỗi bất kỳ
SELECT * FROM Students
WHERE name LIKE 'L%';
📌 Tìm tên bắt đầu bằng chữ L (ví dụ: Linh, Lan)
SELECT * FROM Students
WHERE name LIKE '%n';
📌 Tìm tên kết thúc bằng chữ n (ví dụ: Lan, An)
SELECT * FROM Students
WHERE name LIKE '%an%';
📌 Tìm tên chứa chuỗi "an" ở bất kỳ vị trí nào (ví dụ: Thanh, Lan)
🔸 4.2. Dùng _ – đại diện cho đúng 1 ký tự
SELECT * FROM Students
WHERE name LIKE '_an';
📌 Tìm tên có 3 ký tự, trong đó ký tự cuối là an, ví dụ: Lan, An → chỉ Lan khớp vì _an là 3 ký tự.
SELECT * FROM Students
WHERE name LIKE '__n_';
📌 Tên có 4 ký tự, với ký tự thứ 3 là n, ví dụ: Linh
✅ 5. Phân biệt LIKE vs =
| Toán tử | Dùng khi… |
|---|---|
= | So khớp chính xác 100% |
LIKE | So khớp linh hoạt, có thể dùng wildcard |
✅ 6. Kết hợp LIKE với NOT
SELECT * FROM Students
WHERE name NOT LIKE '%n';
📌 Lấy tất cả sinh viên không kết thúc bằng chữ n.
✅ 7. Tìm kiếm không phân biệt hoa thường
MySQL mặc định so sánh LIKE không phân biệt chữ hoa/chữ thường (vì collation thường là utf8_general_ci).
SELECT * FROM Students
WHERE name LIKE 'lan'; -- vẫn khớp với 'Lan'
Nếu bạn dùng collation
utf8_bin, thìLIKEsẽ phân biệt chữ hoa thường.
📘 Kết Luận
- Wildcard giúp tìm kiếm dữ liệu linh hoạt khi không biết chính xác giá trị.
%đại diện cho nhiều ký tự,_đại diện cho 1 ký tự.- Rất hữu ích trong các trường hợp tìm kiếm tên, email, mô tả, v.v.
🔍 Tìm Kiếm Nâng Cao Trong MySQL Với REGEXP
Công cụ tìm kiếm nâng cao hơn LIKE trong MySQL: REGEXP (Regular Expression) – biểu thức chính quy. Đây là một tính năng mạnh mẽ để tìm kiếm linh hoạt, phức tạp trong chuỗi văn bản.
✅ 1. REGEXP là gì?
REGEXP(hoặcRLIKE) là toán tử trong MySQL dùng để so khớp chuỗi với một biểu thức chính quy (regex).- Hữu ích khi bạn cần tìm theo mẫu phức tạp hơn khả năng của
LIKE.
✅ 2. Cú pháp
SELECT * FROM ten_bang
WHERE cot REGEXP 'biểu_thức';
REGEXP: toán tử so khớp'biểu_thức': biểu thức chính quy (regex)
RLIKElà đồng nghĩa vớiREGEXP.
✅ 3. Ví dụ dữ liệu
CREATE TABLE Students (
id INT,
name VARCHAR(50)
);
INSERT INTO Students VALUES
(1, 'Nam'),
(2, 'Linh'),
(3, 'Thanh'),
(4, 'Lan'),
(5, 'An'),
(6, 'Minh'),
(7, 'Tommy');
✅ 4. Các biểu thức thông dụng
| Biểu thức regex | Ý nghĩa | Ví dụ kết quả |
|---|---|---|
'^a' | Bắt đầu bằng a | An |
'n$' | Kết thúc bằng n | Lan, An |
| `’a | i’` | Chứa a hoặc i |
'[abc]' | Chứa một trong các ký tự a, b, hoặc c | Lan |
'^[LM]' | Bắt đầu bằng L hoặc M | Linh, Lan, Minh |
'th' | Chứa chuỗi th | Thanh |
'^.{4}$' | Độ dài đúng 4 ký tự | Linh, Minh |
'[^a]' | Không chứa ký tự a | Minh, Tommy |
✅ 5. Ví dụ thực hành
Tên bắt đầu bằng chữ L hoặc M:
SELECT * FROM Students
WHERE name REGEXP '^[LM]';
Tên chứa an hoặc in:
SELECT * FROM Students
WHERE name REGEXP 'an|in';
Tên có đúng 4 ký tự:
SELECT * FROM Students
WHERE name REGEXP '^.{4}$';
Tên không chứa chữ a:
SELECT * FROM Students
WHERE name NOT REGEXP 'a';
✅ 6. So sánh REGEXP và LIKE
| Tính năng | LIKE | REGEXP |
|---|---|---|
| Đơn giản, dễ dùng | ✅ | ❌ (khó hơn nếu mới học) |
| Linh hoạt phức tạp | ❌ | ✅ (so khớp nhiều điều kiện) |
| Hỗ trợ ký tự đặc biệt | % (nhiều), _ (1 ký tự) | ^, $, ` |
| Phân biệt hoa/thường | ❌ (theo collation) | ✅ tùy collation (utf8_bin) |
✅ 7. Một số ký hiệu phổ biến trong REGEXP
| Ký hiệu | Ý nghĩa |
|---|---|
. | Bất kỳ 1 ký tự |
* | Lặp 0 hoặc nhiều lần |
+ | Lặp ít nhất 1 lần |
^ | Bắt đầu chuỗi |
$ | Kết thúc chuỗi |
[] | Một ký tự thuộc tập cho trước |
| ` | ` |
{n} | Xuất hiện đúng n lần |
{n,m} | Xuất hiện từ n đến m lần |
📌 MySQL chỉ hỗ trợ biểu thức chính quy đơn giản (POSIX-style), không hỗ trợ đầy đủ regex nâng cao như trong Python hoặc PCRE.
📘 Kết Luận
REGEXPrất mạnh trong việc tìm kiếm chuỗi theo mẫu phức tạp.- Nếu
LIKEquá hạn chế cho bạn (ví dụ tìm chuỗi nhiều điều kiện, kiểm tra định dạng…), hãy dùngREGEXP. - Để tối ưu hiệu suất, tránh lạm dụng
REGEXPtrên các bảng lớn mà không có chỉ mục (INDEX).





