SQL Ready | Базы Данных
Авторский канал про Базы Данных и SQL Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3QREBc Реклама на бирже: https://telega.in/c/sql_ready
نمایش بیشتر📈 تحلیل کانال تلگرام SQL Ready | Базы Данных
کانال SQL Ready | Базы Данных (@sql_ready) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 15 559 مشترک است و جایگاه 8 396 را در دسته فناوری و برنامهها و رتبه 43 154 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 15 559 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 11 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 56 و در ۲۴ ساعت گذشته برابر -9 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 12.41% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 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)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
users(id, country, revenue)
Нужно разбить пользователей каждой страны на 4 группы по выручке — от меньшей к большей.
Решение через NTILE:
SELECT
id,
country,
revenue,
NTILE(4) OVER (
PARTITION BY country
ORDER BY revenue
) AS revenue_quartile
FROM users;
NTILE(4) распределяет строки внутри каждой партиции на 4 группы максимально равного размера.
ORDER BY определяет, какие значения попадут в «нижние» и «верхние» группы.
Результат: quartile = 1 — пользователи с минимальной выручкой, quartile = 4 — пользователи с максимальной выручкой
Важно: группы не всегда будут строго одинаковыми по размеру. Если строк не делится нацело, первые группы получат на одну строку больше.
Если убрать PARTITION BY:
NTILE(4) OVER (ORDER BY revenue)
Разбиение произойдёт по всей таблице, без учёта страны.
Практический кейс — сегментация:
SELECT *
FROM (
SELECT
*,
NTILE(10) OVER (
PARTITION BY country
ORDER BY revenue DESC
) AS decile
FROM users
) t
WHERE decile = 1;
Так можно выбрать топ-10% пользователей в каждой стране.
NTILE работает построчно и не агрегирует данные — каждая строка сохраняется, а группа добавляется как аналитическая метка.
🔥 Используйте NTILE, когда нужно сегментировать данные внутри группы на равные части без предварительной агрегации.
➡️ SQL Ready | #практикаОставляю ссылочку: GitHub 📱➡️ SQL Ready | #репозиторий
Разбор типовых приёмов классификации данных, обработки NULL, подстановки значений по условиям и вычисления итоговых результатов прямо в запросах. Полезно для отчётов, аналитики, бизнес-логики в SELECT, упрощения WHERE и ORDER BY, а также для написания компактного и читаемого SQL без изменения схемы БД.
➡️ SQL Ready | #шпораemployees:
FROM employees e
JOIN employees m
e — это сотрудник, m — это менеджер.
Физически это одна и та же таблица, но логически, разные роли:
ON m.id = e.manager_id
Связь читается так, у сотрудника есть manager_id, который указывает на id другого сотрудника.
🔥 Такой приём используется не только для менеджеров. Категории и родительские категории, комментарии и ответы, версии сущностей, связи предыдущий / следующий, графы, цепочки состояний и др.
➡️ SQL Ready | #совет• Разбирается, как вынести тяжёлые отчёты 1С с мастер-базы на реплику;
• Показывается настройка репликации PostgreSQL/Tantor DB под реальные сценарии 1С;
• Анализируются узкие места, задержки репликации и влияние отчётных запросов;
• Даются результаты нагрузочного тестирования и выводы, которые можно применить в системах.
🔊 Продолжайте читать на Habr!➡️ SQL Ready | #статья
ORDER BY управляет порядком строк только в финальном результате запроса. В подзапросах и CTE он не гарантирует порядок строк, если не используется вместе с ограничением количества возвращаемых данных.
Причина в том, что оптимизатор может свободно менять план выполнения, пока итоговый результат формально остаётся корректным.
Таблица событий:
events(id, user_id, created_at)
Попытка взять последние события через подзапрос:
SELECT *
FROM (
SELECT *
FROM events
ORDER BY created_at DESC
) t;
Несмотря на явный ORDER BY внутри подзапроса, внешний запрос не содержит сортировки.
Это означает, что порядок строк на выходе не определён, и СУБД имеет право проигнорировать внутреннюю сортировку как не влияющую на результат.
Корректный вариант — сортировать во внешнем запросе:
SELECT *
FROM events
ORDER BY created_at DESC;
Именно этот ORDER BY гарантирует порядок строк, который получит клиент или приложение.
Когда ORDER BY в подзапросе имеет смысл — он становится значимым только вместе с ограничением:
SELECT *
FROM (
SELECT *
FROM events
ORDER BY created_at DESC
LIMIT 10
) t
ORDER BY created_at DESC;
В этом случае сортировка в подзапросе используется для выбора нужных строк, а не для их отображения.
Внутренний ORDER BY определяет, какие именно 10 строк попадут в подзапрос, а внешний ORDER BY задаёт порядок финального результата.
Аналогичный принцип работает с оконными функциями:
SELECT id, user_id, created_at
FROM (
SELECT
id,
user_id,
created_at,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY created_at DESC
) AS rn
FROM events
) s
WHERE rn = 1;
Здесь ORDER BY влияет на вычисление ROW_NUMBER, то есть на логику нумерации строк внутри окна, но не определяет порядок вывода строк в результирующем наборе.
🔥 ORDER BY — это про порядок выдачи результата, а не про порядок хранения данных. Без внешнего ORDER BY СУБД не обязана возвращать строки в каком-либо определённом порядке.
➡️ SQL Ready | #практикаUNPIVOT позволяет превратить колонки в строки на уровне SQL, без переписывания данных и логики приложения (синтаксис зависит от СУБД):
UNPIVOT (value FOR metric IN (views, clicks))
На выходе получается универсальная структура metric / value, которая хорошо ложится в агрегации, фильтры и визуализации BI.
Полезно, когда нужно сравнивать метрики между собой
или передавать данные в BI без кастомной логики:
WHERE metric IN ('views', 'orders')
🔥 Один запрос - десятки метрик и минимум изменений при росте отчёта (новые метрики просто добавляются в список UNPIVOT).
➡️ SQL Ready | #советLEFT JOIN LATERAL (...)
Выполняет подзапрос для каждой строки слева, подставляя её значения.
ORDER BY created_at DESC
LIMIT 1
Гарантирует, что ты берёшь именно нужную запись:
ON true
Потому что связь уже внутри подзапроса, JOIN тут формальность.
🔥 Это отличный инструмент, когда нужна одна зависимая строка на родителя
➡️ SQL Ready | #советWHERE и HAVING, потому что внешне они решают похожую задачу — отфильтровать результат. На практике это два разных этапа выполнения запроса с разной семантикой.
Представим таблицу заказов:
orders(id, customer_id, amount)
Нужно выбрать заказы дороже 100.
Корректный и очевидный вариант:
SELECT *
FROM orders
WHERE amount > 100;
WHERE применяется до агрегации и фильтрует отдельные строки исходной таблицы.
Теперь другая задача: найти клиентов, у которых сумма всех заказов больше 1000.
Интуитивная, но неверная попытка:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE SUM(amount) > 1000
GROUP BY customer_id;
Этот запрос некорректен: агрегатные функции не могут использоваться в WHERE, потому что на момент применения WHERE агрегатов ещё не существует.
Правильный вариант — HAVING:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;
HAVING применяется после GROUP BY и фильтрует уже сформированные группы.
Важно понимать разницу по этапам: WHERE — фильтрует строки до группировки; GROUP BY — формирует группы; HAVING — фильтрует группы; SELECT — формирует итоговый результат.
Частая оптимизационная ошибка — переносить условия из WHERE в HAVING без необходимости:
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id
HAVING amount > 100;
Такой запрос либо не выполнится, либо будет логически неверным: amount — это поле строки, а HAVING работает с группой.
Корректный и оптимальный вариант — комбинировать:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE amount > 100
GROUP BY customer_id
HAVING SUM(amount) > 1000;
Здесь: WHERE отсекает мелкие заказы до агрегации (меньше данных); HAVING проверяет условие на уровне группы.
🔥 Используй WHERE для фильтрации строк и HAVING — только для условий на агрегаты и группы. Это влияет не только на корректность, но и на производительность запроса
➡️ SQL Ready | #практикаLoading … ██████████████] 99%Роскомнадзору дали карт-бланш на блокировки, а «белые списки» сайтов тестируют уже в десятках регионов. И гайки будут закручиваться только сильнее. Чтобы в одночасье не лишиться доступа к свободному Интернету, просто сохрани Only Hack. Тут профессиональный хакер делится фишками, с которыми доступ к глобальной сети у тебя будет даже в случае ядерного апокалипсиса. Не жди момента «Х». Перестрахуйся подпиской.
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
