Truy vấn con (còn được gọi truy vấn phụ hay truy vấn lồng nhau) là một truy vấn bên trong truy vấn SQLite khác và được nhúng bên trong mệnh đề WHERE.
Một truy vấn con được sử dụng để trả về dữ liệu mà sẽ được sử dụng trong truy vấn chính như là một điều kiện để thu hẹp dữ liệu được thu nhận.
Các truy vấn con có thể được sử dụng với các lệnh SELECT, INSERT, UPDATE VÀ DELETE cùng với các toán tử như: =, <, >, >=, <=, IN, BETWEEN ...
Các truy vấn con phải tuân theo các qui tắc sau:
- Các truy vấn con phải được bao trong các dấu ngoặc đơn.
- Một truy vấn con có thể chỉ có một cột trong mệnh đề SELECT, trừ khi có nhiều cột là trong truy vấn chính cho truy vấn con để so sánh các cột đã chọn của nó.
- Một ORDER BY không thể được sử dụng trong một truy vấn con, mặc dù truy vấn chính có thể sử dụng một ORDER BY. GROUP BY có thể được sử dụng để thực hiện cùng tính năng như ORDER BY trong một truy vấn con.
- Các truy vấn con, mà trả về nhiều hơn một hàng, có thể chỉ được sử dụng với các toán tử nhân, ví dụ: toán tử IN.
- Toán tử BETWEEN không thể được sử dụng với một truy vấn con; tuy nhiên, toán tử BETWEEN có thể được sử dụng bên trong truy vấn con.
Truy vấn con với lệnh SELECT trong SQLite
Các truy vấn con thường xuyên được sử dụng với lệnh SELECT. Cú pháp cơ bản của truy vấn con với lệnh SELECT là 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ụ
Bạn theo dõi bảng COMPANY có các bản ghi sau:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Bây giờ, chúng ta kiểm tra truy vấn con với lệnh SELECT như sau:
sqlite> SELECT *
FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY
WHERE SALARY > 45000) ;
Ví dụ trên sẽ cho kết quả:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
Truy vấn con với lệnh INSERT trong SQL
Các truy vấn con cũng có thể được sử dụng với lệnh INSERT. Lệnh INSERT sử dụng dữ liệu được trả về từ truy vấn con để chèn nó vào trong bảng khác. Dữ liệu được lựa chọn trong truy vấn con có thể được sửa đổi với bất kỳ hàm xử lý ký tự, date hoặc số nào.
Cú pháp cơ bản của truy vấn con với lệnh INSERT là như sau:
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Ví dụ
Theo dõi bảng COMPANY_BKP với cấu trúc tương tự như bảng COMAPNY. Bây giờ, sao chép cả bảng COMPANY vào trong bảng COMPANY_BKP, sau đây là cú pháp.
sqlite> INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
Truy vấn con với lệnh UPDATE trong SQLite
Truy vấn con có thể được sử dụng kết hợp với lệnh UPDATE. Hoặc một cột đơn hoặc nhiều cột trong một bảng có thể được cập nhật khi sử dụng một truy vấn con với lệnh UPDATE trong SQLite.
Cú pháp cơ bản của truy vấn con với lệnh UPDATE là như sau:
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Ví dụ
Giả sử, chúng ta đã có bảng COMPANY_BKP có sẵn, là một backup (sao lưu) của bảng COMPANY.
Ví dụ sau cập nhật SALARY * 0,50 trong bảng COMPANY cho tất cả khác hàng có AGE lớn hơn hoặc bằng 27.
sqlite> UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
Lệnh này sẽ tác động lên hai hàng và cuối cùng bảng COMPANY sẽ có các bản ghi sau:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 10000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Truy vấn con với lệnh DELETE trong SQLite
Truy vấn con có thể được sử dụng kết hợp với lệnh DELETE giống như bất kỳ lệnh khác đã được đề cập ở trên.
Cú pháp cơ bản của truy vấn con với lệnh DELETE là như sau:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Ví dụ
Giả sử, chúng ta đã có bảng COMPANY_BKP có sẵn, là một backup (sao lưu) của bảng COMPANY.
Ví dụ sau xóa các bản ghi của tất cả khách hàng có AGE lớn hơn hoặc bằng 27 từ bảng COMPANY.
sqlite> DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );
Lệnh này sẽ tác động lên hai hàng và cuối cùng bảng COMPANY sẽ có các bản ghi sau:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0