Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách sử dụng UPDATE từ SELECT trong SQL Server

Trong bài viết này, chúng tôi sẽ đề cập đến các phương pháp khác nhau để sử dụng câu lệnh UPDATE từ SELECT trong SQL Server.

Trong thế giới cơ sở dữ liệu, dữ liệu tĩnh thường không được lưu trữ. Thay vào đó, nó tiếp tục thay đổi khi chúng tôi cập nhật dữ liệu hiện có, lưu trữ hoặc xóa dữ liệu không liên quan và hơn thế nữa. Ví dụ:giả sử bạn có một bảng lưu trữ dữ liệu giá sản phẩm cho cổng mua sắm của mình. Giá sản phẩm liên tục thay đổi, vì bạn có thể giảm giá sản phẩm vào những thời điểm khác nhau cho khách hàng của mình. Trong trường hợp này, bạn không thể thêm hàng mới trong bảng vì bản ghi sản phẩm đã tồn tại, nhưng bạn được yêu cầu cập nhật giá hiện tại cho các sản phẩm hiện có.

Đây là lúc truy vấn UPDATE phát huy tác dụng. Truy vấn UPDATE sửa đổi dữ liệu trong một hàng hiện có trong cơ sở dữ liệu. Bạn có thể cập nhật tất cả các hàng trong bảng hoặc giới hạn các hàng bị ảnh hưởng cho bản cập nhật bằng cách sử dụng mệnh đề WHERE. Thông thường, cập nhật SQL được thực hiện cho một bảng hiện có với tham chiếu trực tiếp. Ví dụ:trong bảng [nhân viên], một yêu cầu phải tăng 10% lương của tất cả nhân viên đang hoạt động. Trong trường hợp này, truy vấn SQL tham chiếu trực tiếp sẽ là:

Cập nhật bộ nhân viên [lương] =lương + (lương * 10/100) trong đó [hoạt động] =1

Giả sử bạn có một bảng [Địa chỉ] khác lưu trữ vị trí của nhân viên và bạn được yêu cầu cập nhật bảng [Nhân viên] dựa trên dữ liệu có sẵn trong bảng [Địa chỉ]. Làm cách nào để bạn cập nhật dữ liệu trong bảng [Nhân viên]?

May mắn thay, có một giải pháp - CẬP NHẬT từ câu lệnh SELECT. Trong phần sau, chúng ta xem xét các cách khác nhau để thực hiện cập nhật bằng cách sử dụng câu lệnh SELECT. Ví dụ:bảng [Nhân viên] có giá trị NULL cho các cột - [Mã bưu điện] và [Thành phố] trong ảnh chụp màn hình sau. Bảng [Địa chỉ] có các giá trị cho cả hai cột [Mã bưu điện] và [Thành phố].

Phương pháp 1:CẬP NHẬT từ CHỌN:Phương thức tham gia

Phương pháp này sử dụng SQL Joins để tham chiếu đến bảng phụ có chứa các giá trị cần được cập nhật. Do đó, bảng mục tiêu được cập nhật với dữ liệu cột tham chiếu cho các điều kiện được chỉ định.

Việc sử dụng câu lệnh UPDATE từ SELECT trong trường hợp này khá đơn giản. Trước tiên, bạn có thể sử dụng câu lệnh SELECT để tìm nạp các giá trị cột tham chiếu và cột mục tiêu.

SELECT e.City,A.City, e.PostCode,A.PostCode
FROM Employee e
INNER JOIN
[Address] a
ON e.EmpID = A.EmpID

Tiếp theo, bạn sẽ thực hiện các thay đổi nhỏ trong truy vấn của mình và nó sẽ chuẩn bị một câu lệnh CẬP NHẬT như được hiển thị bên dưới.

  1. Thay thế từ khóa đã chọn bằng cập nhật.
  2. Chỉ định tên bảng hoặc tên bí danh cần được cập nhật.
  3. Sử dụng một từ khóa đã đặt và ký hiệu bằng (=) giữa cột tham chiếu và cột mục tiêu.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Sau đó, thực hiện câu lệnh UPDATE và xác minh rằng giá trị cột nguồn và cột đích giống nhau.

Phương pháp 2:CẬP NHẬT từ SELECT:Câu lệnh MERGE

Câu lệnh MERGE hữu ích để thao tác dữ liệu trong bảng đích dựa trên dữ liệu bảng nguồn cho cả các hàng đã khớp và chưa khớp. Đây là một phương pháp thay thế để thực hiện CẬP NHẬT từ hàm câu lệnh SELECT.

Trong câu lệnh MERGE ví dụ bên dưới, các tác vụ sau được thực hiện:

  • Sử dụng câu lệnh MERGE để cập nhật dữ liệu trong bảng [Nhân viên].
  • Sau đó, nó tham chiếu đến một bảng khác khi điều khoản USING được áp dụng.
  • Khi đó WHEN MATCHED chỉ định phép kết hợp THAM GIA (Kết nối bên trong) giữa bảng nguồn và bảng đích.
  • Sau đó, nó cập nhật [Mã bưu điện] và [Thành phố] từ bảng [Địa chỉ] vào bảng [Nhân viên] bằng cách sử dụng câu lệnh THEN UPDATE, theo sau là ánh xạ cột nguồn và cột đích.
  • Câu lệnh MERGE luôn kết thúc bằng dấu chấm phẩy (;).
MERGE Employee AS e
USING(SELECT * FROM [Address]) AS A
ON A.EmpID=e.EmpID
WHEN MATCHED THEN UPDATE SET
e.PostCode=A.PostCode ,
e.City = A.City;

Phương pháp 3:CẬP NHẬT từ CHỌN:Phương thức truy vấn con

Truy vấn con định nghĩa một truy vấn nội bộ có thể được sử dụng bên trong câu lệnh SELECT, INSERT, UPDATE và DELETE. Đây là một phương pháp đơn giản để cập nhật dữ liệu bảng hiện có từ các bảng khác.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Truy vấn trên sử dụng câu lệnh SELECT trong mệnh đề SET của câu lệnh UPDATE.
  • Nếu truy vấn con tìm thấy một hàng phù hợp, truy vấn cập nhật sẽ cập nhật các bản ghi cho nhân viên cụ thể.
  • Nếu truy vấn con trả về NULL (không có hàng phù hợp), nó sẽ cập nhật NULL cho cột tương ứng.
  • Nếu truy vấn con trả về nhiều hơn một hàng phù hợp, câu lệnh UPDATE sẽ gây ra lỗi - “Truy vấn con SQL Server trả về nhiều hơn 1 giá trị. Điều này không được phép khi truy vấn con sử dụng các toán tử so sánh (=,! =, <, <=,>,> =). ”

Giới hạn truy vấn con

  • Truy vấn con có toán tử so sánh chỉ có thể bao gồm một tên cột ngoại trừ nếu nó được sử dụng cho toán tử IN hoặc EXISTS. Do đó, nếu chúng tôi yêu cầu cập nhật nhiều cột dữ liệu, chúng tôi cần các câu lệnh SQL riêng biệt.
  • Bạn không thể sử dụng ntext , văn bản hình ảnh các kiểu dữ liệu trong truy vấn con.
  • Truy vấn con không được bao gồm mệnh đề GROUP BY và HAVING nếu truy vấn con chứa toán tử so sánh chưa được sửa đổi. Toán tử so sánh không được sửa đổi không thể sử dụng từ khóa BẤT CỨ hoặc TẤT CẢ.

So sánh hiệu suất giữa các câu lệnh UPDATE khác nhau từ các câu lệnh SELECT

Trong phần này, chúng tôi sẽ so sánh hiệu suất giữa các phương pháp CẬP NHẬT khác nhau từ các phương pháp CHỌN. Để thực hiện việc này, chúng ta sẽ bắt đầu bằng cách thực hiện các truy vấn SQL cùng nhau, kích hoạt kế hoạch thực thi thực tế (Ctrl + M) trong SQL Server Management Studio và tách chúng ra bằng cách sử dụng câu lệnh Go.

Trong các kế hoạch thực thi, tôi nhận được dữ liệu sau cho bản demo của mình:

  • Phương pháp tham gia có chi phí truy vấn là 41% (so với toàn bộ lô)
  • Câu lệnh MERGE có chi phí truy vấn là 34% (liên quan đến toàn bộ lô)
  • Phương thức truy vấn con có chi phí truy vấn 24% (liên quan đến toàn bộ lô)

Phương thức JOIN sử dụng chi phí 40% cho loại riêng biệt và 35% chi phí cho cập nhật chỉ mục theo nhóm.

Phép nối hợp nhất sử dụng phép nối bên trong để khớp các hàng dữ liệu giữa dữ liệu nguồn và dữ liệu đích. Nó cũng có chi phí tương đối tối đa cho toán tử sắp xếp.

Truy vấn con là phương pháp nhanh nhất để cập nhật dữ liệu cột. Nó sử dụng cập nhật chỉ mục theo cụm và quét chỉ mục theo nhóm như được đánh dấu.

Để biết thêm chi tiết, bạn có thể tham khảo các bài viết trước của tôi:Kế hoạch thực thi SQL Server - Nó là gì và Nó giúp gì cho các vấn đề về hiệu suất? và Cách đọc và Phân tích Kế hoạch Thực thi SQL Server.

Tóm tắt

Bạn có thể sử dụng bất kỳ phương pháp nào được chỉ định trong bài viết này để thực hiện CẬP NHẬT từ các câu lệnh CHỌN. Truy vấn con hoạt động hiệu quả, nhưng nó có những hạn chế riêng, như đã nêu trước đó. Hiệu suất tổng thể của cơ sở dữ liệu của bạn phụ thuộc vào dữ liệu bảng, số lượng bản cập nhật, mối quan hệ bảng, chỉ mục và thống kê.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi máy chủ SQL 111:“… phải là câu lệnh đầu tiên trong một loạt truy vấn”

  2. Thay đổi ngôn ngữ cho phiên hiện tại trong SQL Server

  3. Tương đương của LIMIT và OFFSET cho SQL Server?

  4. SQL Server - nối các hàng thành danh sách được phân tách bằng dấu phẩy

  5. Giữa MS SQL Server có bao gồm các ranh giới phạm vi không?