Trong bài này
Câu lạc bộ mở buổi ôn tập dành riêng cho khối 7. Gửi lời mời cho mọi học viên sẽ khiến những bạn khác khối nhận thông báo không phù hợp. Cô Mai cần danh sách đúng người, rồi mới lấy tên để gửi lời mời. Chọn bớt cột chưa giải quyết được việc chọn người này.
Dùng điều kiện để chọn từng dòng
Bạn cần giữ người khối 7, không phải giữ cột thứ bảy. Điều kiện (condition) là một phép kiểm tra, chẳng hạn khối lớp có bằng 7 không. Mệnh đề WHERE giữ những dòng mà phép kiểm tra cho kết quả đúng.
Hãy nhìn cột grade của từng người rồi đối chiếu kết quả truy vấn:
Dữ liệu đầu vào
studentsgiữ 2/6 dòng| id | name | grade |
|---|---|---|
| 1 | An | 6 |
| 2 | Bình | 7 |
| 3 | Chi | 8 |
| 4 | Dung | 6 |
| 5 | Huy | 9 |
| 6 | Lan | 7 |
Câu lệnh
SELECT id, name, grade
FROM students
WHERE grade = 7;Kết quả
| id | name | grade |
|---|---|---|
| 2 | Bình | 7 |
| 6 | Lan | 7 |
Bình và Lan xuất hiện vì cùng có grade bằng 7. Những dòng khác vẫn nằm trong bảng nguồn, nhưng không vào kết quả lần đọc này. WHERE trong câu SELECT không xóa học viên khỏi dữ liệu.
Bạn không bắt buộc đưa cột dùng để lọc vào danh sách SELECT. Tuy vậy, khi mới viết bộ lọc, hiển thị cả grade giúp kiểm tra lý do từng dòng được giữ. Khi kết quả đúng, bạn có thể chỉ chọn mã và tên theo yêu cầu báo cáo.
studentsCung cấp các dòngWHEREKiểm điều kiện mỗi dòngSELECTLấy cột của dòng được giữ
| Phép so sánh | Nghĩa | Một điều kiện |
|---|---|---|
= | Bằng | grade = 7 |
<> | Khác | grade <> 7 |
> và >= | Lớn hơn và lớn hơn hoặc bằng | coins >= 150 |
< và <= | Nhỏ hơn và nhỏ hơn hoặc bằng | coins < 150 |
Ngưỡng có thể là số hoặc một giá trị chữ phù hợp với cột. Với thành phố, hãy giữ dấu tiếng Việt và bao quanh giá trị bằng nháy đơn. Bạn tìm người ở Hà Nội như sau:
Dữ liệu đầu vào
studentsgiữ 3/6 dòng| id | name | city |
|---|---|---|
| 1 | An | Hà Nội |
| 2 | Bình | Đà Nẵng |
| 3 | Chi | Hà Nội |
| 4 | Dung | Huế |
| 5 | Huy | Cần Thơ |
| 6 | Lan | Hà Nội |
Câu lệnh
SELECT id, name
FROM students
WHERE city = 'Hà Nội';Kết quả
| id | name |
|---|---|
| 1 | An |
| 3 | Chi |
| 6 | Lan |
Kết quả chứa An, Chi và Lan. city dùng để kiểm tra nhưng không trở thành cột đầu ra vì SELECT chỉ chọn mã và tên. Phân biệt hai việc giúp bạn không thêm cột chỉ vì cần lọc theo nó.
Nếu không ai thỏa điều kiện, kết quả có thể không có dòng nào. Đó chưa phải lỗi cú pháp. Khi tìm khối chưa có học viên, một bảng kết quả rỗng có thể là câu trả lời đúng.
Ghép điều kiện theo đúng câu tiếng Việt
Buổi ôn tập có thêm yêu cầu: người khối 7 phải có ít nhất 100 xu. Toán tử lôgic (logical operator) kết hợp các phép kiểm tra thành điều kiện lớn hơn. AND nghĩa là mọi điều kiện nối bằng nó phải cùng đúng.
Bạn kiểm tra cả khối và số xu trên cùng một dòng:
Dữ liệu đầu vào
studentsgiữ 1/6 dòng| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 2 | Bình | 7 | 90 |
| 3 | Chi | 8 | 180 |
| 4 | Dung | 6 | 60 |
| 5 | Huy | 9 | 180 |
| 6 | Lan | 7 | 150 |
Câu lệnh
SELECT id, name, coins
FROM students
WHERE grade = 7 AND coins >= 100;Kết quả
| id | name | coins |
|---|---|---|
| 6 | Lan | 150 |
Kết quả chỉ có Lan với 150 xu. Bình đúng khối nhưng có 90 xu, nên không qua phép kiểm tra thứ hai. Khi đọc AND, hãy thử chỉ ra một dòng đúng vế đầu mà sai vế sau.
Nếu buổi học mở cho khối 7 hoặc người có ít nhất 180 xu, dùng OR. Một vế đúng đã đủ để giữ dòng. Người đúng cả hai vế cũng chỉ góp một dòng từ bảng này:
Dữ liệu đầu vào
studentsgiữ 4/6 dòng| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 2 | Bình | 7 | 90 |
| 3 | Chi | 8 | 180 |
| 4 | Dung | 6 | 60 |
| 5 | Huy | 9 | 180 |
| 6 | Lan | 7 | 150 |
Câu lệnh
SELECT id, name, grade, coins
FROM students
WHERE grade = 7 OR coins >= 180;Kết quả
| id | name | grade | coins |
|---|---|---|---|
| 2 | Bình | 7 | 90 |
| 3 | Chi | 8 | 180 |
| 5 | Huy | 9 | 180 |
| 6 | Lan | 7 | 150 |
Bình được giữ dù chưa đủ 180 xu, còn Chi và Huy được giữ dù không học khối 7. OR không có nghĩa là chỉ được thỏa đúng một vế. Nó cũng không tạo hai bản sao nếu một người thỏa cả hai.
| Nhu cầu | Cách nối |
|---|---|
| Phải đạt cả điều kiện khối và xu | Dùng AND |
| Đạt điều kiện khối hoặc điều kiện xu là đủ | Dùng OR |
| Lấy những dòng không thỏa một điều kiện đã nêu | Dùng NOT trước điều kiện |
Khi trộn AND và OR, ngoặc quyết định nhóm nào cần xét cùng nhau. Giả sử mọi người được chọn đều cần ít nhất 100 xu và thuộc khối 6 hoặc 7. Nếu viết thiếu ngoặc như sau, kết quả sẽ sai:
Dữ liệu đầu vào
students6 dòng| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 2 | Bình | 7 | 90 |
| 3 | Chi | 8 | 180 |
| 4 | Dung | 6 | 60 |
| 5 | Huy | 9 | 180 |
| 6 | Lan | 7 | 150 |
Câu lệnh
SELECT id, name, grade, coins
FROM students
WHERE grade = 6 OR grade = 7 AND coins >= 100;Kết quả
| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 4 | Dung | 6 | 60 |
| 6 | Lan | 7 | 150 |
Dung xuất hiện vì AND được xét trước OR. Câu này cho phép mọi người khối 6, hoặc người khối 7 có đủ xu. Nó không bắt người khối 6 vượt ngưỡng xu.
Bạn đặt hai lựa chọn khối vào ngoặc để điều kiện xu áp dụng cho cả nhóm:
Dữ liệu đầu vào
studentsgiữ 2/6 dòng| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 2 | Bình | 7 | 90 |
| 3 | Chi | 8 | 180 |
| 4 | Dung | 6 | 60 |
| 5 | Huy | 9 | 180 |
| 6 | Lan | 7 | 150 |
Câu lệnh
SELECT id, name, grade, coins
FROM students
WHERE (grade = 6 OR grade = 7) AND coins >= 100;Kết quả
| id | name | grade | coins |
|---|---|---|---|
| 1 | An | 6 | 120 |
| 6 | Lan | 7 | 150 |
Kết quả giữ An và Lan, còn Dung và Bình bị loại vì thiếu xu. Hãy đọc nhóm trong ngoặc thành một ý trước, rồi nối ý đó với ngưỡng. Cách đọc này giúp bạn sửa điều kiện theo nghĩa thay vì đổi toán tử ngẫu nhiên.
NOT đảo điều kiện đúng thành sai và sai thành đúng. Trong ví dụ này, grade của mọi học viên đều có giá trị. Bạn dùng nó để tìm các bạn ngoài khối 7:
Dữ liệu đầu vào
students6 dòng| id | name | grade |
|---|---|---|
| 1 | An | 6 |
| 2 | Bình | 7 |
| 3 | Chi | 8 |
| 4 | Dung | 6 |
| 5 | Huy | 9 |
| 6 | Lan | 7 |
Câu lệnh
SELECT id, name, grade
FROM students
WHERE NOT (grade = 7);Kết quả
| id | name | grade |
|---|---|---|
| 1 | An | 6 |
| 3 | Chi | 8 |
| 4 | Dung | 6 |
| 5 | Huy | 9 |
Bình và Lan không còn trong kết quả. Với cột đã có giá trị như grade, điều kiện này tương đương grade <> 7. Bài 4 sẽ xử lý riêng giá trị chưa biết, khi phép kiểm tra cần thêm quy tắc.
Dùng danh sách và khoảng thay cho điều kiện dài
Nếu cần khối 6 hoặc 9, bạn có thể viết hai phép bằng nối bằng OR. IN giúp kiểm tra một giá trị có thuộc danh sách (list) đã nêu hay không. Các phần tử trong danh sách được ngăn cách bằng dấu phẩy.
Bạn lấy đúng hai khối được mời bằng câu sau:
Dữ liệu đầu vào
studentsgiữ 3/6 dòng| id | name | grade |
|---|---|---|
| 1 | An | 6 |
| 2 | Bình | 7 |
| 3 | Chi | 8 |
| 4 | Dung | 6 |
| 5 | Huy | 9 |
| 6 | Lan | 7 |
Câu lệnh
SELECT id, name, grade
FROM students
WHERE grade IN (6, 9);Kết quả
| id | name | grade |
|---|---|---|
| 1 | An | 6 |
| 4 | Dung | 6 |
| 5 | Huy | 9 |
An và Dung thuộc khối 6, Huy thuộc khối 9. Khối 7 và 8 nằm giữa hai số nhưng không có trong danh sách. Vì thế, IN phù hợp với các lựa chọn rời nhau.
Một khoảng (range) gồm các giá trị từ cận dưới đến cận trên. BETWEEN … AND … nhận cả hai đầu mút. Hãy tìm học viên có từ 90 đến 150 xu, gồm cả đúng 90 và đúng 150:
Dữ liệu đầu vào
studentsgiữ 3/6 dòng| id | name | coins |
|---|---|---|
| 1 | An | 120 |
| 2 | Bình | 90 |
| 3 | Chi | 180 |
| 4 | Dung | 60 |
| 5 | Huy | 180 |
| 6 | Lan | 150 |
Câu lệnh
SELECT id, name, coins
FROM students
WHERE coins BETWEEN 90 AND 150;Kết quả
| id | name | coins |
|---|---|---|
| 1 | An | 120 |
| 2 | Bình | 90 |
| 6 | Lan | 150 |
Bình và Lan cho thấy hai đầu mút đều được giữ. An nằm giữa khoảng nên cũng có mặt. Nếu dùng coins > 90 AND coins < 150, bạn sẽ loại nhầm cả Bình lẫn Lan.
| Cách hỏi | Công cụ phù hợp | Điều cần kiểm |
|---|---|---|
| Chỉ khối 6 và 9 | IN (6, 9) | Không nhận các số ở giữa |
| Từ 90 đến 150 xu | BETWEEN 90 AND 150 | Nhận cả hai đầu |
Chữ AND trong BETWEEN phân cách hai cận của khoảng. Bạn vẫn có thể nối cả phép kiểm tra khoảng với điều kiện khác bằng một AND nữa. Hãy đọc xong toàn bộ khoảng trước khi ghép nó với yêu cầu khối lớp.
Tìm tên theo mẫu chữ
Đôi khi cô Mai chỉ nhớ tên kết thúc bằng n. Mẫu (pattern) mô tả một dạng chữ cần tìm, thay vì một tên đầy đủ. LIKE kiểm tra văn bản có khớp mẫu đó hay không.
Trong mẫu LIKE, % thay cho không ký tự hoặc nhiều ký tự. Bạn tìm tên kết thúc bằng n bằng câu sau:
Dữ liệu đầu vào
studentsgiữ 2/6 dòng| id | name |
|---|---|
| 1 | An |
| 2 | Bình |
| 3 | Chi |
| 4 | Dung |
| 5 | Huy |
| 6 | Lan |
Câu lệnh
SELECT id, name
FROM students
WHERE name LIKE '%n';Kết quả
| id | name |
|---|---|
| 1 | An |
| 6 | Lan |
An và Lan đều có mặt vì cả hai tên kết thúc bằng n. Phần trước n là một ký tự ở An và hai ký tự ở Lan. Dấu % nhận cả hai độ dài, nên mẫu này không giới hạn tên phải có bao nhiêu ký tự.
Dấu _ thay cho đúng một ký tự. Bạn đổi sang mẫu chỉ nhận tên gồm hai ký tự và kết thúc bằng n:
Dữ liệu đầu vào
studentsgiữ 1/6 dòng| id | name |
|---|---|
| 1 | An |
| 2 | Bình |
| 3 | Chi |
| 4 | Dung |
| 5 | Huy |
| 6 | Lan |
Câu lệnh
SELECT id, name
FROM students
WHERE name LIKE '_n';Kết quả
| id | name |
|---|---|
| 1 | An |
Chỉ An được giữ vì chữ A khớp đúng một dấu _. Lan bị loại vì phần trước n có hai ký tự, L và a. Khi cần giới hạn độ dài, hãy dùng _ thay vì %.
Lỗi thường gặp
| Lỗi | Vì sao sai | Cách sửa |
|---|---|---|
Dùng AND cho hai khối khác nhau | Một dòng không thể vừa khối 6 vừa khối 7 | Dùng OR hoặc IN |
Bỏ ngoặc khi trộn AND, OR | Điều kiện chung có thể chỉ áp dụng cho một nhánh | Gom các lựa chọn trong ngoặc |
Dùng > cho yêu cầu ít nhất | Loại giá trị đúng bằng ngưỡng | Dùng >= |
Coi _ giống % | Một ký tự khác với số ký tự tùy ý | Chọn ký hiệu theo độ dài cần khớp |
Tóm tắt
WHEREchọn dòng, cònSELECTchọn cột. Bộ lọc trong truy vấn đọc không xóa nguồn.ANDđòi các vế cùng đúng,ORnhận ít nhất một vế đúng. Dùng ngoặc để nhóm ý.INchọn từ danh sách cụ thể.BETWEENnhận cả hai cận của khoảng.- Với
LIKE,%thay số ký tự tùy ý, còn_thay đúng một ký tự.
Kiểm tra nhanh
Đọc thêm
- SQLite: lọc dòng bằng WHERE — đọc cách giữ những dòng thỏa điều kiện.
- SQLite: các toán tử, IN, BETWEEN và LIKE — tra quy tắc so sánh và mẫu chữ.