Câu 1Câu nào mô tả đúng vai trò của SET và WHERE trong câu lệnh UPDATE?
UPDATE và DELETE — Cập nhật và xóa hàng
Học SQL UPDATE và DELETE từ cơ bản. Bao gồm cập nhật nhiều cột với SET, xóa thu hẹp với WHERE, và điều gì xảy ra khi bạn quên WHERE — tất cả chạy trực tiếp trên trình duyệt của bạn.
UPDATE — viết lại các hàng hiện có
INSERT là để "thêm hàng mới." UPDATE là thao tác để viết lại các giá trị của hàng đã tồn tại. Thay đổi trạng thái thành viên, sửa giá sản phẩm, cập nhật số lần mua — UPDATE là phần của hoạt động hằng ngày trong bất kỳ ứng dụng chính thức nào.
Dạng cơ bản là UPDATE table_name SET col = val WHERE condition;. SET nói "cột nào nhận giá trị nào," và WHERE nói "hàng nào bị ảnh hưởng."
-- Viết lại status của customer nơi id = 1 thành 'active'
UPDATE customer SET status = 'active' WHERE id = 1;
-- Kiểm tra kết quả
SELECT * FROM customer;
UPDATE table_name là bảng đích, SET col = val là thay đổi, và WHERE condition thu hẹp xuống các hàng nào. Hãy nắm vị trí và vai trò của từng phần.Quên WHERE cập nhật mọi hàng
Bỏ WHERE khỏi UPDATE customer SET status = 'active' WHERE id = 1; (trở thành UPDATE customer SET status = 'active';) và mọi hàng của customer có status của nó được viết lại thành 'active'. Không có lỗi, đó chính là điều khiến đây là cách dễ làm hỏng dữ liệu production một cách âm thầm.
Cập nhật nhiều cột cùng lúc
Bằng cách liệt kê các cặp `col = val` ngăn cách bằng dấu phẩy trong mệnh đề SET, bạn có thể cập nhật nhiều cột cùng lúc: SET col1 = val1, col2 = val2, ....
Vế phải cũng có thể là một biểu thức bao gồm chính cột đó. SET price = price + 100 nghĩa là "viết lại price của hàng đích thành price hiện tại cộng 100."
col = val đơn hoặc nhiều cặp ngăn cách bằng dấu phẩy, và vế phải cũng có thể là một biểu thức.-- Cập nhật nhiều cột thành giá trị tuyệt đối cùng lúc
UPDATE inventory SET price = 200, stock = 100 WHERE id = 2;
-- Cập nhật bằng biểu thức (tham chiếu giá trị hiện có)
UPDATE inventory SET price = price + 100, stock = stock - 10 WHERE id = 2;
DELETE — xóa hàng
DELETE là thao tác để xóa hàng khỏi bảng. Dạng cơ bản là DELETE FROM table_name WHERE condition;, với WHERE thu hẹp xuống các hàng đích. Khác với SELECT, không có danh sách cột (SELECT col1, col2) — DELETE xóa toàn bộ hàng.
Định nghĩa bảng (cấu trúc cột) vẫn còn, nên bạn có thể INSERT vào cùng bảng sau khi xóa. Để xóa chính bảng, dùng DROP TABLE / TRUNCATE (đề cập trong bài tiếp theo).
DELETE FROM table_name là bảng đích; WHERE condition quyết định hàng nào để xóa. Không có tương đương với danh sách cột của SELECT hay mệnh đề SET của UPDATE trong DELETE.-- Xóa tất cả các đăng ký đã hết hạn (status = 'expired')
DELETE FROM subscription WHERE status = 'expired';
-- Kiểm tra kết quả (chỉ các hàng còn sống)
SELECT * FROM subscription;
Coi chừng quên WHERE — bẫy cập nhật/xóa mọi hàng
Quên WHERE là tai nạn phổ biến nhất với UPDATE và DELETE. Không có WHERE, cú pháp vẫn hợp lệ — và đích mở rộng đến mọi hàng trong bảng. UPDATE table SET col = val; viết lại mọi hàng thành cùng giá trị; DELETE FROM table; làm trống bảng.
Ngay cả khi bạn nhận ra ngay, bạn không thể hoàn tác sau khi thay đổi đã commit. Quy tắc vận hành cơ bản trong production là luôn chạy cùng WHERE như một `SELECT` trước để xác nhận trực quan các hàng đích trước khi viết lại.
Trong production, xác nhận hàng đích bằng SELECT trước
Đối với UPDATE / DELETE trên cơ sở dữ liệu production, chạy cùng WHERE như một SELECT trước và xác nhận trực quan các hàng đích đúng như mong đợi trước khi chuyển sang viết lại. Quy trình hai bước:
1. Chạy SELECT * FROM table_name WHERE condition; để xác nhận hàng đích (số hàng và giá trị có khớp những gì bạn mong đợi không?)
2. Nếu mọi thứ đúng, chuyển cùng WHERE sang UPDATE table_name SET col = val WHERE condition; hoặc DELETE FROM table_name WHERE condition; và thực thi
Vì mệnh đề WHERE được dùng lại qua sao chép-dán, điều này cũng giảm loại tai nạn nơi WHERE bị bỏ vô tình trong khi viết lại.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Cách đúng để cập nhật cả name và email cho hàng trong customer nơi id = 1 cùng lúc là gì?
Câu 3Điều gì xảy ra khi bạn chạy DELETE FROM product; không có WHERE?