Trong PostgreSQL, truy vấn con (subquery) là một truy vấn lồng bên trong một truy vấn khác. Truy vấn con có thể được sử dụng ở nhiều vị trí như trong mệnh đề SELECT, FROM, WHERE, hoặc HAVING. Dưới đây là các ví dụ về cách thực hiện truy vấn con:

1. Truy vấn con trong mệnh đề SELECT

Truy vấn con có thể được sử dụng để tính toán một giá trị cho mỗi hàng trong mệnh đề SELECT.

SELECT 
    name,
    (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.id) AS order_count
FROM customers;

Trong ví dụ này, truy vấn con đếm số đơn hàng của mỗi khách hàng (order_count), và kết quả được trả về trong cùng một truy vấn với bảng customers.

2. Truy vấn con trong mệnh đề WHERE

Truy vấn con có thể được sử dụng để lọc các hàng dựa trên một điều kiện từ một bảng khác.

SELECT name, total_spent
FROM customers
WHERE total_spent > (
    SELECT AVG(total_spent) FROM customers
);

Ở đây, truy vấn con tính giá trị trung bình của total_spent từ bảng customers, và truy vấn ngoài chỉ trả về những khách hàng có total_spent lớn hơn giá trị trung bình.

3. Truy vấn con trong mệnh đề FROM (Derived Table)

Truy vấn con cũng có thể được sử dụng trong mệnh đề FROM, nó được gọi là bảng tạm thời hoặc “derived table”.

SELECT name, avg_order_value
FROM (
    SELECT customer_id, AVG(total_value) AS avg_order_value
    FROM orders
    GROUP BY customer_id
) AS avg_orders
JOIN customers ON customers.id = avg_orders.customer_id;

Trong ví dụ này, truy vấn con tạo ra một bảng tạm thời avg_orders với giá trị trung bình của đơn hàng, sau đó bảng này được kết hợp với bảng customers.

4. Truy vấn con sử dụng EXISTS

EXISTS kiểm tra sự tồn tại của các hàng từ truy vấn con.

SELECT name
FROM customers
WHERE EXISTS (
    SELECT 1 FROM orders WHERE orders.customer_id = customers.id
);

Truy vấn con trả về TRUE nếu có ít nhất một đơn hàng cho khách hàng đó, và chỉ những khách hàng có đơn hàng mới được trả về.


Những truy vấn con này giúp thực hiện các tác vụ phức tạp hơn trong PostgreSQL, đặc biệt khi cần xử lý dữ liệu từ nhiều bảng liên quan.