Truy vấn con – SUBQUERY trong SQL

Bài viết dưới đây sẽ hướng dẫn cách dùng truy vấn con trong SQL cùng với cú pháp và các ví dụ cụ thể.

SUBQUERY – Truy vấn con là một truy vấn bên trong truy vấn SQL khác và được nhúng bên trong mệnh đề WHERE. Yếu tố này còn được gọi truy vấn phụ hay truy vấn lồng nhau.

Truy vấn con trả về dữ liệu sẽ sử dụng trong truy vấn chính, được xem như là một điều kiện để thu hẹp dữ liệu 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…

Truy vấn con phải tuân theo các quy tắc sau:

  • SUBQUERY phải nằm trong các dấu ngoặc đơn.
  • Một SUBQUERY 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 SUBQUERY để 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 sử dụng để thực hiện tính năng như ORDER BY trong một truy vấn con.
  • Truy vấn con 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.
  • Truy vấn con không thể đi kèm set function.
  • Toán tử BETWEEN không thể được sử dụng với một truy vấn con tuy nhiên có thể được sử dụng bên trong truy vấn con.

SUBQUERY với lệnh SELECT trong SQL

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 như sau:

SELECT ten_cot [, ten_cot ] FROM bang1 [, bang2 ] WHERE ten_cot OPERATOR  (SELECT ten_cot [, ten_cot ]  FROM bang1 [, bang2 ]  [WHERE])

Xét bảng NHANVIEN có các bản ghi sau:

 +----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  1 | Thanh    |  32 | Haiphong  |  2000.00 |
 |  2 | Loan     |  25 | Hanoi     |  1500.00 |
 |  3 | Nga      |  23 | Hanam     |  2000.00 |
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  5 | Huy      |  27 | Hatinh    |  8500.00 |
 |  6 | Cao      |  22 | HCM       |  4500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+

Bây giờ, chúng ta kiểm tra truy vấn con với lệnh SELECT như sau:

SQL> SELECT *   FROM NHANVIEN  WHERE ID IN (SELECT ID   FROM NHANVIEN  WHERE LUONG > 4500);

Kết quả trả về là:

+----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  5 | Huy      |  27 | Hatinh    |  8500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+

SUBQUERY với lệnh INSERT trong SQL

Truy vấn con 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ừ truy vấn con để chèn vào một 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ỳ ký tự, hàm date/time hoặc hàm number nào.

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

INSERT INTO ten_bang [ (cot1 [, cot2 ]) ]  SELECT [ *|cot1 [, cot2 ]  FROM bang1 [, bang2 ]  [ WHERE GIA_TRI TOAN_TU ]

Theo dõi bảng NHANVIEN_QTM với cấu trúc tương tự như bảng NHANVIEN. Bây giờ, sao chép cả bảng NHANVIEN vào trong bảng NHANVIEN_QTM, bạn có thể sử dụng cú pháp sau:

SQL> INSERT INTO NHANVIEN_QTM  SELECT * FROM NHANVIEN  WHERE ID IN (SELECT ID   FROM NHANVIEN);

SUBQUERY với lệnh UPDATE trong SQL

Có thể sử dụng truy vấn con 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 truy vấn con với câu lệnh UPDATE.

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

UPDATE bang SET ten_cot = giatri_moi [ WHERE TOAN_TU [ GIA_TRI ]  (SELECT TEN_COT  FROM TEN_BANG)  [ WHERE) ]

Giả sử ta có bảng NHANVIEN_QTM có sẵn là bảng sao lưu của NHANVIEN. Ví dụ sau cập nhật LUONG gấp 2 lần trong bảng NHANVIEN cho tất cả khách hàng có LUONG lớn hơn hoặc bằng 27:

SQL> UPDATE NHANVIEN  SET LUONG = LUONG * 2  WHERE TUOI IN (SELECT TUOI FROM NHANVIEN_QTM  WHERE TUOI >= 27 );

Lệnh này tác động lên hai hàng và cuối cùng bảng NHANVIEN sẽ có các bản ghi sau:

SUBQUERY với lệnh UPDATE

SUBQUERY với lệnh DELETE trong SQL

Các truy vấn con cũng được sử dụng với lệnh DELETE và ta có cú pháp cơ bản như sau:

DELETE FROM TEN_BANG [ WHERE TOAN_TU [ GIA_TRI ]  (SELECT TEN_COT  FROM TEN_BANG)  [ WHERE) ]

Giả sử ta có bảng NHANVIEN_QTM có sẵn mà là sao lưu của bảng NHANVIEN. Ví dụ sau sẽ xóa các bản ghi từ bảng NHANVIEN có TUOI lớn hơn hoặc bằng 27.

SQL> DELETE FROM NHANVIEN  WHERE TUOI IN (SELECT TUOI FROM NHANVIEN_QTM  WHERE TUOI >= 27);

Lệnh này tác động lên hai hàng và cuối cùng bảng NHANVIEN sẽ có các bản ghi sau:

 +----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  2 | Loan     |  25 | Hanoi     |  1500.00 |
 |  3 | Nga      |  23 | Hanam     |  2000.00 |
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  6 | Cao      |  22 | HCM       |  4500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+