4.1 Câu lệnh CẬP NHẬT SET
Nếu bạn cần thay đổi các bản ghi hiện có trong bảng, thì đối với điều này, chúng tôi sử dụng toán tử UPDATE
.
Một mặt, toán tử UPDATE
tương tự như toán tử INSERT
, vì chúng ta cần chỉ định giá trị mới cho các cột. Và mặt khác, trên toán tử SELECT
, vì nó cho phép bạn làm việc ngay lập tức với các nhóm dữ liệu.
Quan trọng! Mục đích của toán tử UPDATE
là thay đổi dữ liệu không phải trong một hàng của bảng mà trong tất cả các hàng đáp ứng một điều kiện nhất định. Và nếu bạn mắc một lỗi nhỏ, bạn rất dễ bị mất toàn bộ dữ liệu trong bảng.
Tổng quan về yêu cầu:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
Hãy viết một truy vấn sẽ tăng lương cho tất cả nhân viên của chúng ta lên 100. Truy vấn của chúng ta sẽ như sau:
UPDATE employee SET
salary = salary+100;
Và bây giờ đối với tất cả những người có mức lương dưới 50K, chúng tôi cũng sẽ tăng 20%. Ví dụ yêu cầu:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
Và tất nhiên, chúng tôi sẽ tăng lương cho giám đốc lên gấp 2 lần, làm sao có thể thiếu anh ấy:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 Các kịch bản sửa đổi dữ liệu phức tạp
Nếu bạn quyết định thay đổi dữ liệu trong nhiều bảng cùng một lúc hoặc khi bạn thay đổi dữ liệu trong một bảng, bạn cần điền dữ liệu từ bảng khác vào bảng đó hoặc đơn giản bằng cách nào đó sử dụng dữ liệu từ bảng khác trong quá trình thay đổi bảng đầu tiên, sau đó những điều bất ngờ đang chờ đón chúng ta.
Hãy thử thay đổi cấp độ của tất cả người dùng trong bảng người dùng tồn tại trong bảng nhân viên. Để đơn giản, chúng tôi sẽ kiểm tra sự trùng hợp của người dùng theo tên.
Chúng tôi muốn viết truy vấn này như thế nào:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
Chà, hãy thêm danh sách tên từ bảng nhân viên vào truy vấn này:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Hấp dẫn! Bản thân câu truy vấn SQL để lấy tên thậm chí còn ngắn hơn cả phần mô tả nhiệm vụ. Những người tạo ra SQL đã không ăn bánh mì của họ một cách vô ích.
Buộc phải làm bạn khó chịu -phương pháp này sẽ không hoạt động. Trước tiên, bạn cần tham gia các bảng này, nó sẽ giống như thế này:
UPDATE table 1, table 2 SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE table 1.id = table 2.ref_id;
Hãy làm cho nó khó khăn hơn một chút. Bạn cần đặt mức 80 chỉ dành cho những nhân viên giỏi có mức lương sẽ hơn 50k. Giải pháp hoàn chỉnh sẽ như thế này:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
Việc nối các bảng như vậy thực sự là INNER JOIN
, do đó cuối cùng chỉ những người dùng có tên trùng khớp trong bảng thứ hai mới được ở lại.
Nhưng bằng cách nào đó chúng ta vẫn cần chọn những nhân viên giỏi, vì vậy hãy thêm một số mã nữa:
SELECT * FROM employee WHERE salary >= 50000
Và bây giờ chúng tôi thay thế bảng này trong truy vấn cuối cùng của chúng tôi:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Sống với nó bây giờ.