với 1 câu lệnh update, kết quả có thể thay đổi được bao nhiêu dòng (hàng) dữ liệu?

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng câu lệnh UPDATE trong SQL Server để thay đổi dữ liệu hiện có trong một bảng.

Để sửa đổi dữ liệu hiện có trong một bảng, bạn sử dụng cú pháp câu lệnh UPDATE như sau:

UPDATE table_name SET c1 = v1, c2 = v2, ... cn = vn [WHERE condition]

Trong cú pháp này:

  • Đầu tiên, chỉ định tên của bảng mà dữ liệu sẽ được cập nhật.
  • Thứ hai, chỉ định danh sách cột c1, c2, ... cn và các giá trị v1, v2, ... vn sẽ được cập nhật.
  • Thứ ba, chỉ định các điều kiện trong mệnh đề WHERE để chọn các bản ghi được cập nhật. Mệnh đề WHERE này là tùy chọn. Nếu bạn bỏ qua mệnh đề WHERE, tất cả các bản ghi trong bảng sẽ được cập nhật.

Đầu tiên, chúng tôi sẽ tạo một bảng mới có tên taxes để minh họa câu lệnh UPDATE trong SQL Server.

CREATE TABLE sales.taxes [ tax_id INT PRIMARY KEY IDENTITY [1, 1], state VARCHAR [50] NOT NULL UNIQUE, state_tax_rate DEC [3, 2], avg_local_tax_rate DEC [3, 2], combined_rate AS state_tax_rate + avg_local_tax_rate, max_local_tax_rate DEC [3, 2], updated_at datetime ];

Thứ hai, thực hiện các câu lệnh sau để INSERT dữ liệu vào bảng taxes:

INSERT INTO sales.taxes [ state, state_tax_rate, avg_local_tax_rate, max_local_tax_rate ] VALUES['Alabama',0.04,0.05,0.07], VALUES['Alaska',0,0.01,0.07], VALUES['Arizona',0.05,0.02,0.05], VALUES['Arkansas',0.06,0.02,0.05], VALUES['California',0.07,0.01,0.02], VALUES['Colorado',0.02,0.04,0.08], VALUES['Connecticut',0.06,0,0], VALUES['Delaware',0,0,0], VALUES['Florida',0.06,0,0.02], VALUES['Georgia',0.04,0.03,0.04], VALUES['Hawaii',0.04,0,0], VALUES['Idaho',0.06,0,0.03], VALUES['Illinois',0.06,0.02,0.04], VALUES['Indiana',0.07,0,0], VALUES['Iowa',0.06,0,0.01], VALUES['Kansas',0.06,0.02,0.04], VALUES['Kentucky',0.06,0,0], VALUES['Louisiana',0.05,0.04,0.07], VALUES['Maine',0.05,0,0], VALUES['Maryland',0.06,0,0], VALUES['Massachusetts',0.06,0,0], VALUES['Michigan',0.06,0,0], VALUES['Minnesota',0.06,0,0.01], VALUES['Mississippi',0.07,0,0.01], VALUES['Missouri',0.04,0.03,0.05], VALUES['Montana',0,0,0], VALUES['Nebraska',0.05,0.01,0.02], VALUES['Nevada',0.06,0.01,0.01], VALUES['New Hampshire',0,0,0], VALUES['New Jersey',0.06,0,0], VALUES['New Mexico',0.05,0.02,0.03], VALUES['New York',0.04,0.04,0.04], VALUES['North Carolina',0.04,0.02,0.02], VALUES['North Dakota',0.05,0.01,0.03], VALUES['Ohio',0.05,0.01,0.02], VALUES['Oklahoma',0.04,0.04,0.06], VALUES['Oregon',0,0,0], VALUES['Pennsylvania',0.06,0,0.02], VALUES['Rhode Island',0.07,0,0], VALUES['South Carolina',0.06,0.01,0.02], VALUES['South Dakota',0.04,0.01,0.04], VALUES['Tennessee',0.07,0.02,0.02], VALUES['Texas',0.06,0.01,0.02], VALUES['Utah',0.05,0,0.02], VALUES['Vermont',0.06,0,0.01], VALUES['Virginia',0.05,0,0], VALUES['Washington',0.06,0.02,0.03], VALUES['West Virginia',0.06,0,0.01], VALUES['Wisconsin',0.05,0,0.01], VALUES['Wyoming',0.04,0.01,0.02], VALUES['D.C.',0.05,0,0];

Cập nhật một cột trong tất cả các bản ghi

Câu lệnh sau đây cập nhật một cột duy nhất cho tất cả các bản ghi trong bảng taxes:

UPDATE sales.taxes SET updated_at = GETDATE[];

Trong ví dụ này, câu lệnh đã thay đổi các giá trị trong cột updated_at thành thời gian ngày hệ thống được trả về bởi hàm GETDATE[].

SQL Server đã đưa ra thông báo sau:

[51 rows affected]

Nó có nghĩa là 51 bản ghi đã được cập nhật thành công.

Hãy xác minh cập nhật trên như sau:

SELECT * FROM sales.taxes;

Đây là đầu ra một phần:

Như bạn có thể thấy kết quả đầu ra, cột updated_at đã được cập nhật với giá trị ngày hiện tại.

Cập nhật nhiều cột

Câu lệnh sau đây làm tăng mức thuế suất địa phương tối đa thêm 2% và mức thuế suất địa phương trung bình thêm 1% đối với các tiểu bang có mức thuế suất địa phương tối đa 1%.

UPDATE sales.taxes SET max_local_tax_rate += 0.02, avg_local_tax_rate += 0.01 WHERE max_local_tax_rate = 0.01;

Đây là thông báo được trả về bởi SQL Server:

[7 rows affected]

Nó có nghĩa là thuế của 7 tiểu bang đã được cập nhật.

Trong phần này, bạn sẽ tìm hiểu cách sử dụng câu lệnh UPDATE JOIN trong SQL Server để thực hiện cập nhật một bảng dựa trên các giá trị từ một bảng khác bằng mệnh đề JOIN.

Để truy vấn dữ liệu từ các bảng có liên quan, bạn thường sử dụng các mệnh đề JOIN, INNER JOIN hoặc LEFT JOIN. Trong SQL Server, bạn có thể sử dụng các mệnh đề JOIN trong câu lệnh UPDATE để thực hiện cập nhật một bảng dựa trên các giá trị từ một bảng khác.

Sau đây minh họa cú pháp của mệnh đề UPDATE JOIN:

UPDATE t1 SET t1.c1 = t2.c2, t1.c2 = expression, ... FROM t1 [INNER | LEFT] JOIN t2 ON join_predicate WHERE where_predicate;

Trong cú pháp này:

  • Đầu tiên, chỉ định tên của bảng [t1] mà bạn muốn cập nhật trong mệnh đề UPDATE.
  • Thứ hai, chỉ định giá trị mới cho mỗi cột của bảng được cập nhật.
  • Thứ ba, một lần nữa chỉ định bảng mà bạn muốn cập nhật trong mệnh đề FROM.
  • Thứ tư, sử dụng mệnh đề INNER JOIN hoặc LEFT JOIN để join vào một bảng khác [t2] bằng cách sử dụng một biểu thức join được chỉ định sau từ khóa ON.
  • Cuối cùng, thêm một mệnh đề WHERE tùy chọn để chỉ định các bản ghi sẽ được cập nhật.

Chúng ta hãy xem một số ví dụ về việc sử dụng câu lệnh UPDATE JOIN.

Tạo bảng dữ liệu mẫu

Đầu tiên, tạo một bảng mới có tên là sales.targets để lưu trữ các mục tiêu bán hàng:

DROP TABLE IF EXISTS sales.targets; CREATE TABLE sales.targets [ target_id INT PRIMARY KEY, percentage DECIMAL[4, 2] NOT NULL DEFAULT 0 ]; INSERT INTO sales.targets[target_id, percentage] VALUES [1,0.2], [2,0.3], [3,0.5], [4,0.6], [5,0.8];

Nếu nhân viên bán hàng đạt được mục tiêu 1, họ sẽ nhận được tỷ lệ hoa hồng bán hàng 0,2 hoặc 20%, v.v.

Thứ hai, tạo một bảng khác có tên là sales.commissions để lưu trữ hoa hồng bán hàng:

CREATE TABLE sales.commissions [ staff_id INT PRIMARY KEY, target_id INT, base_amount DECIMAL[10, 2] NOT NULL DEFAULT 0, commission DECIMAL[10, 2] NOT NULL DEFAULT 0, FOREIGN KEY[target_id] REFERENCES sales.targets[target_id], FOREIGN KEY[staff_id] REFERENCES sales.staffs[staff_id], ]; INSERT INTO sales.commissions[staff_id, base_amount, target_id] VALUES [1,100000,2], [2,120000,1], [3,80000,3], [4,900000,4], [5,950000,5];

Bảng sales.commissions lưu trữ thông tin định danh nhân viên bán hàng, target_id, base_amount và commission. Bảng này liên kết với bảng sales.targets thông qua cột target_id.

Mục tiêu của chúng tôi là tính toán hoa hồng của tất cả nhân viên bán hàng dựa trên mục tiêu bán hàng của họ.

Ví dụ về UPDATE INNER JOIN trong SQL Server

Câu lệnh sau đây sử dụng UPDATE INNER JOIN để tính hoa hồng bán hàng cho tất cả nhân viên bán hàng:

UPDATE sales.commissions SET sales.commissions.commission = c.base_amount * t.percentage FROM sales.commissions c INNER JOIN sales.targets t ON c.target_id = t.target_id;

Đây là đầu ra:

[5 rows affected]

Nếu bạn truy vấn lại bảng sales.commissions, bạn sẽ thấy các giá trị trong cột hoa hồng được cập nhật:

SELECT * FROM sales.commissions;

Giả sử chúng tôi có thêm hai nhân viên bán hàng mới tham gia và họ chưa có mục tiêu nào:

INSERT INTO sales.commissions[staff_id, base_amount, target_id] VALUES [6,100000,NULL], [7,120000,NULL];

Chúng tôi giả định rằng hoa hồng cho nhân viên bán hàng mới là 0,1 hoặc 10%, chúng tôi có thể cập nhật hoa hồng của tất cả nhân viên bán hàng bằng cách sử dụng UPDATE LEFT JOIN như sau:

UPDATE sales.commissions SET sales.commissions.commission = c.base_amount * COALESCE[t.percentage,0.1] FROM sales.commissions c LEFT JOIN sales.targets t ON c.target_id = t.target_id;

Trong ví dụ này, chúng tôi đã sử dụng COALESCE[] để trả về 0,1 nếu tỷ lệ phần trăm là NULL.

Lưu ý: nếu bạn sử dụng mệnh đề UPDATE INNER JOIN, chỉ năm hàng của bảng có mục tiêu không phải là NULL sẽ được cập nhật.

Hãy xem dữ liệu trong bảng sales.commissions:

SELECT * FROM sales.commissions;

Tập kết quả như sau:

Trong hướng dẫn này, bạn đã học cách sử dụng câu lệnh UPDATE trong SQL Server để sửa đổi dữ liệu hiện có trong một bảng.

Access cho Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Xem thêm...Ít hơn

Nếu truy vấn của bạn hoạt động kém hiệu quả thì việc thêm một số câu lệnh SQL cơ bản có thể giúp các kết quả của bạn đúng trọng tâm hơn. Chúng ta hãy xem một vài loại câu lệnh SQL và các mệnh đề hoặc các phần mà bạn có thể sửa để cho ra kết quả mong muốn.

Lưu ý:  Bài viết này không áp dụng cho các ứng dụng web của Access – loại cơ sở dữ liệu bạn thiết kế bằng Access và phát hành trực tuyến.

Một câu lệnh select của SQL có hai hoặc ba mệnh đề. Mệnh đề SELECT cho biết nơi cơ sở dữ liệu cần tìm dữ liệu để yêu cầu trả về một kết quả cụ thể.

Lưu ý:  Câu lệnh SELECT luôn kết thúc bằng một dấu chấm phẩy [;] nằm ở cuối của mệnh đề cuối cùng hoặc trên một dòng đơn lẻ ở cuối của câu lệnh SQL.

Câu lệnh select sau đây yêu cầu Access lấy thông tin từ các cột Địa chỉ Email và Công ty, từ bảng Liên hệ, cụ thể là nơi nó tìm thấy “Seattle” trong cột Thành phố.

Truy vấn trên đây có ba mệnh đề: SELECT, FROM và WHERE.

1. Mệnh đề SELECT liệt kê các cột có dữ liệu bạn muốn sử dụng và có một toán tử [SELECT] theo sau là hai mã định danh [Địa chỉ Email và Công ty]. Nếu một mã định danh có các khoảng trắng hoặc ký tự đặc biệt [chẳng hạn như "Địa chỉ Email"], hãy đặt mã định danh đó trong ngoặc vuông.

2. Mệnh đề FROM xác định bảng nguồn. Trong ví dụ này, nó có một toán tử [FROM] theo sau là một mã định danh [Liên hệ].

3. Mệnh đề WHERE là một mệnh đề tùy chọn. Ví dụ này có một toán tử [WHERE] theo sau là một biểu thức [Thành phố="Seattle"].

Để biết thêm thông tin về truy vấn chọn, hãy xem mục tạo truy vấn chọn đơn giản.

Sau đây là danh sách các mệnh đề SQL thường gặp:

Mệnh đề SQL

Tính năng của chúng

Bắt buộc ?

CHỌN

Liệt kê tất cả các trường có dữ liệu đáng quan tâm.

TỪ

Liệt kê các bảng có các trường được liệt kê trong mệnh đề SELECT.

VỊ TRÍ

Chỉ rõ các tiêu chí mà trường phải đáp ứng theo từng bản ghi được đưa vào kết quả.

Không

SẮP XẾP THEO

Chỉ rõ cách sắp xếp kết quả.

Không

GROUP BY

Trong một câu lệnh SQL có các hàm tổng hợp, nó liệt kê các trường không được tóm tắt trong mệnh đề SELECT.

Chỉ khi có các trường như

ĐANG CÓ

Trong một câu lệnh SQL có các hàm tổng hợp, nó chỉ rõ các điều kiện áp dụng cho các trường được tóm tắt trong câu lệnh SELECT.

Không

Mỗi mệnh đề SQL được hình thành từ các thuật ngữ. Sau đây là danh sách một số thuật ngữ SQL thường gặp.

Thuật ngữ SQL

Định nghĩa

Ví dụ

mã định danh

Tên mà bạn dùng để xác định một đối tượng cơ sở dữ liệu, như tên cột.

[E-mail Address] và [Công ty]

toán tử

Một từ khóa đại diện cho một thao tác hoặc điều chỉnh một thao tác.

AS

hằng

Một giá trị không đổi, chẳng hạn như một số hoặc giá trị NULL.

42

biểu thức

Một sự kết hợp các mã định danh, toán tử, hằng số và hàm định trị thành một giá trị duy nhất.

>= Products.[Unit Price]

Đầu Trang

Tùy chỉnh

Ví dụ

Để chỉ xem các giá trị khác biệt.

Hãy sử dụng từ khóa DISTINCT trong mệnh đề SELECT.

Ví dụ nếu khách hàng của bạn thuộc vài văn phòng chi nhánh khác nhau và một số khách hàng có cùng số điện thoại và bạn muốn mỗi số điện thoại chỉ được liệt kê một lần thì mệnh đề SELECT của bạn sẽ như thế này:

SELECT DISTINCT [txtCustomerPhone]

Để thay đổi cách xuất hiện của một mã định danh trong dạng xem biểu dữ liệu để dễ đọc hơn.

Sử dụng toán tử AS [Một từ khóa đại diện cho một thao tác hoặc điều chỉnh một thao tác] với một bí danh trường trong mệnh đề SELECT. Một bí danh trường là tên bạn gán cho một trường để dễ đọc kết quả hơn.

SELECT [txtCustPhone] AS [Customer Phone]

Tùy chỉnh

Ví dụ

Bạn có thể sử dụng một bí danh bảng hoặc một tên khác mà bạn gán cho một bảng trong một câu lệnh select. Một bí danh bảng sẽ hữu ích nếu bảng có tên dài, nhất là khi bạn có nhiều trường trùng tên trong các bảng khác nhau.

Để chọn dữ liệu từ hai trường, cả hai được đặt tên ID, một lấy từ bảng tblCustomer và trường kia từ bảng tblOrder:

SELECT [tblCustomer].[ID], [tblOrder].[ID]

Sử dụng toán tử AS để xác định các biệt danh bảng trong mệnh đề FROM:

FROM [tblCustomer] AS [C], [tblOrder] AS [O]

Sau đó bạn có thể sử dụng các biệt danh bảng này trong mệnh đề SELECT, như sau:

SELECT [C].[ID], [O].[ID]

Dùng các kết nối để kết hợp các cặp bản ghi từ hai nguồn dữ liệu thành một kết quả duy nhất hoặc để cho biết có bao gồm các bản ghi từ một trong hai bảng hay không nếu không có bản ghi tương ứng trong bảng liên quan.

Nối các bảng sao cho truy vấn kết hợp các mục từ các bảng và loại trừ các mục khi không có bản ghi tương ứng trong bảng kia

Mệnh đề FROM có thể giống như thế này:

FROM [tblCustomer] INNER JOIN [tblOrder]ON [tblCustomer].[CustomerID]=[tblOrder].[CustomerID]

Về việc sử dụng các liên kết

Có hai loại kết nối, nối trong và nối ngoài. Kết nối trong thường gặp hơn trong các truy vấn. Khi bạn chạy một truy vấn có một kết nối trong, kết quả chỉ hiện những mục mà ở đó có tồn tại một giá trị chung ở cả hai bảng đã kết nối.

Các kết nối ngoài cho biết liệu có chứa dữ liệu ở nơi không tồn tại giá trị chung không. Kết nối ngoài mang tính định hướng, có nghĩa là bạn có thể xác định có bao gồm tất cả bản ghi từ bảng thứ nhất đã xác định trong kết nối [được gọi là kết nối trái] không, hay bao gồm tất cả bản ghi từ bảng thứ hai trong kết nối [được gọi là kết nối phải]. Một kết nối ngoài có cú pháp SQL như sau:

FROM table1 [ LEFT | RIGHT ] JOIN table2ON table1.field1 = table2.field2

Xem thêm thông tin về việc sử dụng các kết nối trong truy vấn tại mục Kết nối bảng và truy vấn.

Đầu Trang

Mệnh đề WHERE bao gồm các tiêu chí giúp giới hạn số mục mà một truy vấn trả về. Hãy xem ví dụ về các tiêu chí truy vấn và cách hoạt động của chúng.

Một ví dụ về cách bạn có thể tùy chỉnh mệnh đề WHERE cơ bản là để giới hạn kết quả của một truy vấn; Giả sử bạn muốn tìm số điện thoại của một khách hàng và chỉ có thể nhớ họ của anh ta là Bagel. Trong ví dụ này, họ được lưu trong trường LastName, do đó cú pháp SQL sẽ là:

WHERE [LastName]='Bagel'

Sử dụng mệnh đề WHERE cũng để kết hợp các nguồn dữ liệu cho các cột có dữ liệu khớp nhưng có kiểu dữ liệu khác nhau. Việc này sẽ tiện lợi cho bạn vì bạn không thể tạo một kết nối giữa các trường có các kiểu dữ liệu khác nhau. Sử dụng một trường làm tiêu chí cho trường kia, bằng từ khóa LIKE. Ví dụ nếu bạn muốn sử dụng dữ liệu từ bảng Assets và bảng Employees, chỉ khi loại tài sản trong trường loại tài sản của bảng Assets có số 3 trong trường Số lượng của bảng Employees, mệnh đề WHERE của bạn có thể như sau:

WHERE field1 LIKE field2

Quan trọng:  Bạn không thể chỉ ra các tiêu chí cho một trường được sử dụng với một hàm tổng hợp trong một mệnh đề WHERE. Thay vào đó, bạn sử dụng mệnh đề HAVING để chỉ ra các tiêu chí cho các trường tổng hợp.

Đầu Trang

Hãy dùng toán tử UNION khi bạn muốn xem một dạng xem kết quả kết hợp từ vài truy vấn chọn tương tự như nhau. Ví dụ nếu cơ sở dữ liệu có một bảng Products và một bảng Services và cả hai bảng đều có ba trường: ưu đãi dành riêng hoặc sản phẩm hoặc dịch vụ, giá, bảo hành hoặc bảo đảm. Mặc dù bảng Products lưu giữ thông tin bảo hành và bảng Services lưu giữ thông tin bảo đảm, nhưng thông tin cơ bản là giống nhau. Bạn có thể sử dụng một truy vấn union để kết hợp ba trường này từ hai bảng đó như thế này:

SELECT name, price, warranty, exclusive_offerFROM ProductsUNION ALLSELECT name, price, guarantee, exclusive_offer FROM Services;

Khi bạn chạy truy vấn, dữ liệu từ mỗi tập hợp các trường tương ứng sẽ được kết hợp thành một trường kết quả. Để bao gồm bất kỳ hàng trùng nhau nào vào kết quả, hãy sử dụng toán tử ALL.

Lưu ý:  Câu lệnh Select phải có cùng số trường kết quả, theo cùng thứ tự và có cùng loại dữ liệu hoặc có các loại dữ liệu tương thích. Để thực hiện truy vấn hợp, kiểu dữ liệu Số và Văn bản là tương thích.

Để biết thêm thông tin về truy vấn Kết hợp, hãy xem mục sử dụng truy vấn kết hợp để xem một kết quả đã hợp nhất từ nhiều truy vấn.

Đầu Trang

Video liên quan

Chủ Đề