Trong SQL (Structured Query Language), subquery (hoặc còn gọi là truy vấn con) là một truy vấn được nhúng bên trong một truy vấn khác. Subquery thường được sử dụng để trích xuất dữ liệu từ một bảng hoặc nhiều bảng dựa trên kết quả của truy vấn chính. Subquery có thể xuất hiện trong các mệnh đề SELECT, INSERT, UPDATE, DELETE và thậm chí trong một subquery khác.

1. Cú pháp sử dụng Subquery trong SQL

Không có bất kỳ cú pháp chung nào cho truy vấn con trong SQL. Tuy nhiên, truy vấn con được sử dụng thường xuyên nhất với câu lệnh SELECT như sau:

SELECT column_name
FROM table_name
WHERE column_name expression operator 
    ( SELECT COLUMN_NAME  from TABLE_NAME   WHERE ... );

2. Các quy tắc quan trọng trong truy vấn con

  • Bạn có thể đặt Truy vấn con trong một số mệnh đề SQL: mệnh đề WHERE , mệnh đề HAVING , mệnh đề TỪ. Truy vấn con có thể được sử dụng với các câu lệnh SELECT, UPDATE, INSERT, DELETE cùng với toán tử biểu thức. Nó có thể là toán tử đẳng thức hoặc toán tử so sánh như =, >, =, <= và toán tử Like.

  • Truy vấn con là một truy vấn trong một truy vấn khác. Truy vấn bên ngoài được gọi là truy vấn chính và truy vấn bên trong được gọi là truy vấn con .

  • Truy vấn con thường thực thi trước khi truy vấn con không có bất kỳ mối quan hệ đồng quan hệ nào với truy vấn chính , khi có mối quan hệ đồng quan hệ, trình phân tích cú pháp sẽ quyết định nhanh chóng truy vấn nào sẽ thực thi theo thứ tự ưu tiên và sử dụng đầu ra của truy vấn con cho phù hợp.

  • Truy vấn con phải được đặt trong dấu ngoặc đơn.

  • Các truy vấn con nằm ở phía bên phải của toán tử so sánh.

  • Lệnh ORDER BY không thể được sử dụng trong Truy vấn con. Lệnh GROUPBY có thể được sử dụng để thực hiện chức năng tương tự như lệnh ORDER BY.

  • Sử dụng các toán tử hàng đơn với Truy vấn con hàng đơn. Sử dụng toán tử nhiều hàng với Truy vấn con nhiều hàng.

Xem thêm bài viết về SQL: - Procedure trong SQL - SELECT INTO trong SQL - Các kiểu dữ liệu trong mysql

3. Các loại subquery

Subquery được chia làm 4 loại như sau:

  • Single-Row Subquery: Subquery trả về duy nhất một hàng kết quả. Thường được sử dụng trong các mệnh đề WHERE hoặc HAVING để so sánh với một giá trị cụ thể.
  • Multiple-Row Subquery: Subquery trả về nhiều hàng kết quả. Thường được sử dụng với các phép toán IN, ANY hoặc ALL để so sánh với tập hợp các giá trị.
  • Multiple-Column Subquery: Subquery trả về nhiều cột trong kết quả. Điều này thường được sử dụng trong các mệnh đề SELECT để lấy dữ liệu từ nhiều cột.
  • Correlated Subquery: Subquery chứa tham chiếu đến cột từ bảng ở một truy vấn ngoài. Nó được sử dụng trong các trường hợp mà dữ liệu của subquery phụ thuộc vào dữ liệu của truy vấn bên ngoài.

4. Một số ví dụ

4.1 Single-Row Subquery: Trong ví dụ này, subquery trả về giá trị product_id lớn nhất từ bảng products, sau đó truy vấn chính lấy tên sản phẩm tương ứng.

SELECT product_name
FROM products
WHERE product_id = (SELECT MAX(product_id) FROM products);

4.2 Multiple-Row Subquery: Subquery trong ví dụ này trả về danh sách các khách hàng đã đặt hàng vào ngày cụ thể, và truy vấn chính trả về tên của những khách hàng này.

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date = '2023-08-01');

4.3 Multiple-Column Subquery: Trong ví dụ này, subquery trả về bộ cặp (department_id, MAX(salary)) cho mỗi bộ phận, và truy vấn chính hiển thị danh sách nhân viên và bộ phận của họ có mức lương cao nhất.

SELECT employee_id,
       employee_name
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);

4.4 Correlated Subquery: Trong ví dụ này, subquery tính trung bình giá của các sản phẩm trong cùng một danh mục và được liên kết với truy vấn chính để hiển thị tên sản phẩm và giá trung bình tương ứng.

SELECT product_name,
       (SELECT AVG(price) FROM products WHERE category = categories.category) AS avg_price
FROM categories;

Tổng kết

Như vậy chúng ta đã cùng nhau tìm hiểu về khái niệm, cách sử dụng, và một số ví dụ của subquery trong SQL. Subquery có thể là một công cụ mạnh mẽ trong SQL, nhưng cũng có thể gây ra hiệu suất kém nếu không được sử dụng đúng cách. Nên cân nhắc để tối ưu truy vấn và sử dụng subquery một cách hợp lý để đảm bảo hiệu suất tốt nhất cho hệ thống của bạn nhé

Stringee Communication APIs là giải pháp cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng có thể tích hợp trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Bộ giải pháp này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Mời quý bạn đọc đăng ký dùng thử và nhận tư vấn tại đây: