Скалярные, строковые и табличные подзапросы
Используйте подзапросы, возвращающие одно значение, одну строку или целую таблицу, и размещайте их в предложениях SELECT, FROM и WHERE
«Скалярные, строковые и табличные подзапросы» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое подзапрос?
Подзапрос — это SELECT внутри другого оператора SQL. Он может быть:
- Скалярным — возвращает одно значение
- Строчным — возвращает одну строку
- Табличным — возвращает отношение (используется в FROM)
Скалярный подзапрос
Используется везде, где ожидается одно значение:
SELECT id, total,
total - (SELECT AVG(total) FROM orders) AS diff_from_avg
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days';Строчный подзапрос
Возвращает одну строку с несколькими столбцами. Встречается реже, в основном используется с конструкторами строк:
SELECT *
FROM orders
WHERE (status, country) = (
SELECT status, country FROM orders WHERE id = 1
);Табличный подзапрос в FROM
Рассматривайте результат запроса как временную таблицу:
SELECT country, AVG(big_order_total) AS avg_big
FROM (
SELECT country, total AS big_order_total
FROM orders
WHERE total > 1000
) AS sub
GROUP BY country;Псевдонимы подзапросов в FROM
Каждому подзапросу в FROM в PostgreSQL требуется псевдоним — даже если Вы его не используете:
SELECT * FROM (SELECT 1) sub; -- "sub" requiredПодзапросы в WHERE
Фильтруйте по производному набору значений:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE total > 100
);EXISTS / NOT EXISTS
Проверьте, возвращает ли подзапрос хотя бы одну строку:
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);Подзапросы в SELECT
Встраивайте скалярный подзапрос для каждой строки:
SELECT id, full_name,
(SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_count
FROM users u;
-- Often readable, but a LEFT JOIN + GROUP BY is usually faster.Подзапросы как выражения
Скалярный подзапрос, возвращающий больше одной строки, приводит к ошибке:
SELECT (SELECT email FROM users);
-- ERROR: more than one row returned by a subquery used as an expressionКогда стоит заменить подзапрос на JOIN
Многие конструкции вида «значение IN (SELECT...)» можно переписать с помощью JOIN. Выбирайте форму, которую легче читать; современные планировщики часто создают одинаковый план.
Подзапросы и CTE
Если Вам нужен один и тот же подзапрос дважды, дайте ему имя с помощью CTE — это рассматривается в следующем уроке.
Итоги
Подзапросы бывают трёх видов.
- Скалярные — в SELECT/WHERE
- Строчные — в проверках равенства
- Табличные — в FROM
- EXISTS — для проверок «есть ли совпадение»
Проверка знаний
Какая форма подзапроса используется внутри конструкции FROM как временная таблица?
Часто задаваемые вопросы
Урок «Скалярные, строковые и табличные подзапросы» бесплатный?
Да — полный текст урока «Скалярные, строковые и табличные подзапросы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Скалярные, строковые и табличные подзапросы»?
Используйте подзапросы, возвращающие одно значение, одну строку или целую таблицу, и размещайте их в предложениях SELECT, FROM и WHERE Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Скалярные, строковые и табличные подзапросы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Скалярные, строковые и табличные подзапросы
- Коррелированные и некоррелированные подзапросы
- Общие табличные выражения (WITH)
- Рекурсивные CTE для иерархий