Câu 1Câu nào mô tả đúng SELECT * FROM staff WHERE salary BETWEEN 5000000 AND 6000000;?
WHERE đào sâu ② — BETWEEN và LIKE cho lọc theo phạm vi và mẫu
Bài thứ hai trong loạt đào sâu WHERE. Bao gồm phạm vi với BETWEEN, NOT BETWEEN, và khớp tiền tố / hậu tố / chứa với LIKE — kết hợp với ORDER BY / LIMIT, tất cả chạy trên tập dữ liệu staff nạp từ CSV.
Dữ liệu sẽ dùng — bảng staff
Bài thứ 2 của loạt đào sâu WHERE đề cập lọc theo phạm vi (BETWEEN) và khớp mẫu (LIKE). Khi kết hợp các điều kiện ghép đã dựng bằng AND / OR / NOT ở bài trước với BETWEEN / LIKE của bài này, bạn có thể diễn đạt phần lớn các yêu cầu lọc thường gặp trong thực tế.
BETWEEN — lọc theo phạm vi giá trị
Khi bạn muốn kiểm tra liệu một giá trị có nằm trong một phạm vi — "lương giữa 5.000.000 và 6.000.000," "sinh nhật giữa Tháng 4 2020 và Tháng 3 2025" — BETWEEN là toán tử.
Viết column BETWEEN value1 AND value2 trả về các hàng mà cột ít nhất là value1 và nhiều nhất là value2. Lưu ý rằng cả hai đầu mút đều được bao gồm. Nó nghĩa giống như column >= value1 AND column <= value2; mọi người chọn BETWEEN thường chỉ vì khả năng đọc.
Thêm NOT BETWEEN trả về các hàng ngoài phạm vi (nhỏ hơn value1 hoặc lớn hơn value2).
-- Staff có lương giữa 5.000.000 và 6.000.000 (bao gồm các đầu mút)
SELECT name, salary FROM staff
WHERE salary BETWEEN 5000000 AND 6000000;
-- Cùng nghĩa, viết với >= và <= nối bằng AND
SELECT name, salary FROM staff
WHERE salary >= 5000000 AND salary <= 6000000;
-- Ngoài phạm vi (dưới 5.000.000 HOẶC trên 6.000.000)
SELECT name, salary FROM staff
WHERE salary NOT BETWEEN 5000000 AND 6000000;
BETWEEN bao gồm cả hai đầu mút
BETWEEN 5000000 AND 6000000 bao gồm đúng 5.000.000 và đúng 6.000.000. Nếu bạn muốn loại trừ các đầu mút, viết > 5000000 AND < 6000000.
Với ngày tháng, bạn có thể viết BETWEEN '2020-04-01' AND '2025-03-31' — các literal được so sánh như chuỗi. Để bao gồm "toàn bộ Tháng 3 2025," định nghĩa cả hai đầu mút bằng ngày cuối tháng thực tế là cách an toàn. BETWEEN '2020-04-01' AND '2025-04-01' cũng sẽ bao gồm cả `2025-04-01`, thường không phải điều bạn muốn.
LIKE — lọc theo khớp mẫu
Khi bạn muốn lọc theo một mẫu chuỗi — "các tên kết thúc bằng Tanaka," "các email chứa @example.com" — LIKE là toán tử. Viết column LIKE 'pattern'. Bên trong mẫu bạn có thể dùng hai wildcard sau.
| Wildcard | Ý nghĩa |
|---|---|
% | Khớp chuỗi bất kỳ gồm không hoặc nhiều ký tự ("bất cứ thứ gì độ dài bất kỳ") |
_ | Khớp chính xác một ký tự ("ký tự đơn bất kỳ tại vị trí này") |
'A%' là bắt đầu với A, '%a' là kết thúc với a, '%a%' là chứa a, 'A___%' là bắt đầu với A và có ít nhất ba ký tự nữa — kết hợp chúng theo nhu cầu. Thêm NOT LIKE trả về các hàng không khớp mẫu.
-- 1) Khớp tiền tố: name bắt đầu với A
SELECT name FROM staff WHERE name LIKE 'A%';
-- 2) Khớp hậu tố: họ Tanaka
SELECT name FROM staff WHERE name LIKE '%Tanaka';
-- 3) Chứa: name chứa 'a' ở bất cứ đâu
SELECT name FROM staff WHERE name LIKE '%a%';
-- 4) Một ký tự: ký tự thứ 2 là 'a', phần còn lại bất kỳ
SELECT name FROM staff WHERE name LIKE '_a%';
-- 5) Phủ định: không kết thúc với Tanaka
SELECT name FROM staff WHERE name NOT LIKE '%Tanaka';
% nghĩa là "độ dài bất kỳ của bất cứ thứ gì"; _ nghĩa là "chính xác một ký tự." Kết hợp vị trí của chúng diễn đạt tiền tố / hậu tố / chứa trong ba mẫu. Các đường nét đứt nối mỗi mẫu với các ví dụ khớp và mô tả ngôn ngữ thường.LIKE và `=` tuân theo quy tắc phân biệt hoa thường khác nhau
Trong console của khóa học này (SQLite), trong phạm vi ASCII, LIKE không phân biệt hoa thường. name LIKE '%a%' và name LIKE '%A%' trả về cùng các hàng. Để làm cho nó phân biệt hoa thường, chạy PRAGMA case_sensitive_like = 1; hoặc chuẩn hóa cả hai vế bằng LOWER(...).
Trong khi đó, so sánh chuỗi với `=` (đề cập trong bài SELECT) phân biệt hoa thường — chú ý sự khác biệt hành vi giữa = và LIKE.
Tìm kiếm `%` hoặc `_` theo nghĩa đen — mệnh đề `ESCAPE`
Nếu chuỗi bạn đang tìm thực sự chứa một ký tự nghĩa đen % hoặc _ (chẳng hạn, một mã sản phẩm như 'A_001'), thì mặc định _ sẽ được hiểu là wildcard. Mệnh đề ESCAPE cho phép bạn chỉ định một ký tự escape, sau đó % / _ được coi là ký tự nghĩa đen.
Ví dụ: WHERE code LIKE 'A\_001' ESCAPE '\'; (khai báo \ là ký tự escape, nên \_ được coi là dấu gạch dưới nghĩa đen). Ký tự escape không nhất thiết là \ — ESCAPE '#' làm # là escape, ESCAPE '!' làm nó là !, v.v. Bạn sẽ dùng đến cái này khi tìm kiếm các cột mã chứa _ hoặc %.
Kết hợp WHERE, ORDER BY, và LIMIT
Truy vấn thực tế thường kết hợp lọc (WHERE) → sắp xếp (ORDER BY) → giới hạn hàng (LIMIT) theo đúng thứ tự đó. Thứ tự mệnh đề là cố định, và đảo chúng là lỗi cú pháp.
Thứ tự thực thi của DB đại khái là FROM → WHERE → SELECT → ORDER BY → LIMIT — đầu tiên thu hẹp các hàng, chọn các cột bạn cần, sắp chúng, rồi cắt số lượng bạn muốn.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Tên nào khớp mẫu name LIKE '%Tanaka'?
Câu 3Truy vấn nào sau đây có các mệnh đề theo đúng thứ tự?