Подзапрос (Subquery)
SELECT внутри другого SQL выражения. Может быть в FROM, WHERE, HAVING или SELECT.
-- В WHERE: SELECT * FROM t WHERE col IN (SELECT col FROM t2); -- В FROM: SELECT * FROM (SELECT ...) sub;
Объяснение
Пример
-- Некоррелированный (быстро — один раз) SELECT * FROM products WHERE category_id IN (SELECT id FROM categories WHERE is_active = true); -- Коррелированный (медленно — для каждой строки) SELECT name, (SELECT COUNT(*) FROM orders WHERE user_id = u.id) AS orders FROM users u;
Связанные термины
Анекдоты по теме
— Как быстро вставить миллион строк? — COPY FROM или INSERT с многострочным VALUES вместо тысячи отдельных INSERT. — В чём разница? — Каждый INSERT — отдельная транзакция и roundtrip. COPY передаёт всё одним потоком. — Насколько быстрее? — В 10–100 раз.
Пользователь: — Почему мой запрос ничего не вернул? DBA: — А ты проверил регистр? Пользователь: — Да. DBA: — А пробелы? Пользователь: — Да. DBA: — А кодировку? Пользователь: — О господи...
— Когда денормализация оправдана? — Когда JOIN слишком дорог для критичных запросов. — Примеры? — Материализованные агрегаты: сохранить total_orders в таблице users. — Дублирование для аналитики: OLAP схемы специально денормализованы. — Риски? — Несогласованность. Нужны триггеры или приложение для синхронизации.