Câu lệnh UPDATE trong SQL là một công cụ mạnh mẽ và cần thiết khi làm việc với cơ sở dữ liệu, giúp bạn cập nhật dữ liệu nhanh chóng và chính xác. Từ việc thay đổi thông tin cá nhân, cập nhật giá sản phẩm, đến xử lý trạng thái đơn hàng, lệnh UPDATE mang lại sự linh hoạt và hiệu quả trong việc quản lý dữ liệu.

Đọc bài viết này để hiểu rõ hơn về:

  • Các thành phần và cách hoạt động của câu lệnh UPDATE trong SQL
  • Cú pháp và ví dụ cụ thể

Tổng quan về câu lệnh UPDATE trong SQL

Lệnh UPDATE trong SQL là một công cụ mạnh mẽ để duy trì và quản lý tính chính xác, nhất quán của dữ liệu trong cơ sở dữ liệu. Với lệnh này, bạn có thể cập nhật một hoặc nhiều bản ghi trong bảng một cách dễ dàng, bằng cách chỉ định các điều kiện cụ thể (thông qua mệnh đề WHERE).

Lệnh UPDATE thường được sử dụng trong các tình huống cần chỉnh sửa dữ liệu của một bản ghi trong bảng, ví dụ như cập nhật trạng thái đơn hàng, sửa đổi thông tin cá nhân hoặc điều chỉnh số lượng tồn kho. 

Các thành phần của câu lệnh UPDATE trong SQL

Cú pháp tổng quát:

UPDATE table_name

SET column1 = value1, column2 = value2, ...

WHERE condition;

Trong đó:

  • UPDATE table_name: Xác định tên bảng mà bạn muốn cập nhật dữ liệu.
  • SET column1 = value1, column2 = value2, …: Chỉ định cột cần cập nhật và giá trị mới tương ứng. Bạn có thể cập nhật một hoặc nhiều cột cùng lúc.
  • WHERE condition: Điều kiện xác định bản ghi nào sẽ được cập nhật. Nếu không có mệnh đề WHERE, tất cả các bản ghi trong bảng sẽ bị cập nhật (cẩn thận khi sử dụng).
  • Giá trị (value): Có thể là hằng số, giá trị từ một cột khác, hoặc kết quả của biểu thức hay truy vấn con.

Câu lệnh UPDATE trong SQL hoạt động như thế nào?

Khi thực thi một câu lệnh UPDATE, SQL Server hoặc hệ quản trị cơ sở dữ liệu khác thực hiện các bước sau:

  1. Xác định bảng mục tiêu: Hệ thống xác định bảng được chỉ định trong lệnh UPDATE.
  2. Áp dụng điều kiện WHERE: Hệ thống lọc các bản ghi thỏa mãn điều kiện được cung cấp trong mệnh đề WHERE. Nếu không có mệnh đề WHERE, tất cả các bản ghi trong bảng sẽ được chọn để cập nhật.
  3. Cập nhật cột được chỉ định: Dữ liệu trong các cột chỉ định ở mệnh đề SET sẽ được thay thế bằng giá trị mới.
  4. Ghi dữ liệu mới: Hệ thống ghi lại các thay đổi vào bảng, đồng thời duy trì tính toàn vẹn dữ liệu.
  5. Kiểm tra ràng buộc và chỉ số: Hệ quản trị cơ sở dữ liệu đảm bảo rằng các ràng buộc (constraints) như khóa chính, khóa ngoại và chỉ mục được tuân thủ trong quá trình cập nhật.
  6. Xác nhận thay đổi: Nếu không có lỗi, các thay đổi được áp dụng và SQL sẽ trả về số lượng bản ghi đã được thay đổi; nếu xảy ra lỗi (ví dụ: vi phạm ràng buộc), giao dịch sẽ bị hủy.

Giả sử ta có bảng employees chứa thông tin nhân viên như sau:

employee_id name department salary
1 John Doe HR 50000
5 Jane Smith Finance 60000
8 Alice Johnson IT 55000
10 Bob Brown IT 48000

Ví dụ khi thực thi một câu lệnh UPDATE, SQL Server hoặc hệ quản trị cơ sở dữ liệu khác sẽ thực hiện các bước sau:

UPDATE employees

SET salary = 70000

WHERE employee_id = 10;
  1. Xác định bảng mục tiêu: Trong ví dụ trên, bảng mục tiêu là bảng employees, được xác định tại dòng UPDATE employees
  2. Áp dụng điều kiện WHERE: Trong ví dụ trên, chỉ bản ghi của nhân viên có employee_id = 10 được chọn để cập nhật.
  3. Cập nhật cột được chỉ định: cột salary của nhân viên có employee_id = 10 được cập nhật thành giá trị 70000.
  4. Ghi dữ liệu mới: Bản ghi của nhân viên có employee_id = 10 trong bảng employees được cập nhật với mức lương mới là 70000.
  5. Kiểm tra ràng buộc và chỉ số: Nếu giá trị mới gây xung đột với ràng buộc khóa chính hoặc khóa ngoại, câu lệnh sẽ bị hủy và hệ thống trả về thông báo lỗi.

Các trường hợp sử dụng câu lệnh UPDATE trong SQL

Giả sử ta có một hệ thống quản lý bán hàng gồm các bảng:

Products: Quản lý thông tin sản phẩm (product_id, product_name, price, stock, category).

product_id product_name price stock category
101 Product A 100000 50 Electronics
102 Product B 120000 30 Electronics
103 Product C 150000 20 Household

Orders: Quản lý đơn hàng (order_id, customer_id, status, total_price).

order_id customer_id status total_price
1 201 Pending 8000000
2 202 Pending 15000000
3 203 Pending 5000000

Payments: Thông tin về các giao dịch thanh toán (payment_id, order_id, payment_status).

payment_id order_id payment_status
1 1 Paid
2 2 Pending
3 3 Failed

Cập nhật một cột (Update Single Column)

Ví dụ để cập nhật giá của sản phẩm có product_id = 101 thành 150,000 ta sử dụng cú pháp:

UPDATE Products

SET price = 150000

WHERE product_id = 101;

Với cú pháp trên, bảng Products sẽ trở thành (Giá của Product A thay đổi từ 100000 thành 150000):

product_id product_name price stock category
101 Product A 150000 50 Electronics
102 Product B 120000 30 Electronics
103 Product C 150000 20 Household

Cập nhật nhiều cột (Updating Multiple Columns)

Ví dụ để cập nhật giá sản phẩm product_id = 102 lên 200,000 và giảm số lượng trong kho đi 5 đơn vị, ta sử dụng cú pháp:

UPDATE Products

SET price = 200000, stock = stock - 5

WHERE product_id = 102;

Với cú pháp trên, bảng Products sẽ trở thành (Giá của Product B thay đổi từ 120000 thành 200000 và số lượng trong kho thay đổi từ 30 thành 25):

product_id product_name price stock category
101 Product A 150000 50 Electronics
102 Product B 200000 25 Electronics
103 Product C 150000 20 Household

Bỏ qua mệnh đề WHERE

Trường hợp muốn áp dụng thay đổi cho tất cả các bản ghi trong bảng là thay đổi tất cả các sản phẩm trong bảng Products sang danh mục “Outdated” ta sử dụng cú pháp:

UPDATE Products

SET category = 'Outdated';

Với cú pháp trên, bảng Products sẽ trở thành (Toàn bộ các giá trị trong cột category thay đổi thành “Outdated”):

product_id product_name price stock category
101 Product A 150000 50 Outdated
102 Product B 200000 25 Outdated
103 Product C 150000 20 Outdated

Cập nhật dựa trên giá trị từ một bảng khác

Khi cần đồng bộ dữ liệu giữa các bảng, chẳng hạn cập nhật trạng thái đơn hàng dựa trên bảng khác là cập nhật trạng thái đơn hàng thành “Completed” cho những đơn hàng đã được thanh toán với bảng Payments chứa thông tin về các giao dịch thanh toán và các trạng thái của giao dịch thanh toán như ‘Paid’, ‘Pending’, ‘Failed’, ta sử dụng cú pháp:

UPDATE Orders

SET status = 'Completed'

WHERE order_id IN (

    SELECT order_id FROM Payments WHERE payment_status = 'Paid'

);

Với cú pháp trên, bảng Orders sẽ trở thành (Trạng thái của đơn hàng có order_id = 1 thay đổi từ “Pending” thành “Completed”):

order_id customer_id status total_price
1 201 Completed 8000000
2 202 Pending 15000000
3 203 Pending 5000000

Cập nhật dựa trên biểu thức

Ta có thể dùng UPDATE thay đổi giá trị dựa trên tính toán hoặc điều kiện như để tăng giá của tất cả các sản phẩm thuộc danh mục “Electronics” lên 10%, ta sử dụng cú pháp:

UPDATE Products

SET price = price * 1.1

WHERE category = 'Electronics';

Với cú pháp trên, bảng Products sẽ trở thành (Giá của Product A và Product B thay đổi lần lượt từ 150000 thành 165000 và từ 200000 thành 220000):

product_id product_name price stock category
101 Product A 165000 50 Outdated
102 Product B 220000 25 Outdated
103 Product C 150000 20 Outdated

Cập nhật dữ liệu sử dụng CASE

Khi cần cập nhật dữ liệu theo nhiều điều kiện khác nhau, ta có thể sử dụng câu lệnh CASE. Ví dụ để thay đổi trạng thái đơn hàng dựa trên tổng giá trị (total_price), nếu giá trị trên 10 triệu thì trạng thái là “High Value”, dưới 10 triệu là “Regular”, ta sử dụng cú pháp:

UPDATE Orders

SET status = CASE

                WHEN total_price > 10000000 THEN 'High Value'

                ELSE 'Regular'

             END;

Với cú pháp trên, bảng Orders sẽ thay đổi như sau:

  • Đơn hàng order_id = 1order_id = 3 thành “Regular”.
  • Đơn hàng order_id = 2 thành “High Value”.
order_id customer_id status total_price
1 201 Regular 8000000
2 202 High Value 15000000
3 203 Regular 5000000

Một số lưu ý khi sử dụng câu lệnh UPDATE trong SQL

  1. Kiểm tra phạm vi ảnh hưởng bằng lệnh SELECT trước khi UPDATE: Trước khi thực thi lệnh UPDATE, bạn nên sử dụng lệnh SELECT với điều kiện WHERE tương tự để kiểm tra các bản ghi sẽ bị ảnh hưởng. Điều này giúp đảm bảo rằng chỉ những dữ liệu cần thay đổi mới được cập nhật.
  2. Luôn sử dụng mệnh đề WHERE khi cần giới hạn bản ghi: Nếu bạn bỏ qua mệnh đề WHERE, toàn bộ các bản ghi trong bảng sẽ bị cập nhật, điều này có thể gây ra hậu quả không mong muốn.
  3. Sao lưu dữ liệu trước khi thực thi lệnh UPDATE quan trọng: Đối với các hệ thống lớn, dữ liệu rất quan trọng và khó khôi phục nếu xảy ra lỗi. Trước khi thực hiện lệnh UPDATE có ảnh hưởng rộng, hãy sao lưu cơ sở dữ liệu hoặc bảng dữ liệu.
  4. Cẩn thận với các cột có ràng buộc (Constraints): Nếu bảng có các ràng buộc như NOT NULL, UNIQUE, FOREIGN KEY, thì việc cập nhật dữ liệu không hợp lệ có thể gây lỗi. Bạn nên kiểm tra kỹ các ràng buộc này trước khi thực thi lệnh.

Câu hỏi thường gặp về câu lệnh UPDATE trong SQL

Làm thế nào để cập nhật nhiều bản ghi cùng lúc?

Ta có thể cập nhật nhiều bản ghi bằng cách sử dụng mệnh đề WHERE để chỉ định các bản ghi cần thay đổi.

Giả sử ta có bảng employees:

employee_id name department salary
1 John Doe Sales 50000
2 Jane Smith Sales 60000
3 Alice Johnson IT 70000
4 Bob Brown HR 55000

Ví dụ để tăng 10% lương cho tất cả nhân viên thuộc phòng ban “Sales” ta sử dụng cú pháp:

UPDATE Employees

SET salary = salary * 1.1

WHERE department = 'Sales';

Bảng employees sẽ trở thành:

employee_id name department salary
1 John Doe Sales 55000
2 Jane Smith Sales 66000
3 Alice Johnson IT 70000
4 Bob Brown HR 55000

Nếu bỏ mệnh đề WHERE, tất cả bản ghi trong bảng Employees sẽ bị cập nhật:

UPDATE Employees

SET salary = salary * 1.1;

Bảng employees sẽ trở thành:

employee_id name department salary
1 John Doe Sales 60500
2 Jane Smith Sales 72600
3 Alice Johnson IT 77000
4 Bob Brown HR 60500

Tuy nhiên, nếu bạn muốn áp dụng lệnh UPDATE lên tất cả các bản ghi trong bảng, bạn không cần sử dụng WHERE.

Làm thế nào để cập nhật dữ liệu từ một bảng khác?

Ta có thể sử dụng câu lệnh UPDATE kết hợp với truy vấn con (subquery) hoặc sử dụng JOIN để cập nhật dữ liệu từ một bảng khác. Tùy vào hệ quản trị cơ sở dữ liệu (DBMS), cú pháp có thể khác nhau như PostgreSQL và SQL Server có hỗ trợ FROM trong lệnh Update, tuy nhiên MySQL lại không hỗ trợ, mà sẽ sử dụng JOIN trực tiếp..

Ví dụ sử dụng subquery: để cập nhật giá của các sản phẩm thuộc danh mục “Electronics” dựa trên giá trung bình trong bảng Sales ta sử dụng cú pháp:

UPDATE Products

SET price = (SELECT AVG(price) FROM Sales WHERE Sales.product_id = Products.product_id)

WHERE category = 'Electronics';

Ví dụ sử dụng JOIN: để cập nhật giá sản phẩm trong bảng Products dựa trên giá mới từ bảng Sales ta sử dụng cú pháp:

UPDATE Products

SET Products.price = Sales.new_price

FROM Products

JOIN Sales ON Products.product_id = Sales.product_id

WHERE Sales.new_price IS NOT NULL;

Trong đó:

  • Mệnh đề WHERE Sales.new_price IS NOT NULL được sử dụng để đảm bảo chỉ cập nhật giá (price) cho các sản phẩm mà giá mới (new_price) trong bảng Sales không phải là NULL, giúp tránh việc cập nhật giá thành giá trị NULL trong bảng Products, duy trì tính chính xác và hợp lệ của dữ liệu.

Có thể undo câu lệnh UPDATE không?

SQL không có chức năng “undo” tự động cho câu lệnh UPDATE. Để khôi phục dữ liệu, bạn có thể:

  1. Sử dụng Transaction: Nếu bạn bắt đầu một giao dịch (BEGIN TRANSACTION), bạn có thể hủy thay đổi bằng cách sử dụng ROLLBACK trước khi giao dịch được xác nhận (COMMIT).
  2. Khôi phục từ bản sao lưu: Nếu dữ liệu đã được cập nhật và giao dịch đã hoàn thành, bạn chỉ có thể khôi phục dữ liệu từ bản sao lưu nếu có.
  3. Sử dụng bảng lưu trữ (Audit Table): Nếu hệ thống của bạn có bảng lưu trữ hoặc lịch sử, bạn có thể sử dụng dữ liệu từ bảng đó để khôi phục dữ liệu về trạng thái cũ.

Ngoài ra, bạn có thể tìm hiểu thêm về Transaction trong database: Các thao tác cơ bản với transaction.

Tổng kết câu lệnh UPDATE trong SQL

Câu lệnh UPDATE trong SQL là một phần không thể thiếu trong quản lý dữ liệu, cung cấp khả năng chỉnh sửa thông tin một cách linh hoạt và mạnh mẽ. Dù bạn cần cập nhật một cột, nhiều cột, hay thay đổi dựa trên điều kiện phức tạp, hiểu rõ cách sử dụng lệnh UPDATE sẽ giúp bạn làm việc hiệu quả hơn với cơ sở dữ liệu.

ITviec hy vọng bài viết trên đã cung cấp cho bạn cái nhìn tổng quan và giúp bạn tận dụng được lệnh UPDATE.