В аналитике часто нужно считать данные сразу на нескольких уровнях: детализация, промежуточные итоги и общий результат. GROUPING SETS позволяет описать эту структуру напрямую.
Сегодня в гайде:
• Как считать несколько уровней агрегации за один проход по данным;
• Как отличать строки-итоги от обычных данных;
• Почему такой подход проще поддерживать и масштабировать.
Приём, который делает отчёты чище, быстрее и предсказуемее при росте требований.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥9🤝8❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Практичный ресурс по написанию SQL: как оформлять SELECT, JOIN, CTE, подзапросы и имена таблиц, чтобы запросы были понятными, поддерживаемыми и удобными для работы в команде. Подходит для любых СУБД и реально упрощает работу и учебу.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍9❤7
FILTER в агрегатных функциях PostgreSQL!
В аналитических запросах часто нужно посчитать несколько показателей из одной таблицы. В PostgreSQL для этого есть
Представим таблицу заказов:
Посчитаем общее количество заказов и количество завершённых:
Добавим несколько метрик в одном запросе:
Каждая агрегатная функция имеет собственное условие, а все значения считаются за один проход по данным — без подзапросов и лишней логики.
🔥 Важно помнить:
➡️ SQL Ready | #практика
В аналитических запросах часто нужно посчитать несколько показателей из одной таблицы. В PostgreSQL для этого есть
FILTER, позволяющий задавать условия отдельно для каждой агрегатной функции, не влияя на весь запрос.Представим таблицу заказов:
orders(id, customer_id, amount, status)
Посчитаем общее количество заказов и количество завершённых:
SELECT
COUNT(*) AS total_orders,
COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders
FROM orders;
FILTER применяется непосредственно к агрегатной функции и ограничивает только те строки, которые участвуют в её расчёте.Добавим несколько метрик в одном запросе:
SELECT
COUNT(*) AS total_orders,
COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
COUNT(*) FILTER (WHERE status = 'canceled') AS canceled_orders,
SUM(amount) FILTER (WHERE status = 'completed') AS completed_amount
FROM orders;
Каждая агрегатная функция имеет собственное условие, а все значения считаются за один проход по данным — без подзапросов и лишней логики.
FILTER можно использовать с любыми агрегатами:AVG(amount) FILTER (WHERE status = 'completed')
MAX(amount) FILTER (WHERE status = 'completed')
MIN(amount) FILTER (WHERE status = 'completed')
FILTER работает только с агрегатными функциями и применяется внутри SELECT, дополняя, а не заменяя WHERE и GROUP BY.Please open Telegram to view this post
VIEW IN TELEGRAM
🤝15👍10❤7🔥3
Например, индексы ускоряют поиск данных, кэш снижает нагрузку на базу, а шардинг позволяет распределять данные между серверами.
На картинке — 10 техник масштабирования БД, которые стоит держать под рукой при работе с высокими нагрузками.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝11👍9🔥9
Условный UPSERT: как не обновлять строки без изменений?
Обычный
PostgreSQL позволяет сделать условный
Если данные совпадают —
🔥 Корректно работает даже с
➡️ SQL Ready | #совет
Обычный
UPSERT обновляет строку всегда, даже если данные не изменились — это лишние блокировки, WAL и autovacuum.PostgreSQL позволяет сделать условный
UPDATE прямо в ON CONFLICT:ON CONFLICT (id) DO UPDATE
...
WHERE users.email IS DISTINCT FROM EXCLUDED.email
OR users.name IS DISTINCT FROM EXCLUDED.name;
Если данные совпадают —
UPDATE не выполняется вообще.EXCLUDED — это “новая” версия строки, users.* — текущая версия в таблице.users.col IS DISTINCT FROM EXCLUDED.col
NULL и не попадает в ловушки трёхзначной логики.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤8👍8
NULL и NOT IN — тонкость SQL, приводящая к логическим ошибкам!
При использовании
Представим таблицы:
Нужно найти клиентов, у которых нет заказов.
Интуитивный вариант:
Если подзапрос возвращает хотя бы одно значение
Это происходит потому, что
Попытка исправить ситуацию фильтрацией:
Формально запрос корректен, но требует постоянного контроля и легко ломается при изменении подзапроса.
Надёжный вариант — использовать
🔥 Используй
➡️ SQL Ready | #практика
При использовании
NOT IN в SQL можно получить логически неверный результат без ошибок выполнения. Причина — трёхзначная логика и наличие NULL в данных.Представим таблицы:
customers(id)
orders(id, customer_id)
Нужно найти клиентов, у которых нет заказов.
Интуитивный вариант:
SELECT id
FROM customers
WHERE id NOT IN (
SELECT customer_id
FROM orders
);
Если подзапрос возвращает хотя бы одно значение
NULL, результат этого запроса будет пустым, даже если клиенты без заказов существуют.Это происходит потому, что
NOT IN сводится к серии сравнений, а любое сравнение с NULL возвращает неопределённый результат.Попытка исправить ситуацию фильтрацией:
SELECT id
FROM customers
WHERE id NOT IN (
SELECT customer_id
FROM orders
WHERE customer_id IS NOT NULL
);
Формально запрос корректен, но требует постоянного контроля и легко ломается при изменении подзапроса.
Надёжный вариант — использовать
NOT EXISTS:SELECT c.id
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
NOT EXISTS корректно обрабатывает NULL и предназначен именно для проверок отсутствия связанных строк.NOT EXISTS для анти-джойнов и проверок отсутствия данных, а NOT IN — только при полном контроле результата подзапроса.Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🤝7
Цель — найти всех зарегистрированных пользователей, которые так и не оформили ни одного заказа. Это поможет вернуться к ним с акциями или напоминаниями.
Основные моменты:
• LEFT JOIN — соединяем таблицы, чтобы сохранить всех клиентов, даже тех, у кого нет заказов.
• WHERE o,id IS NULL — отбираем только тех, для кого заказов не найдено.
• SELECT — выводим имя, email и дату регистрации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20🤝10👍8❤1
Например, простая инъекция вроде
OR 1=1 может вернуть все данные из таблицы, а blind SQLi позволяет вытаскивать информацию даже тогда, когда приложение не показывает ошибки и результаты запросов.На картинке — основные типы SQL-инъекций, которые важно знать при работе с базами данных и backend-логикой.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍7🤝7🔥1
Как понять, что PostgreSQL работает на устаревшей статистике?
PostgreSQL хранит информацию о последнем сборе статистики:
Чтобы быстро найти проблемные таблицы, отсортируем по размеру:
Большая таблица + старый
В таком случае достаточно обновить статистику:
Или точечно, для одной таблицы:
🔥 Это помогает объяснить внезапную деградацию запросов и понять, почему индекс игнорируется.
➡️ SQL Ready | #совет
PostgreSQL хранит информацию о последнем сборе статистики:
SELECT relname,
last_analyze,
last_autoanalyze,
n_live_tup
FROM pg_stat_user_tables;
last_analyze — когда статистика обновлялась вручную,last_autoanalyze — когда это делал autovacuum.Чтобы быстро найти проблемные таблицы, отсортируем по размеру:
SELECT relname,
n_live_tup,
last_analyze,
last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Большая таблица + старый
last_analyze — оптимизатор работает вслепую.В таком случае достаточно обновить статистику:
ANALYZE;
Или точечно, для одной таблицы:
ANALYZE orders;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8❤7
This media is not supported in your browser
VIEW IN TELEGRAM
Готовишься к собеседованиям по SQL или хочешь укрепить свои практические навыки? Этот сайт собрал самые важные вопросы, которые реально встречаются на интервью. Здесь есть и запросы на выборки, агрегаты и JOIN, и открытые задачи, где нужно не просто написать код, а объяснить логику решения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤10🔥8
В этой статье:
• Показан реальный подход к автоматическому развёртыванию PostgreSQL в закрытом контуре;• Разбирается поддержка нескольких ОС, версий СУБД и схем отказоустойчивости;• Описана автоматическая проверка соответствия требованиям архитектуры;• Приведён практический кейс внедрения, рассчитанный на эксплуатацию в крупных корпоративных системах.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍8🤝6❤1