Truy vấn con trong SQLite



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

Các bài học SQLite phổ biến khác tại VietJack: