7786
Авторский канал про Базы Данных и SQL Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it
⚡️ Программисты из CodeGuard слили в телеграмм тонны инфы
🔥 Отсортировали и разбили по каналам:
|- - - 📂 Python — 428ГБ
|
|- - - 📂 Хакинг & infosec — 573ГБ
|
|- - - 📂 Linux & Bash — 652ГБ
|
|- - - 📂 Работа IT — 356ГБ
|
|- - - 📂 Общее IT — 1526ГБ
📌 Гайды, шпаргалки, книги, задачи и ресурсы для каждого.
🖥 Находим маршруты с пересадками (мини-навигация в базе)
Соберём все возможные маршруты из аэропорта A в B — прямые, через одну пересадку и через две, без рекурсий и сложных конструкций.
В этом посте:
• Проверим, существует ли прямой путь, простой случай, но часто самый важный;
• Расширим поиск и найдём маршруты вида A => X => B, где X — автоматически вычисленная пересадка;
• Построим цепочки A => X => Y => B, что по сути является маленьким обходом графа.
Сгенерированные колонки в PostgreSQL: ускоряем фильтры без лишних вычислений!
Когда одно и то же выражение постоянно считается в WHERE, запросы тормозят. В PostgreSQL это решается GENERATED ALWAYS AS … STORED — выражение вычисляется один раз и хранится как обычное поле.
Создаём таблицу с материализованным выражением:
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
payload JSONB NOT NULL,
event_type TEXT GENERATED ALWAYS AS (payload->>'type') STORED
);
event_type больше не вычисляется на лету — значение лежит прямо в строке.SELECT id
FROM events
WHERE event_type = 'purchase';
CREATE INDEX idx_events_event_type
ON events(event_type);
EXPLAIN ANALYZE
SELECT id
FROM events
WHERE event_type = 'purchase';
Index Scan, без тяжёлых операций над JSONB. Сгенерированные колонки отлично подходят для повторяющихся вычислений:
🖥 Oracle — псевдоколонки и их возможности!Эта шпаргалка собирает основные псевдоколонки Oracle и показывает, как использовать их на практике: нумерация строк, доступ к физическому адресу, работа с иерархиями, определение листовых/корневых узлов, генерация UUID, отслеживание изменений по SCN и просмотр историй строк.
➡️ SQL Ready | #шпора
Нужно найти, где бронирования, подписки или сессии пересекаются по времени?
Два интервала пересекаются, если начало одного раньше конца другого, и наоборот:
a.start_at < b.end_at
AND b.start_at < a.end_at
SELECT a.id, b.id
FROM bookings a
JOIN bookings b
ON a.id < b.id
AND a.start_at < b.end_at
AND b.start_at < a.end_at;
a.id < b.id, чтобы не получить пары в обе стороны.AND a.room_id = b.room_id
🖥 SQLHUB – с помощью понятных картинок и коротких видео авторы объясняют сложные концепции и учат профессиональному подходу в работе с БД.
💼 Data Jobs - нужна работа? Здесь отборные вакансии и фриланс проекты по работе с базами данных, sql и не только.
🧠 Machine learning - показываем на примере как использовать AI, который может генерировать готовые базы данных, код, разбираем все что нужно знать в области ИИ.
🖥 SQL задачи - решайте отборные задачи и качайте скилы.
📚 Библиотека - мы создали канал с книгами по SQL и залили туда наверное самую большую подборку книг по SQL. Около 200 книг бесплатно.
🔝 А здесь мы собрали целую кладезь полезных SQL ресурсов для прокачки
🖥 Контроль целостности данных!
С помощью оконных функций SQL можно находить разрывы во временных рядах, пропущенные интервалы и повторяющиеся записи.
Сегодня в гайде:
• Выявляем пропущенные минуты и события;
• Находим дубликаты временных меток;
• Контролируем качество потоков и ETL прямо в запросах.
Хочешь узнать, когда именно заказ сменил статус?
Используй LAG(), она возвращает значение из предыдущей строки в рамках группы:
LAG(status) OVER (PARTITION BY order_id ORDER BY updated_at)
status <> LAG(status) OVER (...)
true, когда статус поменялся.SELECT *
FROM (
SELECT order_id, status, updated_at,
status <> LAG(status) OVER (PARTITION BY order_id ORDER BY updated_at) AS changed
FROM order_status_log
) t
WHERE changed;
WITHIN GROUP — агрегаты с управляемым порядком!
Обычные агрегаты в SQL не гарантируют порядок входных данных, что важно для медиан и упорядоченных списков. Конструкция WITHIN GROUP решает это, задавая порядок элементов внутри агрегатной функции.
Пример: соберём список продуктов по категории в порядке убывания продаж:
SELECT
category_id,
LISTAGG(product_name, ', ') WITHIN GROUP (ORDER BY total_sales DESC) AS top_products
FROM product_sales
GROUP BY category_id;
ARRAY_AGG(product_name ORDER BY ...), синтаксис WITHIN GROUP используется для ordered-set функций, а не для любых агрегатов.SELECT
region_id,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY total_amount) AS p90_sales
FROM orders
GROUP BY region_id;
PERCENTILE_CONT() и PERCENTILE_DISC() позволяют вычислять медиану или любое процентное значение без оконных функций.SELECT
store_id,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_amount) AS median_check
FROM orders
GROUP BY store_id;
NTILE() или RANK() в оконных выражениях.WITHIN GROUP, когда важен порядок в агрегатах.
🖥 Пишем мини-чат-бота!
Сегодня создаём простого бота, который “понимает” текст запроса и отвечает на сообщения пользователя.
В этом посте:
• Храним шаблоны фраз и ответы в таблице responses;
• Используем ILIKE, чтобы находить ключевые слова в сообщении;
• Возвращаем лучший ответ по приоритету совпадений.
USING — способ объединять таблицы в SQL!
Когда таблицы имеют одинаковые ключи, USING помогает сократить код и избежать дублирования столбцов.
Объединим заказы и клиентов по общему полю:
SELECT *
FROM orders
JOIN customers USING (customer_id);
ON выглядело бы чуть длиннее и менее лаконично:SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;
USING SQL сам убирает дубликаты полей, оставляя одно customer_id в результирующем наборе.SELECT *
FROM orders
JOIN shipments USING (order_id, customer_id);
SELECT customer_id,
c.customer_name,
SUM(o.amount) AS total_amount
FROM customers c
JOIN orders o USING (customer_id)
GROUP BY customer_id, c.customer_name
HAVING SUM(o.amount) > 1000
ORDER BY total_amount DESC;
USING, когда имена ключей совпадают — это приём, который улучшает читаемость и уменьшает вероятность ошибок.
🖥 Аналитические (оконные) функции Oracle!В этой шпаргалке собраны основные оконные функции Oracle SQL, применяемые для аналитики, ранжирования и работы с порядком строк без свёртки данных. Они вычисляют значения в контексте "окна" — набора строк, связанных с текущей строкой. Это мощный инструмент для аналитических отчётов и сложных выборок.
➡️ SQL Ready | #шпора
🖥 Находим пробки в городе с помощью!
В этой задаче соберём запрос, который определит «пробки» на дорогах: места, где машины движутся слишком медленно.
Что делаем:
• Считаем среднюю скорость по каждому участку дороги за последние 10 минут;
• Отмечаем «пробку», если средняя скорость падает ниже 15 км/ч;
• Определяем топ-участки, где движение затруднено чаще всего.
😎 Code — кладезь знаний по SQL на русском!
Это не просто справочники - это структурированный учебник и тренажёр в одном месте. Ты найдёшь понятные теоретические объяснения и сразу приступишь к практике: каждая тема содержит примеры и задачи, которые можно решать прямо на сайте.
📌 Оставляю ссылочку: code.mu
➡️ SQL Ready | #ресурс
Айтишники зарабатывают ДОХ#Я 💵💵
Не все, конечно, а только самые хваткие.
Кто с холодной головой и чёткой архитектурой внутри.
💼 Рынок сейчас покупает НЕ знания.
Он покупает тех, кто умеет собрать их в работающую модель
Бизнес-архитектор — канал о том, как люди в IT, бизнесе и на фрилансе собирают из своих знаний доход в несколько тысяч $ в месяц.
Подпишись и превращай знания в результат: ⤵️
/channel/+jONJxjgUpWs3N2Vi
/channel/+jONJxjgUpWs3N2Vi
Нужно получить список всех дней, даже тех, которых нет в таблице?
Например, показать дни без заказов. PostgreSQL умеет генерировать последовательности прямо в запросе:
SELECT *
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day');
generate_series() создаёт виртуальную таблицу с шагом по дате.SELECT g.day, COUNT(o.id) AS total
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day') AS g(day)
LEFT JOIN orders o ON date(o.created_at) = g.day
GROUP BY g.day
ORDER BY g.day;
— Ты уволен
— Почему?
— Мы оплатили GPT-5, ты больше не нужен.
Вы тоже в ах@е с такого расклада? Учился лет 5, потом столько же батрачил за копейки ради опыта — чтобы тебя заменила еб@чая железяка.
А теперь задумайтесь: нейронки развиваются с бешеной скоростью. Поэтому сейчас как никогда нужны спецы для их обучения.
Чтобы в кратчайшие сроки выйти на уровень элиты и стать топом в сфере — подпишитесь на канал @devsp. Его автор раскрывает неочевидные секреты: как в 3 месяца уместить 6 лет обучения, достойно пройти любое собеседование и что делать, чтобы лучшие компании дрались за вас.
А временами подкидывает крутые вакансии и лайфхаки, после которых вас с руками оторвут даже без опыта.
Это всё равно что встретить Нео и войти в 10% тех, кто сломал систему. Подписывайтесь: @devsp
🖥 Очередь без конфликтов!SKIP LOCKED позволяет управлять конкурентным доступом на уровне строки, а не всей таблицы, поэтому воркеры не ждут друг друга и не создают лишних блокировок.
Сегодня в гайде:
• Забираем задачи параллельно и без конфликтов;
• Делаем атомарный “взять + обновить” в одном запросе;
• Распределяем очереди между воркерами под высокой нагрузкой.
👩💻 ChatGPT – умер!
Власти начали регулирование, и ИИ больше не заменит программистов.
Хочешь реально уметь программировать, а не копировать код?
Выбирай своё направление и учись по карточкам и фото,
а не по сухим текстам.
👩💻 Python Flow — @pythonn_flow
👩💻 C & C++ Flow — @cpp_flow
💻 IT News Flow — @itnews_flow
👩💻 Java Flow — @java_flow
👩💻 SQL & Базы данных Flow — @sql_flow
👩💻 C# & Unity Flow — @csharp_flow
👩💻 Node.js Flow — @nodejs_flow
👩💻 Linux & DevOps Flow — @linux_flow
👩💻 InfoSec & Хакинг — @hacking_flow
👩💻 Git & GitHub Flow — @git_flow
💎 Присоединяйся к тем кто реально думает и растёт, а не ждёт чуда!
🖥 SQL-генерация полного набора домино!
Сегодня соберём 28 уникальных костяшек домино — только силами SQL. Без циклов и хранимых процедур, используя лишь CROSS JOIN и простое условие.
В этом посте:
• Генерируем все пары чисел от 0 до 6;
• Фильтруем зеркальные комбинации;
• Получаем финальный набор костяшек в правильном порядке.
Оптимистическая блокировка: обновляем данные без конфликтов!
Когда несколько пользователей редактируют одну запись, можно избежать конфликтов с помощью оптимистической блокировки — без явного FOR UPDATE.
Создаём таблицу с версией записи:
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT,
price DECIMAL(10,2),
version INT DEFAULT 1 NOT NULL
);
SELECT id, name, price, version
FROM products
WHERE id = 1;
UPDATE products
SET price = 199.99,
version = version + 1
WHERE id = 1
AND version = 1;
UPDATE не затронет ни одной записи — значит, версия изменилась, и данные устарели.rows_affected = 1, и при необходимости повторить попытку или показать сообщение об ошибке.SELECT * FROM products WHERE id = 1;
🖥 Работа с JSON в PostgreSQL!В этой шпаргалке собраны основные приёмы работы с JSON и JSONB в PostgreSQL: доступ к элементам, извлечение вложенных данных, обновление значений, создание объектов, раскрытие массивов, форматирование и проверка вхождения. Эти инструменты позволяют удобно хранить и обрабатывать структурированные данные прямо в базе.
➡️ SQL Ready | #шпора
🖥 Корреляция: как связаны просмотры и продажи!
SQL умеет не только суммировать и фильтровать данные, он способен показывать насколько сильно одно влияет на другое.
В этом посте:
• Находим средние значения метрик;
• Считаем ковариацию и дисперсии;
• Собираем финальную формулу корреляции прямо в запросе.
🖥 Временные таблицы и переменные в SQL Server!В этой шпаргалке собраны основные приёмы работы с временными данными в SQL Server: создание, заполнение, очистка и удаление временных таблиц, а также использование табличных переменных. Эти методы помогают выполнять промежуточные расчёты, строить отчёты и оптимизировать сложные запросы без изменения основной схемы базы.
➡️ SQL Ready | #шпора
Транзакция — не просто “begin и commit”, а ещё и способ управлять атомарностью и блокировками!
Начинаешь с BEGIN — всё, что дальше, идёт как единое целое:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
rollback, и база возвращается к исходному состоянию.SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
❤️ CodeAbbey — тренажёр алгоритмического мышления!
Сайт с огромной коллекцией задач по программированию, от самых простых до тех, что реально заставят подумать.
Учиться можно на абсолютно любом языке. Отличный способ подтянуть логику, научиться писать аккуратный код и подготовиться к собесам.
📌 Оставляю ссылочку: codeabbey.com
➡️ SQL Ready | #ресурс
GENERATE_SERIES — быстро создаём последовательности чисел и дат!
В SQL часто требуется сгенерировать последовательность чисел или дат для отчётов, тестовых данных или анализа временных рядов.
Вместо ручного создания таблиц или массивов можно использовать встроенную функцию GENERATE_SERIES:
SELECT *
FROM generate_series(1, 10) AS number;
SELECT *
FROM generate_series('2025-01-01'::date, '2025-01-07'::date, '1 day') AS day;
SELECT d.day, COALESCE(o.total, 0) AS total_orders
FROM generate_series('2025-01-01'::date, '2025-01-07'::date, '1 day') AS d(day)
LEFT JOIN orders o ON o.order_date = d.day;
Программисты из Telegram создали сильнейшие IT- каналы
🐍 Ghostly Python - автоматизируй всё, что можешь. Боты, скрипты, парсеры, утилиты - делаем Python простым и полезным. Уверенный старт для новичков и не только.
☕️ Easy Java - Java без боли. От основ до фреймворков. Просто, понятно и по делу. Если хочешь реально понять язык - тебе сюда.
😎 IT Syndicate - главный хаб для тех, кто живёт IT. GameDev, InfoSec, Frontend, DevOps, AI и многое другое. Готовь мозг, тут будет жарко.
🧡 Ghostly Frontend - фронтенд без лишнего шума. HTML, CSS, JavaScript, React, Vue — всё, что нужно, чтобы создавать быстрые и красивые интерфейсы.
🖥 Разбираемся с MATCH_RECOGNIZE — поиском паттернов прямо!
Этот инструмент позволяет находить последовательности событий: рост цены и её падение, пропуски активности пользователей.
Что важно знать:
• PATTERN описывает последовательность (например, рост => падение)
• DEFINE задаёт правила для каждого шага;
• Можно строить аналитику для временных рядов, активности, безопасности.
MATCH_RECOGNIZE делает SQL гибким и превращает его в язык сценариев — без циклов и внешних процедур.
Распределяем события по типам — GROUP BY + агрегаты!
Когда нужно понять, какие типы событий встречаются чаще, обычный WHERE не помогает — нужна агрегация.
Посчитаем количество каждого типа события:
SELECT EventType, COUNT(*) AS EventCount
FROM Logs
GROUP BY EventType;
SELECT EventType, COUNT(*) AS EventCount
FROM Logs
GROUP BY EventType
HAVING COUNT(*) > 100;
SELECT EventType,
COUNT(*) AS EventCount,
AVG(ResponseTime) AS AvgResponse
FROM Logs
GROUP BY EventType
HAVING COUNT(*) > 100;