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.
Nội dung chính
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 | +----+----------+-----+-----------+----------+