02/10/2018, 00:26

[SQLSERVER] Hướng dẫn sử dụng SubQuery (truy vấn lồng) trong sql

Bài viết hôm nay, mình sẽ hướng dẫn các bạn sử dụng SubQuery trong SQL SERVER . Vậy Subquery là gì? Subquery là một câu lệnh truy vấn SELECT nằm trong 1 câu lệnh SELECT khác, với mục đích trả về kết quả cho câu SELECT bên ngoài sử dụng. Subquery có ...

Bài viết hôm nay, mình sẽ hướng dẫn các bạn sử dụng SubQuery trong SQL SERVER. Vậy Subquery là gì?

Subquery là một câu lệnh truy vấn  SELECT nằm trong 1 câu lệnh SELECT khác, với mục đích trả về kết quả cho câu SELECT bên ngoài sử dụng. Subquery có thể nằm ở mệnh đề SELECT, FROM (gọi là inline view), WHERE hay HAVING.

sử dụng subquery trong sqlserver

Sub query trong SQL hoặc truy vấn nội bộ hoặc truy vấn Nested là truy vấn trong một truy vấn SQL khác và được nhúng trong mệnh đề WHERE.

Một sub query đượ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.

Sub query có thể được sử dụng với 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 vài quy tắc mà Sub query phải tuân theo:

  • Sub query phải được đặt trong dấu ngoặc đơn.
  • Một sub query có thể chỉ có một cột trong mệnh đề SELECT, trừ khi nhiều cột trong truy vấn chính cho sub query để so sánh các cột đã chọn của nó.
  • Không thể sử dụng lệnh ORDER BY trong sub query, mặc dù truy vấn chính có thể sử dụng ORDER BY. Lệnh GROUP BY có thể được sử dụng để thực hiện chức năng giống như ORDER BY trong một sub query.
  • Sub query trả về nhiều hơn một hàng chỉ có thể được sử dụng với toán tử nhiều giá trị như toán tử IN.
  • Danh sách SELECT không được bao gồm bất kỳ tham chiếu nào đến các giá trị đánh giá BLOB, ARRAY, CLOB hoặc NCLOB.
  • Một sub query không thể được chứa trực tiếp một chức năng set.
  • Toán tử BETWEEN không thể được sử dụng với một sub query. Tuy nhiên, toán tử BETWEEN có thể được sử dụng trong sub query.

Sub query với câu lệnh SELECT

Sub query thường được sử dụng với câu lệnh SELECT. Cú pháp cơ bản như sau:

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

Ví dụ

Hãy xem xét bảng CUSTOMERS có các bản ghi sau đây:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |  2000.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Ví dụ về sub query với một câu lệnh SELECT.

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

Điều này sẽ tạo ra kết quả sau.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  8500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sub query với câu lệnh INSERT

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

Cú pháp cơ bản như sau.

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

Ví dụ về sub query với một câu lệnh INSERT

Xem bảng CUSTOMERS_BKP có cấu trúc tương tự như bảng CUSTOMERS. Bây giờ để sao chép bảng CUSTOMERS hoàn chỉnh vào bảng CUSTOMERS_BKP, bạn có thể sử dụng cú pháp sau.

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

Sub query với câu lệnh UPDATE

Có thể sử dụng sub query kết hợp với câu lệnh UPDATE. Một hoặc nhiều cột trong một bảng có thể được cập nhật khi sử dụng một sub query với câu lệnh UPDATE.

Cú pháp cơ bản như sau.

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

Ví dụ về sub query với một câu lệnh UPDATE

Giả sử, chúng ta có bảng CUSTOMERS_BKP có sẵn là bảng sao lưu của CUSTOMERS. Ví dụ sau cập nhật SALARY gấp 0,25 lần trong bảng CUSTOMERS cho tất cả khách hàng có AGE 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ẽ ảnh hưởng đến hai hàng và cuối cùng bảng CUSTOMERS sẽ có các bản ghi sau đây.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ha Anh   |  32 | Da Nang   |   125.00 |
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  5 | Hai An   |  27 | Ha Noi    |  2125.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

Sub query với câu lệnh DELETE

Sub query có thể được sử dụng kết hợp với câu lệnh DELETE như với bất kỳ câu lệnh nào khác đã đề cập ở trên.

Cú pháp cơ bản như sau.

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

Ví dụ về sub query với một câu lệnh DELETE

Giả sử, chúng ta có một bảng CUSTOMERS_BKP có sẵn mà là một bản sao lưu của bảng CUSTOMERS. Ví dụ sau sẽ xóa các bản ghi từ bảng CUSTOMERS cho tất cả khách hàng có AGE 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 là bảng CUSTOMERS sẽ có các bản ghi sau.

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Van Ha   |  25 | Ha Noi    |  1500.00 |
|  3 | Vu Bang  |  23 | Vinh      |  2000.00 |
|  4 | Thu Minh |  25 | Ha Noi    |  6500.00 |
|  6 | Hoang    |  22 | Ha Noi    |  4500.00 |
|  7 | Binh     |  24 | Ha Noi    | 10000.00 |
+----+----------+-----+-----------+----------+

HAVE FUN :)

Theo http://viettuts.vn

Tags:
0