PostgreSQL - Truy vấn con

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ diệu của các truy vấn con trong PostgreSQL. Hãy tưởng tượng các truy vấn con như những người giúp việc nhỏ bé giúp truy vấn chính của bạn trong việc lấy hoặc thao tác dữ liệu. Chúng giống như những người đồng hành tin cậy trong các bộ phim siêu anh hùng yêu thích của bạn - không phải lúc nào cũng ở trong ánh sáng, nhưng rất cần thiết để hoàn thành nhiệm vụ!

PostgreSQL - Sub Queries

Truy vấn con với câu lệnh SELECT

Hãy bắt đầu với cách sử dụng phổ biến nhất của truy vấn con - trong một câu lệnh SELECT. Hãy tưởng tượng bạn đang quản lý một nhà sách và bạn muốn tìm ra những cuốn sách có giá cao hơn平均水平. Đây là cách bạn làm:

SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);

Trong truy vấn này, phần (SELECT AVG(price) FROM books) là truy vấn con của chúng ta. Nó tính toán giá trung bình của tất cả các sách, và sau đó truy vấn chính sử dụng giá trị này để lọc kết quả.

Hãy phân tích nó:

  1. Truy vấn con tính toán giá trung bình.
  2. Truy vấn chính sau đó so sánh giá của mỗi sách với giá trị này.
  3. Chỉ các sách có giá cao hơn平均水平 được trả về.

Đây là một ví dụ khác. Hãy tưởng tượng bạn muốn tìm tất cả các khách hàng đã đặt hàng:

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

Trong trường hợp này, truy vấn con (SELECT DISTINCT customer_id FROM orders) trả về một danh sách các ID khách hàng đã đặt hàng. Truy vấn chính sau đó sử dụng danh sách này để lọc bảng khách hàng.

Truy vấn con với câu lệnh INSERT

Bây giờ, hãy xem cách truy vấn con có thể được sử dụng với câu lệnh INSERT. Hãy tưởng tượng bạn đang tạo một bảng 'sách nổi bật' và bạn muốn điền nó với tất cả các sách đã bán được hơn 1000 bản sao:

INSERT INTO featured_books (book_id, title, author)
SELECT book_id, title, author
FROM books
WHERE book_id IN (SELECT book_id FROM sales WHERE copies_sold > 1000);

Ở đây, truy vấn con (SELECT book_id FROM sales WHERE copies_sold > 1000) tìm tất cả các sách đã bán được hơn 1000 bản sao. Truy vấn chính sau đó chèn chi tiết của những sách này vào bảng featured_books.

Truy vấn con với câu lệnh UPDATE

Truy vấn con cũng có thể rất hữu ích trong các câu lệnh UPDATE. Hãy tưởng tượng bạn muốn giảm giá 10% cho tất cả các sách của các tác giả đã viết hơn 5 sách:

UPDATE books
SET price = price * 0.9
WHERE author_id IN (
SELECT author_id
FROM books
GROUP BY author_id
HAVING COUNT(*) > 5
);

Trong ví dụ này, truy vấn con xác định các tác giả đã viết hơn 5 sách. Truy vấn chính sau đó cập nhật giá của tất cả các sách của các tác giả này.

Truy vấn con với câu lệnh DELETE

Cuối cùng, hãy xem cách truy vấn con có thể được sử dụng với câu lệnh DELETE. Hãy tưởng tượng bạn muốn xóa tất cả các đơn hàng của khách hàng không có giao dịch trong một năm qua:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_purchase_date < CURRENT_DATE - INTERVAL '1 year'
);

Ở đây, truy vấn con tìm tất cả các khách hàng không có giao dịch trong một năm qua. Truy vấn chính sau đó xóa tất cả các đơn hàng của những khách hàng này.

Các phương pháp truy vấn con phổ biến

Dưới đây là bảng các phương pháp truy vấn con phổ biến trong PostgreSQL:

Phương pháp Mô tả Ví dụ
IN Kiểm tra xem một giá trị có trong tập kết quả của truy vấn con hay không WHERE id IN (SELECT id FROM table)
EXISTS Kiểm tra xem truy vấn con có trả về bất kỳ hàng nào hay không WHERE EXISTS (SELECT 1 FROM table WHERE condition)
ANY Trả về true nếu bất kỳ giá trị nào của truy vấn con thỏa mãn điều kiện WHERE column > ANY (SELECT column FROM table)
ALL Trả về true nếu tất cả các giá trị của truy vấn con thỏa mãn điều kiện WHERE column > ALL (SELECT column FROM table)

Nhớ rằng, thực hành là cách tốt nhất để thành thạo! Hãy thử viết các truy vấn của riêng bạn, thử nghiệm với các kịch bản khác nhau, và đừng sợ mắc lỗi. Đó là cách chúng ta học hỏi và phát triển trong thế giới kỳ diệu của cơ sở dữ liệu!

Trước khi kết thúc, hãy nghe một câu chuyện từ kinh nghiệm giảng dạy của tôi. Tôi từng có một học sinh gặp khó khăn với truy vấn con. Anh ấy liên tục nhầm lẫn truy vấn chính và truy vấn con. Vì vậy, tôi đã bảo anh ấy tưởng tượng như một bộ dolls Nga - con dolls nhỏ nhất (truy vấn con) nằm trong con dolls lớn hơn (truy vấn chính). Hình ảnh này đã giúp anh ấy nắm bắt được khái niệm, và không lâu sau anh ấy đã viết các truy vấn phức tạp như một chuyên gia!

Tôi hy vọng hướng dẫn này đã giúp bạn hiểu rõ hơn về truy vấn con trong PostgreSQL. Hãy tiếp tục truy vấn, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ với cơ sở dữ liệu!

Credits: Image by storyset