Hãy tưởng tượng bạn là admin database và cần sửa hoặc xóa bản ghi. Nhưng nếu lỡ tay cập nhật hoặc xóa tất cả thì sao? Dùng toán tử WHERE chính là "bảo hiểm" của bạn để tránh những lỗi thảm họa. Nó giúp bạn chỉ rõ dòng nào sẽ bị ảnh hưởng khi chạy truy vấn.
Ví dụ:
UPDATE students
SET status = 'Đã tốt nghiệp';
Truy vấn này sẽ cập nhật
toàn bộ các dòng trong bảng
students. Giả sử thay vì chúc mừng tốt nghiệp, bạn lại lỡ gán cho tất cả
status = 'Đã bị đuổi học'. Nguy hiểm nhỉ? Để tránh chuyện này, ta luôn dùng
WHERE để chỉ định
điều kiện xác định dòng nào sẽ được cập nhật hoặc xóa.
Cú pháp điều kiện WHERE
WHERE dùng để lọc các dòng mà toán tử sẽ áp dụng. Có thể dùng trong lệnh UPDATE hoặc DELETE. Cú pháp như sau:
Với UPDATE:
UPDATE bảng
SET column1 = value1, column2 = value2
WHERE điều_kiện;
Với DELETE:
DELETE FROM bảng
WHERE điều_kiện;
Nếu không có WHERE thì mọi dòng trong bảng đều bị ảnh hưởng. Vì vậy, hãy luôn đặt điều kiện để tránh sửa nhầm dữ liệu không mong muốn.
Dùng toán tử so sánh
Để xây dựng điều kiện trong WHERE, ta dùng các toán tử so sánh. Cùng xem qua mấy cái cơ bản nhé:
| Toán tử | Mô tả | Ví dụ |
|---|---|---|
= |
Bằng | age = 18 |
<> |
Không bằng | age <> 18 |
> |
Lớn hơn | age > 18 |
< |
Nhỏ hơn | age < 18 |
>= |
Lớn hơn hoặc bằng | age >= 18 |
<= |
Nhỏ hơn hoặc bằng | age <= 18 |
Ví dụ: cập nhật trạng thái sinh viên
Nếu muốn đánh dấu tất cả sinh viên trên 21 tuổi là "đã tốt nghiệp", làm như sau:
UPDATE students
SET status = 'Đã tốt nghiệp'
WHERE age > 21;
Ví dụ: xóa tất cả sinh viên dưới 18 tuổi
Nếu ai đó lỡ nhập sinh viên chưa đủ tuổi, ta có thể xóa họ:
DELETE FROM students
WHERE age < 18;
Điều kiện phức tạp với toán tử logic
Nhiều khi cần lọc dòng theo nhiều tiêu chí. Ví dụ, chỉ cập nhật sinh viên vừa trên 18 tuổi vừa học khóa lập trình. Ta dùng toán tử logic: AND, OR và NOT.
Toán tử logic:
| Toán tử | Mô tả | Ví dụ |
|---|---|---|
AND |
Thỏa mãn nếu tất cả điều kiện đúng | age > 18 AND course = 'Programming' |
OR |
Thỏa mãn nếu ít nhất một điều kiện đúng | age > 18 OR course = 'Programming' |
NOT |
Phủ định (đảo ngược kết quả điều kiện) | NOT (age < 18) |
Ví dụ: chỉ cập nhật sinh viên lập trình trên 18 tuổi
UPDATE students
SET status = 'Nâng cao'
WHERE age > 18 AND course = 'Programming';
Ví dụ: xóa tất cả sinh viên dưới 18 tuổi hoặc học khóa "Hát"
DELETE FROM students
WHERE age < 18 OR course = 'Singing';
Làm sao tránh lỗi thảm họa
Luôn kiểm tra điều kiện trước khi thực thi!
Nếu bạn viết truy vấn không có WHERE, PostgreSQL sẽ vui vẻ thực hiện cho tất cả dòng trong bảng. Đây là chuyện sẽ xảy ra:
DELETE FROM students;
-- Ôi! Đã xóa hết bản ghi trong bảng students!
Để tránh tình huống này, hãy thêm WHERE:
DELETE FROM students
WHERE student_id = 123;
Mẹo: nếu chưa chắc điều kiện sẽ ảnh hưởng dòng nào, hãy bắt đầu với lệnh SELECT. Ví dụ:
SELECT * FROM students
WHERE student_id = 123;
Khi đã chắc chắn chọn đúng dòng, hãy thực hiện UPDATE hoặc DELETE.
Ví dụ thực tế
Ví dụ 1: Cập nhật trạng thái sinh viên
Giả sử ta có bảng students:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Beginner |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Ta muốn đánh dấu tất cả sinh viên lập trình trên 18 tuổi là "Intermediate":
UPDATE students
SET status = 'Intermediate'
WHERE age > 18 AND course = 'Programming';
Kết quả:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Ví dụ 2: Xóa sinh viên bị đuổi học
Giờ giả sử có sinh viên học các khóa cần xóa. Ví dụ, sinh viên học khóa "Lịch sử nghệ thuật". Bảng:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 4 | Alex Ming | 21 | Lịch sử nghệ thuật | Đã bị đuổi học |
Xóa sinh viên học khóa "Lịch sử nghệ thuật":
DELETE FROM students
WHERE course = 'Lịch sử nghệ thuật';
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
Ví dụ 3: Cập nhật không có điều kiện (và tại sao nó nguy hiểm)
Nếu bạn viết:
UPDATE students
SET status = 'Tốt nghiệp';
TẤT CẢ sinh viên sẽ thành tốt nghiệp. Vì vậy, luôn luôn nên dùng WHERE!
Giả sử ban đầu bảng như sau:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Intermediate |
| 2 | Maria Chi | 22 | Mathematics | Graduated |
| 3 | Eva Gram | 19 | Programming | Beginner |
Sau khi chạy UPDATE không có WHERE:
| student_id | name | age | course | status |
|---|---|---|---|---|
| 1 | Otto Lin | 20 | Programming | Tốt nghiệp |
| 2 | Maria Chi | 22 | Mathematics | Tốt nghiệp |
| 3 | Eva Gram | 19 | Programming | Tốt nghiệp |
😬 Thấy chưa? Tất cả trạng thái bị thay đổi. Lỗi này có thể không khôi phục được, nhất là khi không có backup. Vậy nên WHERE là bạn thân của bạn!
Lưu ý và bẫy thường gặp
Dù WHERE cực kỳ hữu ích, người mới vẫn hay mắc lỗi:
- Thiếu điều kiện: quên
WHERElà mọi dòng đều bị ảnh hưởng. - Điều kiện sai: ví dụ viết
age = 19thay vìage < 19, sẽ ảnh hưởng nhầm dữ liệu. - Điều kiện phức tạp: ưu tiên
ANDvàORkhông đúng có thể gây kết quả bất ngờ. Hãy dùng ngoặc cho rõ ràng:DELETE FROM students WHERE (age > 18 AND course = 'Programming') OR course = 'Mathematics';
Hãy viết truy vấn sao cho bạn và đồng đội dễ hiểu nhất có thể.
Giờ thì bạn đã biết cách dùng WHERE để cập nhật và xóa dữ liệu an toàn, chắc chắn rồi nhé. Công cụ này là bạn thân nhất khi làm việc với database. Nhớ: kiểm tra điều kiện kỹ càng còn hơn phải phục hồi dữ liệu sau này!
GO TO FULL VERSION