

Đ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 WHEN
cho 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 BY
phân nhóm theo điều kiệnHAVING
lọ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 WHEN
là 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ìLIKE
sẽ 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)
RLIKE
là đồ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
REGEXP
rất mạnh trong việc tìm kiếm chuỗi theo mẫu phức tạp.- Nếu
LIKE
quá 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
REGEXP
trên các bảng lớn mà không có chỉ mục (INDEX
).