Подзапрос (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;Связанные термины
Анекдоты по теме
— Что такое lateral join? — Это когда правая часть JOIN может ссылаться на строки из левой. — Зачем? — Классика: для каждого пользователя — его последние 3 заказа. SELECT u.*, o.* FROM users u, LATERAL (SELECT * FROM orders WHERE user_id = u.id ORDER BY date DESC LIMIT 3) o;
Разработчик: — У меня запрос на 8 таблиц через JOIN, подзапросы, оконные функции внутри WHERE и GROUP BY на хэш с миллиардом строк. Он идёт 3 дня. Как оптимизировать? DBA: — TRUNCATE TABLE карьера_разработчика. И иди в менеджеры.
— Что такое bulk_create в Django? — Создаёт много объектов одним запросом. User.objects.bulk_create([User(name=n) for n in names]) — Вместо loop с .create()? — Да. 1000 объектов: loop = 1000 INSERT, bulk_create = 1 INSERT с 1000 строками. — Насколько быстрее? — В 10–50 раз.