В этом учебном пособии вы узнаете, как использовать подзапросы в PostgreSQL с синтаксисом и примерами.
Что такое подзапрос в PostgreSQL?
В PostgreSQL подзапрос - это запрос в запросе. Вы можете создавать подзапросы в своих SQL-предложениях. Эти подзапросы могут находиться в опертаоре WHERE, операторе FROM или SELECT.
Примечание
- В PostgreSQL подзапрос также называется INNER QUERY или INNER SELECT.
- В PostgreSQL основной запрос, содержащий подзапрос, также называется OUTER QUERY или OUTER SELECT.
Оператор WHERE
Чаще всего подзапрос будет найден в операторе WHERE. Эти подзапросы также называются вложенными подзапросами.
Например:
1 2 3 4 5 6 7 |
SELECT p.product_id, p.product_name FROM products p WHERE p.category_id IN (SELECT c.category_id FROM categories c WHERE c.category_id > 25 AND c.category_name like 'S%'); |
Часть подзапроса оператора SELECT выше:
1 2 3 4 |
(SELECT c.category_id FROM categories c WHERE c.category_id > 25 AND c.category_name like 'S%'); |
Этот подзапрос позволяет вам найти все значения category_id из таблицы category, у которых category_id больше 25, а category_name начинается с 'S'. Затем подзапрос используется для фильтрации результатов основного запроса с использованием условия IN.
Этот подзапрос мог бы быть записан как INNER JOIN следующим образом
1 2 3 4 5 6 |
SELECT p.product_id, p.product_name FROM products p INNER JOIN categories c ON p.category_id = c.category_id WHERE c.category_id > 25 AND c.category_name like 'S%'; |
Этот INNER JOIN будет работать более эффективно, чем исходный подзапрос. Однако важно отметить, что не все подзапросы можно переписать с помощью joins соединений.
Оператор FROM
Подзапрос также можно найти в операторе FROM. Они называются встроенными представлениями (view).
Например:
1 2 3 4 5 6 |
SELECT products.product_name, subquery1.category_name FROM products, (SELECT categories.category_id, categories.category_name, COUNT(category_id) AS total FROM categories GROUP BY categories.category_id, categories.category_name) subquery1 WHERE subquery1.category_id = products.category_id; |
В этом примере мы создали подзапрос в операторе FROM следующим образом:
1 2 3 |
(SELECT categories.category_id, categories.category_name, COUNT(category_id) AS total FROM categories GROUP BY categories.category_id, categories.category_name) subquery1 |
Этот подзапрос имеет псевдоним с именем subquery1. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
Оператор SELECT
Подзапрос также можно найти в операторе SELECT. Обычно они используются, когда вы хотите получить расчет с использованием агрегатной функции, такой как sum, count, min, max или avg, но вы не хотите, чтобы агрегатная функция применялась к основному запросу.
Например:
1 2 3 4 5 |
SELECT p1.product_name, (SELECT MAX(product_id) FROM products p2 WHERE p1.product_id = p2.product_id) subquery2 FROM products p1; |
В этом примере мы создали подзапрос в операторе SELECT следующим образом:
1 2 3 |
(SELECT MAX(product_id) FROM products p2 WHERE p1.product_id = p2.product_id) subquery2 |
Подзапрос имеет псевдоним с именем subquery2. Это будет имя, используемое для ссылки на этот подзапрос или любое из его полей.
Хитрость в размещении подзапроса в SELECT заключается в том, что подзапрос должен возвращать одно значение. Вот почему агрегатная функция, такая как sum, count, функция min, max или avg обычно используется в подзапросе.