7786
Авторский канал про Базы Данных и SQL Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it
Индексы: когда они вредят вместо помощи!
Разбираем типичные ошибки при работе с индексами. Неправильное использование может замедлить базу данных вместо ускорения.
Каждый индекс замедляет INSERT/UPDATE операции:
CREATE INDEX idx_user_name ON users(name);
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_user_phone ON users(phone);
CREATE INDEX idx_user_city ON users(city);
SELECT * FROM orders WHERE YEAR(order_date) = 2024;
-- Индекс на order_date не используется
SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
CREATE INDEX idx_user_city_age ON users(city, age);
city или city+age, но бесполезен для поиска только по age.EXPLAIN для проверки, что индексы действительно работают!
❤️ Codedex — учи SQL через приключение!
Здесь ты научишься создавать таблицы, фильтровать данные, использовать операторы и агрегатные функции — всё через увлекательные практические задания.
📌 Оставляю ссылочку: codedex.io
➡️ SQL Ready | #ресурс
👋🏼 Приветствую!
Ровно год назад я создал этот канал и не только (не важно что 12 июля, главное первый пост был 8 сентября 😁).
Спасибо всем кто подписан на мой склчик, особенно благодарю тех, кто ставит реакции.
🖥 За это время контент намного стал лучше, с таких постов, до таких как сейчас.
Но кстати всё равно, раньше тоже круто было, можете перейти в закреп и там посмотреть на старые постики.
В общем, поздравляю сам себя с годовщиной! 🥳
🖥 Транзакции и блокировка строк!
При конкурентных изменениях данных важно исключить конфликты. Используем транзакции, блокировки строк и правильный уровень изоляции.
Создадим таблицу счетов:
CREATE TABLE Accounts (
id INT PRIMARY KEY,
name VARCHAR(50),
balance DECIMAL(10,2)
);
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- защита от грязных чтений
BEGIN;
SELECT balance FROM Accounts
WHERE id = 1 FOR UPDATE; -- эксклюзивная блокировка строки
UPDATE Accounts SET balance = balance - 500 WHERE id = 1;
UPDATE Accounts SET balance = balance + 500 WHERE id = 2;
COMMIT; -- сохраняем изменения
ROLLBACK; -- можно вызвать до COMMIT при ошибке
FOR UPDATE ставит row-level exclusive lock: другие транзакции ждут, пока вы завершите свою.
Проверяем дубликаты и считаем уникальные значения!
В больших таблицах важно быстро находить повторяющиеся записи и понимать, сколько уникальных элементов. Это полезно для контроля качества данных и аналитики.
Создадим таблицу пользователей:
CREATE TABLE users (
user_id INT,
email VARCHAR(100)
);
INSERT INTO users VALUES
(1, 'alice@mail.com'),
(2, 'bob@mail.com'),
(3, 'alice@mail.com'),
(4, 'carol@mail.com'),
(5, 'bob@mail.com');
SELECT email, COUNT(*) AS cnt,
CASE WHEN COUNT(*)>1 THEN 'Duplicate' ELSE 'Unique' END AS status
FROM users
GROUP BY email;
COUNT() + GROUP BY группирует одинаковые значения, а CASE сразу классифицирует их как дубликаты или уникальные.email | cnt | status
-----------------------------
alice@mail.com | 2 | Duplicate
bob@mail.com | 2 | Duplicate
carol@mail.com | 1 | Unique
🥇 Пройди ЛЮБОЕ собеседование!
Большая база вопросов с реальных собеседований:
→ Тинькофф, Авито, Сбер, Озон, Яндекс, VK и еще 100+ компаний
→ 20+ направлений: Frontend, Backend, DevOps, QA, Mobile и другие
→ 60+ технологий: React, Python, Docker, Git, Java, Go, JavaScript и не только
Выбирай направление:
👩💻 C# 🤖 ML Engineer
👩💻 C/C++ 🖥 Data Science
👩💻 Java 👩💻 Python
🖥 PHP 👩💻 Frontend
👣 Rust 👣 Golang
👩💻 Node.js 💻 DevOps
👩💻 QA 👩💻 Android
👩💻 iOS 👩💻 Game Dev
🖥 Общее IT 👨💻 Вакансии
База обновляется еженедельно — всегда актуальные вопросы с последних собеседований.
💸 Хочешь оффер в Big Tech? Готовься с нами!
🖥 Завез вам шпаргалку по регулярочкам в SQL: оператор REGEXP для точечного поиска по шаблону!
REGEXP — инструмент, который удобно использовать, если требуется сложный и гибкий поиск по шаблону. Например, поиск по нескольким условиям или использование специальных символов и диапазонов.
➡ SQL Ready | #шпора
SQL Murder Mystery — это интерактивная игра, в которой нужно использовать SQL-запросы для расследования виртуального убийства.
Игрокам предоставляется доступ к базе данных с информацией о преступлении, и они должны применять свои навыки работы с SQL для поиска улик, анализа данных и выявления преступника.
Я пожалею об этом, но ладно...
В общем сливаю вам самый топовый источник слитых курсов, бесплатных книг, программ, лучших шпаргалок для разработчиков.
Если после этого не сможешь стать Сениором, то ты безнадежен!
Вот ссылка - /channel/+VHZ7JQpy8FU0OTUy
Репозиторий PostgreSQL Patterns Library!
Он идет с коллекцией шаблонов и практик для оптимизации запросов и работы с базами данных PostgreSQL, направленный на повышение производительности и упрощение разработки.
Оставляю ссылочку: Github 📱
TutorialsPoint — это обширная платформа с уроками по множеству технологий, где курс по MySQL предлагает пошаговое руководство по основам работы с базами данных, написанию запросов и управлению данными.
📌 Оставляю ссылочку: tutorialspoint.com
➡️ SQL Ready | #ресурс
🖥 SQL-constraints — разбираемся в ограничениях на столбцы!
Правильное использование этих ограничений помогает избежать нежелательных ситуаций, например, нескольких пользователей с одинаковыми id или ссылки на несуществующих записей в других таблицах, отсутствия обязательных данных.
➡ SQL Ready | #шпора
🖥 Находим хозяев и их питомцев!
Исходя из таблиц хозяев и питомцев, нужно вернуть имя хозяина, его питомца и разницу между их возрастами. Но при этом нужно предусмотреть, что у хозяина может питомец может потеряться.
В этой задаче:
• CASE — для ситуаций, если у хозяина нет питомца
• LEFT JOIN — выбираем все записи из таблицы хозяев
• ORDER BY — сортируем по имени хозяина и разнице возрастов с питомцами
🖥 Связываем таблицы профессионально!
Сегодня рассмотрим возможные варианты связи записей из разных таблиц друг с другом по их логическим отношениям. Это важно понимать, чтобы правильно проектировать схемы баз данных и знать, как это устроено под капотом.
Типы связей:
• One To Many — самый распространенный тип, когда у одной записи может быть несколько соответствий в другой таблице
• One To One — связь для записей со строгим отношением: у одной записи только одно уникальное соответствие
• Many To Many — например, многие студенты могут слушать лекции многих преподавателей
🖥 Работа с функциями NULLIF и DATEPART
• NULLIF — сравнивает два значения и возвращает NULL, если они совпадают; иначе возвращает первое значение. Полезно для замены «пустых» или «невалидных» данных на NULL.
• DATEPART — извлекает из даты нужную часть (год, месяц, день, час и т.д.) и возвращает её числовым значением; удобно для агрегирования и фильтрации по отдельным компонентам даты.
🔥 — если узнал новое
🤝 — если уже пользовался
➡ SQL Ready | #метод
🖥 Поиск пропусков в данных — контроль качества прямо в скл!
Часто нужно не только считать суммы и средние, но и находить дыры в данных: пустые даты, отсутствующие ID, пропавшие заказы. SQL умеет это делать без скриптов и процедур.
В этом посте:
• Построение календаря для поиска дней без событий.
• Проверка целостности ID и нахождение «дыр».
• Анализ длины пустых промежутков во временных рядах.
🖥 SQL-анализ брошенных корзин и упущенной выручки!
Корзина есть, товары добавлены, но заказ так и не оформлен. Это и есть «брошенные» корзины, которые напрямую означают потерянные деньги.
Сегодня в задаче:
• Находим корзины, по которым заказ не был создан в течение 24 часов;
• Считаем их стоимость;
• Получаем статистику по пользователям, какой средний чек и сколько денег «ушло в никуда».
🖥 Функции для работы с массивами!В этой шпаргалке собраны 8 методов для сбора, развертывания, подсчёта и преобразования массивов и строк. Короткие примеры помогут быстро ориентироваться в аналитических запросах и готовить данные для отчётов, API или BI-инструментов.
➡️ SQL Ready | #шпора
🖥 Накопительные итоги — running totals без циклов!
Хотите видеть, как растут продажи день за днём или отслеживать баланс по пользователям? С функциями SQL можно посчитать нарастающий итог прямо в одном запросе.
Сегодня в посте:
• Считаем общий running total по датам.
• Считаем накопительные суммы отдельно для каждого пользователя.
• Контролируем диапазон расчёта с ROWS BETWEEN.
ALL и ANY в SQL — учимся использовать для сравнения с подзапросами!
Эти операторы предназначены для сравнения результатов одного SELECT с результатами второго SELECT из подзапроса, что может быть удобно в некоторых случаях: если подзапрос возвращает небольшое количество строк или когда нужно сравнить значение хотя бы с одним значением из подзапроса.
Представим, что нам нужно найти все продукты, цена которых выше, чем цена любого продукта в категории Discount:
SELECT product, price
FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Discount');
SELECT DISTINCT customer_id
FROM orders
WHERE product_id = ANY (SELECT product_id FROM products WHERE price > 1000);
SELECT DISTINCT customer_id
FROM orders
WHERE product_id = ANY (SELECT product_id FROM products WHERE category = 'Electronics');
ALL и ANY возможно только с подзапросами и может быть неэффективным, если подзапрос возвращает большое количество строк.
🖥 Полезнейшая статья от TheCode, где показано, как собрать полноценный проект с использованием SQLite!
В этой статье:• SQLite в браузере с помощью sql.js• Веб-приложение с локальным сохранением данных• Интерфейс с поддержкой SQL-запросов
🔊 Советую прочитать на TheCode!
🖥 INSERT ON CONFLICT — решаем конфликты элегантно!
INSERT ON CONFLICT очень полезен в случаях, когда нужно вставить новую запись в таблицу, но если запись с таким же уникальным ключом уже существует — нужно обновить эту запись.
Следует использовать:
• Для сокращения запросов — когда вместо двух запросов (SELECT + INSERT/UPDATE) нужно выполнить только один.
• Для оптимизации — производительности и минимизации количества запросов к базе данных.
• Для конкурентный доступа — когда нужно избежать проблем с конкурентным доступом.
Materialized Views — решение для сложных аналитических запросов!
Материализованные представления — это отдельная структура, скажем с данными о продажах за последний месяц, использование которой позволяет разгрузить основную таблицу и значительно ускорить сложные аналитические запросы.
Синтаксис создания представления:
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
DATE_TRUNC('day', order_date) AS sale_day,
SUM(amount) AS total_sales
FROM orders
WHERE created_at > NOW - INTERVAL '30 days'
DATE_TRUNC используем для округления момента продажи до дня, чтобы затем группировать продажи по дням:GROUP BY DATE_TRUNC('day', order_date);REFRESH MATERIALIZED VIEW daily_sales_summary;
Materialized views физически сохраняются на диске и занимают место. Используйте этот инструмент, если ваши аналитические запросы действительно сложные и выполняются медленно.
😮 Добавлена новая база слитых курсов на 800ГБ:
Python:
/channel/+p3Xjk1JM6-RhMDYy
Программирование:
/channel/+mF35K2cer3VhNzMy
Графика и дизайн:
/channel/+VU3Y96_H5Xs0Y2Vi
Frontend и Web:
/channel/+RE1oXzjJznExYTBi
🖥 Фильтруем выборку грамотно — разница WHERE и HAVING
Сегодня поговорим про два метода фильтрации выборки, в чем их разница и когда использовать нужный метод:
• WHERE — фильтрует строки на основе заданного условия. Работает перед агрегацией и предназначен для исключения неподходящих строк.
• HAVING — фильтрует сгруппированные записи, работает с агрегатными функциями после WHERE. Нужен именно для фильтрации групп, а не строк, как WHERE.
🔥 — если узнал новое
🤝 — если уже пользовался
➡ SQL Ready | #метод
👩💻 CS50 - Введение в Программирование (Гарвард)Это введение в основы компьютерных наук, созданный профессором Гарвардского университета Дэвидом Маленки. Он охватывает ключевые концепции программирования и алгоритмов и является одним из самых популярных онлайн-курсов по программированию.
Ссылочка на плейлист: YouTube 🖤
Practice SQL — образовательный сайт для обучения и практики SQL-запросов, предлагающий задачи и проверки в реальном времени.
📌 Оставляю ссылочку: sql-practice.com
➡️ SQL Ready | #ресурс
🖥 Полезная шпаргалка по типам полей в SQL. Полезно помнить, какие есть поля при описании структуры таблицы)В зависимости от данных, хранимых в таблице, нужно разделять их на разные типы. Где-то должно быть поле с датой, а где-то с timestamp. Где-то VARCHAR, а где-то TEXT. Это важно учитывать при работе с DDL в SQL.
➡ SQL Ready | #шпора
🖥 Собираем лояльных клиентов!
Дана таблица заказов интернет-магазина, связанная с таблицей покупателей внешним ключом через customer_id. Задача собрать данные о пользователях, совершивших более 2-х заказов за последнюю неделю.
В этой задаче:
• MIN, MAX, SUM, COUNT — агрегируем данные о пользовательских заказах.
• Используем JOIN — связываем таблицы заказов и пользователей.
• GROUP BY, HAVING и ORDER BY — группируем по покупателям и фильтруем по количеству заказов.
🖥 Индексы — ключ к быстрому SQL. Особенно полезны при большом объёме данных и частых фильтрациях!Правильно выбранный тип и структура индекса значительно ускоряют SELECT-запросы, но могут замедлять INSERT и UPDATE. Всегда проверяй эффективность через EXPLAIN ANALYZE.
➡ SQL Ready | #шпора