SQL Ready | Базы Данных
Авторский канал про Базы Данных и SQL Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3QREBc Реклама на бирже: https://telega.in/c/sql_ready
Больше📈 Аналитический обзор Telegram-канала SQL Ready | Базы Данных
Канал SQL Ready | Базы Данных (@sql_ready) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 15 559 подписчиков, занимая 8 396 место в категории Технологии и приложения и 43 154 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 15 559 подписчиков.
Согласно последним данным от 11 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 56, а за последние 24 часа — -9, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 12.41%. В первые 24 часа после публикации контент обычно набирает 6.30% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 931 просмотров. В течение первых суток публикация набирает 980 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 24.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как sql, строка, user_id, created_at, desc.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Авторский канал про Базы Данных и SQL
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Автор: @energy_it
РКН: https://clck.ru/3QREBc
Реклама на бирже: https://telega.in/c/sql_ready”
Благодаря высокой частоте обновлений (последние данные получены 12 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
Шпаргалка по строковым функциям MySQL для повседневной работы. Разбор приёмов вычисления длины строк, извлечения подстрок, поиска значений, управления регистром и правилами сравнения. Полезно для валидации данных, сортировок, фильтрации, миграций и тонкой настройки запросов без изменения схемы БД.
➡️ SQL Ready | #шпораNULL в SQL — не значение, а его отсутствие. Из-за этого любые обычные сравнения с NULL ведут себя не так, как ожидают, и часто ломают фильтрацию.
Таблица:
users(id, email, deleted_at)
Нужно выбрать неудалённых пользователей.
Типичный, но неправильный запрос:
SELECT *
FROM users
WHERE deleted_at = NULL;
Запрос выполнится, но вернёт 0 строк.
Почему так — SQL выражение:
deleted_at = NULL
никогда не бывает TRUE.
Любое сравнение с NULL (=, <>, <, >) возвращает UNKNOWN, а WHERE пропускает только TRUE.
То же самое с отрицанием:
WHERE deleted_at <> NULL;
Результат — тоже пусто.
Правильный способ — IS NULL:
SELECT *
FROM users
WHERE deleted_at IS NULL;
И обратное условие:
SELECT *
FROM users
WHERE deleted_at IS NOT NULL;
IS NULL и IS NOT NULL — всегда возвращают TRUE или FALSE, никогда UNKNOWN.
Частая скрытая ошибка в составных условиях:
WHERE status = 'active'
AND deleted_at <> '2026-01-01'
Если deleted_at равен NULL, всё выражение становится UNKNOWN, и строка отбрасывается, даже если status = 'active'.
Корректная проверка «не удалён»:
WHERE status = 'active'
AND deleted_at IS NULL
Важно помнить про OR:
WHERE role = 'admin'
OR deleted_at IS NULL
Здесь логика работает ожидаемо, потому что IS NULL не возвращает UNKNOWN, а значит выражение может стать TRUE.
🔥 Практические правила: = и <> с NULL не работают в WHERE; любой UNKNOWN в WHERE — строка отбрасывается. Если строка пропала из результата — первым делом проверяй условия с NULL
➡️ SQL Ready | #практикаSELECT и склеивают их UNION ALL:
SELECT country, status, COUNT(*) FROM orders GROUP BY country, status
UNION ALL
SELECT country, NULL, COUNT(*) FROM orders GROUP BY country
UNION ALL
SELECT NULL, NULL, COUNT(*) FROM orders;
GROUPING SETS позволяет описать все нужные уровни агрегации в одном GROUP BY:
GROUP BY GROUPING SETS ((country, status), (country), ())
Каждая скобка - отдельный уровень агрегации. PostgreSQL делает это за один проход по данным, без лишних сканов.
Строка с пустыми скобками () - это глобальный итог. Колонки, которые не участвуют в текущем уровне, приходят как NULL:
(country = NULL, status = NULL)
🔥 Этот приём особенно полезен в отчётах и аналитике, где нужны totals, subtotals и детализация одновременно.
➡️ SQL Ready | #советNULL в SQL — не значение, а его отсутствие. Из-за этого любые обычные сравнения с NULL ведут себя не так, как ожидают, и часто ломают фильтрацию.
Таблица:
users(id, email, deleted_at)
Нужно выбрать неудалённых пользователей.
Типичный, но неправильный запрос:
SELECT *
FROM users
WHERE deleted_at = NULL;
Запрос выполнится, но вернёт 0 строк.
Почему так — SQL выражение:
deleted_at = NULL
никогда не бывает TRUE.
Любое сравнение с NULL (=, <>, <, >) возвращает UNKNOWN, а WHERE пропускает только TRUE.
То же самое с отрицанием:
WHERE deleted_at <> NULL;
Результат — тоже пусто.
Правильный способ — IS NULL:
SELECT *
FROM users
WHERE deleted_at IS NULL;
И обратное условие:
SELECT *
FROM users
WHERE deleted_at IS NOT NULL;
IS NULL и IS NOT NULL — всегда возвращают TRUE или FALSE, никогда UNKNOWN.
Частая скрытая ошибка в составных условиях:
WHERE status = 'active'
AND deleted_at <> '2026-01-01'
Если deleted_at равен NULL, всё выражение становится UNKNOWN, и строка отбрасывается, даже если status = 'active'.
Корректная проверка «не удалён»:
WHERE status = 'active'
AND deleted_at IS NULL
Важно помнить про OR:
WHERE role = 'admin'
OR deleted_at IS NULL
Здесь логика работает ожидаемо, потому что IS NULL не возвращает UNKNOWN, а значит выражение может стать TRUE.
🔥 Практические правила: = и <> с NULL не работают в WHERE; любой UNKNOWN в WHERE — строка отбрасывается. Если строка пропала из результата — первым делом проверяй условия с NULL
➡️ SQL Ready | #практикаНе “с понедельника”. Не “когда будет время”. А сейчас.🔥 Мы собрали Telegram-каналы, где только код, практика и самые передовые инструменты, которые используют разработчики прямо сейчас.👇 🖥SQL: t.me/databases_tg 🖥 Базы данных: t.me/sqlhub 🖥 ИИ: t.me/ai_machinelearning_big_data 🖥 Python: t.me/pythonl 🖥 Linux: t.me/linuxacademiya 🖥 C++ t.me/cpluspluc 🖥 Docker: t.me/DevopsDocker 🖥 Хакинг: t.me/linuxkalii 🖥 Devops: t.me/DevOPSitsec 👣 Golang: t.me/Golang_google 🖥 Аналитика: t.me/data_analysis_ml 🖥 Javascript: t.me/javascriptv 🖥 C#: t.me/csharp_ci 🖥 Java: t.me/javatg 👣 Rust: t.me/rust_code 🤖 Нейросети: t.me/vistehno 💼 Актуальные вакансии: t.me/addlist/_zyy_jQ_QUsyM2Vi 📚 Бесплатные ит-книги: https://t.me/addlist/HwywK4fErd8wYzQy Самое лучшее в этом: ты учишься даже тогда, когда “нет времени, просто потому что читаешь правильную ленту.
• Как моделировать версионные данные через valid_from / valid_to; • Как корректно закрывать предыдущую версию и создавать новую; • Как получать актуальное состояние и исторические срезы без дополнительной логики.SCD Type 2 хранит каждое изменение как отдельную версию строки с фиксированным интервалом актуальности. ➡️ SQL Ready | #гайд
Оставляю ссылочку: GitHub 📱➡️ SQL Ready | #репозиторий
LEFT JOIN используют, когда нужно сохранить строки из левой таблицы, даже если в правой нет совпадений. Но одно неверное условие в WHERE — и LEFT JOIN незаметно превращается в INNER JOIN.
Таблицы:
users(id, email)
orders(id, user_id, amount)
Нужно получить всех пользователей и их заказы (если есть):
SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
Если у пользователя нет заказов, поля из orders будут NULL — это ожидаемое поведение LEFT JOIN.
Теперь типичная ошибка:
SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.amount > 100;
Условие в WHERE отфильтровывает строки, где o.amount IS NULL.
В результате пользователи без заказов исчезают, и запрос фактически работает как INNER JOIN.
Правильный вариант — переносить условия на правую таблицу в ON:
SELECT
u.id,
u.email,
o.amount
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id
AND o.amount > 100;
Теперь: пользователи без заказов остаются в результате, фильтрация применяется только к связанным строкам orders.
Если же логика действительно требует убрать пользователей без заказов, тогда честнее писать INNER JOIN:
SELECT
u.id,
u.email,
o.amount
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.amount > 100;
Так намерение запроса читается однозначно.
🔥 Условия в WHERE применяются после JOIN и могут уничтожить строки с NULL. Условия в ON влияют только на логику связывания таблиц.
➡️ SQL Ready | #практика• Сравним бронирования одного ресурса между собой, не создавая дубликатов; • Проверим пересечение временных интервалов с помощью канонического условия; • Получим список конфликтующих бронирований, которые система должна блокировать.Это базовый инструмент контроля данных в системах бронирования, календарях, слотах доставки и любых сервисах с ограниченными ресурсами. ➡️ SQL Ready | #задача
ROW_NUMBER(), хотя Postgres умеет проще:
SELECT DISTINCT ON (user_id) *
FROM orders
ORDER BY user_id, created_at DESC;
DISTINCT ON оставляет первую строку в рамках группы, а порядок задаётся через ORDER BY:
ORDER BY user_id, created_at DESC
Так первой будет именно самая свежая запись.
Если возможны одинаковые created_at, лучше явно добавить тай-брейкер:
ORDER BY user_id, created_at DESC, id DESC
Если нужно выбрать конкретные поля и избежать SELECT *, просто укажите нужные колонки:
SELECT DISTINCT ON (user_id)
user_id, id, created_at
FROM orders
ORDER BY user_id, created_at DESC, id DESC;
Выражения из DISTINCT ON (...) обязаны быть левым префиксом ORDER BY, иначе Postgres выдаст ошибку.
🔥 Такой запрос часто читается проще, чем ROW_NUMBER(), и при подходящем индексе (user_id, created_at DESC, id DESC) может давать отличный план выполнения.
➡️ SQL Ready | #совет
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
