T-SQL - Truy vấn phụ

A sub-query hoặc là Inner query hoặc là Nested querylà một truy vấn trong một truy vấn SQL Server khác và được nhúng trong mệnh đề WHERE. Truy vấn phụ được sử dụng để trả về dữ liệu sẽ được sử dụng trong truy vấn chính như một điều kiện để hạn chế hơn nữa dữ liệu được truy xuất.

Truy vấn phụ có thể được sử dụng với các câu lệnh SELECT, INSERT, UPDATE và DELETE cùng với các toán tử như =, <,>,> =, <=, IN, BETWEEN, v.v.

Có một số quy tắc mà các truy vấn phụ phải tuân theo:

  • Bạn phải đặt một truy vấn con trong dấu ngoặc đơn.

  • Một truy vấn con phải bao gồm mệnh đề SELECT và mệnh đề FROM.

  • Một truy vấn con có thể bao gồm các mệnh đề WHERE, GROUP BY và HAVING tùy chọn.

  • Một truy vấn con không được bao gồm các mệnh đề COMPUTE hoặc FOR BROWSE.

  • Bạn chỉ có thể bao gồm mệnh đề ORDER BY khi có mệnh đề TOP.

  • Bạn có thể lồng các truy vấn phụ lên đến 32 cấp độ.

Truy vấn con với Câu lệnh SELECT

Cú pháp

Truy vấn con được sử dụng thường xuyên nhất với câu lệnh SELECT. Sau đây là cú pháp cơ bản.

SELECT column_name [, column_name ] 
FROM   table1 [, table2 ] 
WHERE  column_name OPERATOR 
   (SELECT column_name [, column_name ] 
   FROM table1 [, table2 ] 
   [WHERE])

Thí dụ

Hãy xem xét bảng KHÁCH HÀNG có các bản ghi sau.

ID  NAME       AGE       ADDRESS            SALARY 
1   Ramesh     32        Ahmedabad          2000.00 
2   Khilan     25        Delhi              1500.00 
3   kaushik    23        Kota               2000.00 
4   Chaitali   25        Mumbai             6500.00 
5   Hardik     27        Bhopal             8500.00 
6   Komal      22        MP                 4500.00 
7   Muffy      24        Indore             10000.00

Hãy để chúng tôi áp dụng truy vấn con sau với câu lệnh SELECT.

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

Lệnh trên sẽ tạo ra kết quả sau.

ID  NAME       AGE       ADDRESS          SALARY 
4   Chaitali   25        Mumbai           6500.00 
5   Hardik     27        Bhopal           8500.00 
7   Muffy      24        Indore           10000.00

Truy vấn con với câu lệnh INSERT

Truy vấn phụ cũng có thể được sử dụng với câu lệnh INSERT. Câu lệnh INSERT sử dụng dữ liệu trả về từ truy vấn con để chèn vào bảng khác. Dữ liệu đã chọn trong truy vấn con có thể được sửa đổi bằng bất kỳ hàm ký tự, ngày tháng hoặc số nào.

Cú pháp

Sau đây là cú pháp cơ bản.

INSERT INTO table_name [ (column1 [, column2 ]) ] 
   SELECT [ *|column1 [, column2 ] 
   FROM table1 [, table2 ] 
   [ WHERE VALUE OPERATOR ]

Thí dụ

Hãy xem xét một bảng CUSTOMERS_BKP có cấu trúc tương tự như bảng CUSTOMERS. Sau đây là cú pháp để sao chép bảng CUSTOMERS hoàn chỉnh vào CUSTOMERS_BKP.

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

Truy vấn con với Tuyên bố UPDATE

Truy vấn con có thể được sử dụng cùng với câu lệnh UPDATE. Có thể cập nhật một hoặc nhiều cột trong bảng khi sử dụng truy vấn con với câu lệnh UPDATE.

Cú pháp

Sau đây là cú pháp cơ bản.

UPDATE table 
SET column_name = new_value 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ]

Thí dụ

Giả sử chúng ta có sẵn bảng CUSTOMERS_BKP là bảng sao lưu của bảng CUSTOMERS.

Ví dụ lệnh dưới đây cập nhật SALARY thêm 0,25 lần trong bảng KHÁCH HÀNG cho tất cả các khách hàng có TUỔI lớn hơn hoặc bằng 27.

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

Điều này sẽ tác động đến hai hàng và cuối cùng bảng CUSTOMERS sẽ có các bản ghi sau.

ID  NAME       AGE       ADDRESS             SALARY 
1   Ramesh     32        Ahmedabad           500.00 
2   Khilan     25        Delhi               1500.00 
3   kaushik    23        Kota                2000.00 
4   Chaitali   25        Mumbai              6500.00 
5   Hardik     27        Bhopal              2125.00 
6   Komal      22        MP                  4500.00 
7   Muffy      24        Indore              10000.00

Truy vấn con với Tuyên bố DELETE

Truy vấn con có thể được sử dụng cùng với câu lệnh DELETE giống như bất kỳ câu lệnh nào khác được đề cập ở trên.

Cú pháp

Sau đây là cú pháp cơ bản.

DELETE FROM TABLE_NAME 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ]

Thí dụ

Giả sử chúng ta có sẵn bảng CUSTOMERS_BKP là bảng sao lưu của bảng CUSTOMERS.

Ví dụ lệnh sau đây xóa các bản ghi khỏi bảng CUSTOMERS cho tất cả các khách hàng có TUỔI lớn hơn hoặc bằng 27.

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

Điều này sẽ ảnh hưởng đến hai hàng và cuối cùng bảng CUSTOMERS sẽ có các bản ghi sau.

ID  NAME       AGE       ADDRESS          SALARY 
2   Khilan     25        Delhi            1500.00 
3   kaushik    23        Kota             2000.00 
4   Chaitali   25        Mumbai           6500.00  
6   Komal      22        MP               4500.00 
7   Muffy      24        Indore           10000.00