Subquery (truy vấn con) trong SQL là một truy vấn nằm bên trong truy vấn khác. Nó được dùng trong mệnh đề WHERE hoặc HAVING của câu lệnh SQL. Subquery cho phép bạn chỉ định kết quả của một truy vấn làm đối số trong truy vấn khác.
Khi viết truy vấn SQL, bạn có thể muốn chỉ định tham số dựa trên kết quả của truy vấn khác. Ví dụ: bạn có danh sách khách hàng. Bạn muốn lấy danh sách khách hàng đã đặt đơn hàng trị giá vượt quá một ngưỡng nhất định. Thông tin đơn hàng và khách hàng lưu trong các bảng khác nhau.
Đó là lúc phép toán SQL subquery xuất hiện. Subqueries (còn gọi nested queries) là truy vấn SELECT nằm trong mệnh đề WHERE của truy vấn SQL khác. Truy vấn SQL chính sau đó sử dụng kết quả của subquery.
Trong hướng dẫn này, chúng ta sẽ thảo luận cách dùng subquery trong SQL, tham chiếu một vài ví dụ.
SQL Subquery: Hướng dẫn
Subquery SQL là truy vấn bên trong truy vấn khác. Chúng được dùng để chạy truy vấn phụ thuộc vào kết quả của truy vấn khác. Subquery cho phép làm điều này mà không phải viết hai truy vấn riêng biệt và copy-paste kết quả. Subquery xuất hiện trong mệnh đề WHERE hoặc HAVING.
Cú pháp subquery trong câu lệnh SQL SELECT:
SELECT name FROM products WHERE supplier_id IN (SELECT id FROM suppliers WHERE local = True);
Truy vấn này chọn tên tất cả sản phẩm do công ty địa phương cung cấp. Chúng ta dùng subquery làm đầu vào cho câu lệnh SQL IN. Câu lệnh IN trả về tất cả bản ghi từ bảng products nơi supplier_id nằm trong kết quả subquery.
Chúng ta có thể dùng subquery trong câu lệnh INSERT, UPDATE và DELETE.
Một subquery phải nằm trong ngoặc đơn. Điều này phân biệt bên trong subquery với subquery khác.
Bạn nên đảm bảo chọn dữ liệu liên quan trong subquery. Trong ví dụ trên, chúng ta chọn id từ bảng suppliers. Nếu chọn cột khác, truy vấn sẽ không hoạt động vì truy vấn chính phụ thuộc vào supplier ID.
Ví dụ SQL Subquery: SELECT
Giả sử bạn muốn lấy danh sách học sinh đạt danh hiệu "honor roll", bạn có thể dùng subquery. Giả định thông tin honor roll nằm ở bảng khác.
Ví dụ minh họa cách SQL subqueries hoạt động. Truy vấn sau trả về danh sách tất cả khách hàng đã đặt đơn hàng trị giá trên $200:
SELECT * FROM customers WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
Subquery trả về:
| name | address | loyalty_plan | id | |
|---|---|---|---|---|
| Katy | katy.l@gmail.com | Mountain View, CA | None | 4 |
| John | john.p@outlook.com | Boston, MA | None | 1 |
(2 hàng)
Dòng đầu tiên chọn mọi cột từ bảng customers. Sau đó chỉ định chỉ muốn khách hàng có customer ID nằm trong subquery. Subquery chọn tất cả customer ID duy nhất từ bảng orders nơi chi phí > $200. Các bản ghi khớp điều kiện được đưa vào kết quả.
SQL Subquery: INSERT
Chúng ta muốn chèn tất cả bản ghi khách hàng đặt đơn hàng > $200 vào bảng high_value_customers. Dùng subquery và SQL INSERT:
INSERT INTO high_value_customers SELECT * FROM customers WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
Truy vấn bảng high_value_customers sẽ thấy tất cả khách hàng giá trị cao trong một bảng:
| name | address | loyalty_plan | id | |
|---|---|---|---|---|
| Katy | katy.l@gmail.com | Mountain View, CA | Gold | 4 |
| John | john.p@outlook.com | Boston, MA | None | 1 |
(2 hàng)
SQL Subquery: UPDATE
Chúng ta có thể dùng subquery để cập nhật dữ liệu trong bảng. Ví dụ: cập nhật loyalty plan của tất cả khách hàng đặt đơn hàng giá trị cao thành Bronze (hoặc High Value):
UPDATE customers SET loyalty_plan = 'High Value' WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
Khi truy vấn bảng customers, loyalty plan của 2 khách hàng giá trị cao đã được cập nhật:
| name | address | loyalty_plan | id | |
|---|---|---|---|---|
| Katy | katy.l@gmail.com | Mountain View, CA | High Value | 4 |
| John | john.p@outlook.com | Boston, MA | High Value | 1 |
(2 hàng)
SQL Subquery: DELETE
Bạn có thể dùng subqueries với câu lệnh SQL DELETE để xóa hàng đơn lẻ hoặc nhiều hàng trong bảng.
Viết lệnh xóa đơn hàng của khách hàng giá trị cao, những người đã được chuyển sang bảng mới. Cần phụ thuộc vào subquery:
DELETE FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE loyalty_plan = 'High Value');
Tất cả đơn hàng từ khách hàng giá trị cao đã bị xóa. Subquery lồng nhau trả về:
| id | item_name | cost | customer_id |
|---|---|---|---|
| 5 | Oak Chair | 100 | 3 |
(1 hàng)
Kết luận
Subquery SQL là truy vấn trong truy vấn khác. Subquery cho phép bạn phụ thuộc vào kết quả của một truy vấn trong truy vấn khác. Subquery được chỉ định trong mệnh đề HAVING hoặc WHERE của câu lệnh SQL.
Subqueries giúp dễ dàng chạy truy vấn phụ thuộc vào kết quả truy vấn khác. Trong hướng dẫn này, chúng ta đã thảo luận cách viết subquery trên máy chủ SQL. Cũng nói về cách dùng subquery trong câu lệnh SELECT, INSERT, UPDATE và DELETE SQL.
Bạn muốn tìm hiểu thêm về lập trình SQL? Xem hướng dẫn How to Learn SQL của chúng tôi. Hướng dẫn chứa lời khuyên chuyên gia về học SQL. Bạn cũng sẽ tìm thấy danh sách khóa học hàng đầu giúp tiếp tục hành trình học tập.