PostgreSQL - Подзапросы

Здравствуйте, ambitные энтузиасты баз данных! Сегодня мы погружаемся в fascинирующий мир подзапросов PostgreSQL. Представьте себе подзапросы как小小的 помощников, которые помогают вашему основному запросу retrieving или манипулировать данными. Они как надежные подручные в ваших любимых фильмах о супергероях - не всегда на переднем плане, но необходимые для выполнения работы!

PostgreSQL - Sub Queries

Подзапросы с оператором SELECT

Давайте начнем с наиболее common использования подзапросов - внутри оператора SELECT. Представьте себе, что вы управляете书店, и хотите узнать, какие книги стоят дороже среднего. Вот как это можно сделать:

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

В этом запросе, часть (SELECT AVG(price) FROM books) является нашим подзапросом. Он calculates среднюю цену всех книг, и затем наш основной запрос использует это значение для фильтрации результатов.

Давайте разберем это:

  1. Подзапрос calculates среднюю цену.
  2. Основной запрос затем сравнивает цену каждой книги с этой средней.
  3. Возвращаются только книги с ценой выше средней.

Вот еще один пример. Давайте представим, что вы хотите найти всех клиентов, которые сделали заказы:

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

В этом случае, наш подзапрос (SELECT DISTINCT customer_id FROM orders) возвращает список идентификаторов клиентов, которые сделали заказы. Основной запрос затем использует этот список для фильтрации таблицы клиентов.

Подзапросы с оператором INSERT

Теперь рассмотрим, как подзапросы могут быть использованы с оператором INSERT. Представьте себе, что вы создаете таблицу 'избранных книг', и хотите заполнить ее всеми книгами, которые проданы тиражом более 1000 экземпляров:

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);

Здесь наш подзапрос (SELECT book_id FROM sales WHERE copies_sold > 1000) находит все книги, которые проданы тиражом более 1000 экземпляров. Основной запрос затем вставляет детали этих книг в таблицу featured_books.

Подзапросы с оператором UPDATE

Подзапросы также могут быть incredibly полезны в операторах UPDATE. Давайте представим, что вы хотите предоставить скидку 10% на все книги авторов, которые написали более 5 книг:

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

В этом примере, наш подзапрос identifies авторов, которые написали более 5 книг. Основной запрос затем обновляет цены на все книги этих авторов.

Подзапросы с оператором DELETE

Наконец, рассмотрим, как подзапросы могут быть использованы с оператором DELETE. Представьте себе, что вы хотите удалить все заказы от клиентов, которые не сделали покупку в прошлом году:

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

Здесь наш подзапрос находит всех клиентов, которые не сделали покупку в прошлом году. Основной запрос затем удаляет все заказы от этих клиентов.

Common Подзапросные методы

Вот таблица common подзапросных методов в PostgreSQL:

Метод Описание Пример
IN Проверяет, находится ли значение в результирующем наборе подзапроса WHERE id IN (SELECT id FROM table)
EXISTS Проверяет, возвращает ли подзапрос какие-либо строки WHERE EXISTS (SELECT 1 FROM table WHERE condition)
ANY Возвращает true, если любое из значений подзапроса соответствует условию WHERE column > ANY (SELECT column FROM table)
ALL Возвращает true, если все значения подзапроса соответствуют условию WHERE column > ALL (SELECT column FROM table)

Помните, практика делает perfect! Попробуйте написать свои собственные запросы, экспериментируйте с различными сценариями и не бойтесь ошибаться. Так мы учимся и растем в wonderful мире баз данных!

Before we wrap up, here's a little story from my teaching experience. I once had a student who was struggling with subqueries. He kept mixing up the main query and the subquery. So I told him to think of it like a Russian nesting doll - the smallest doll (subquery) fits inside the bigger one (main query). This visual helped him grasp the concept, and soon he was writing complex queries like a pro!

I hope this tutorial has been helpful in demystifying PostgreSQL subqueries for you. Keep querying, keep learning, and most importantly, have fun with databases!

Credits: Image by storyset