PostgreSQL - Подзапросы
Здравствуйте, ambitные энтузиасты баз данных! Сегодня мы погружаемся в fascинирующий мир подзапросов PostgreSQL. Представьте себе подзапросы как小小的 помощников, которые помогают вашему основному запросу retrieving или манипулировать данными. Они как надежные подручные в ваших любимых фильмах о супергероях - не всегда на переднем плане, но необходимые для выполнения работы!
Подзапросы с оператором SELECT
Давайте начнем с наиболее common использования подзапросов - внутри оператора SELECT. Представьте себе, что вы управляете书店, и хотите узнать, какие книги стоят дороже среднего. Вот как это можно сделать:
SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);
В этом запросе, часть (SELECT AVG(price) FROM books)
является нашим подзапросом. Он calculates среднюю цену всех книг, и затем наш основной запрос использует это значение для фильтрации результатов.
Давайте разберем это:
- Подзапрос calculates среднюю цену.
- Основной запрос затем сравнивает цену каждой книги с этой средней.
- Возвращаются только книги с ценой выше средней.
Вот еще один пример. Давайте представим, что вы хотите найти всех клиентов, которые сделали заказы:
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