CodeGym /Các khóa học /SQL SELF /Sử dụng WHERE khi cập nhật và xóa dữ liệu

Sử dụng WHERE khi cập nhật và xóa dữ liệu

SQL SELF
Mức độ , Bài học
Có sẵn

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, ORNOT.

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

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 WHERE là mọi dòng đều bị ảnh hưởng.
  • Điều kiện sai: ví dụ viết age = 19 thay vì age < 19, sẽ ảnh hưởng nhầm dữ liệu.
  • Điều kiện phức tạp: ưu tiên ANDOR khô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!

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Cập nhật với nhiều điều kiện
Cập nhật với nhiều điều kiện
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Chèn và cập nhật dữ liệu
Chèn và cập nhật dữ liệu
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION