SQL Ready | Базы Данных
15.4K subscribers
1.2K photos
66 videos
2 files
580 links
Авторский канал про Базы Данных и SQL
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3QREBc

Реклама на бирже: https://telega.in/c/sql_ready
Download Telegram
🖥 SQL-лотерея: угадай число!

Сегодня будем играть! База данных “задумывает” число от 1 до 10, а ты делаешь три попытки угадать его.

В задаче:
Используем RANDOM() и FLOOR() для генерации числа;

Проверяем догадки через CASE WHEN;

Добавляем счётчик успехов, чтобы узнать, повезло ли на этот раз.


Так SQL превращается в мини-игру с логикой, состоянием и элементом удачи.

➡️ SQL Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥10👍9
🖥 Индексы ускоряют запросы, но жрут место!

Если таблица огромная, а фильтр почти всегда одинаковый — зачем индексировать всё подряд?

Вместо обычного индекса создаём частичный (partial index):
CREATE INDEX ON orders (user_id)
WHERE status = 'pending';


Так индекс строится только для строк, где status = 'pending'. Остальные записи не попадают, база хранит меньше, ищет быстрее.

Теперь этот запрос:
SELECT * FROM orders
WHERE status = 'pending' AND user_id = 42;


🔥 Применяйте partial index для активных заказов, незавершённых задач, непрочитанных сообщений. Там, где фильтр стабильно повторяется.

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤝8🔥71
TRANSACTION ISOLATION LEVEL — управление конкурентным доступом!

Когда несколько транзакций работают с одними данными, возможны проблемы. Уровень изоляции определяет, насколько строго СУБД защищает данные от таких эффектов.

Пример настройки перед транзакцией (зависит от СУБД):
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT * FROM accounts WHERE id = 1;


Основные Уровни:

READ UNCOMMITTED — минимальная защита, возможны «грязные» чтения:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;


READ COMMITTED — предотвращает грязные чтения, но допускает неповторяемые и фантомные:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;


REPEATABLE READ — одни и те же строки возвращают одинаковые значения в рамках транзакции (поведение с фантомами зависит от СУБД):
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;


SERIALIZABLE — максимальная изоляция: транзакции выполняются так, будто идут строго последовательно.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;


🔥 Правильный уровень изоляции обеспечивает предсказуемость и надёжность даже при высокой конкуренции.

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍7🤝7
🖥 UPSERT — вставка и обновление в одном запросе!

insert ... on conflict позволяет вставить данные и одновременно обработать дубликаты без дополнительных проверок. Если запись уже существует, то выполняется обновление, если нет - добавляется новая.

Сегодня в посте:
Как работает on conflict и псевдотаблица excluded;

Как обновлять только изменившиеся поля;

Как писать лаконичные и надёжные операции без лишних запросов.


Всё происходит атомарно, в одном шаге и без лишней логики на стороне приложения.

➡️ SQL Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1311🔥9👎1
7🔥6👍5🤝1
Что же выведет консоль?
Anonymous Quiz
40%
A
17%
B
18%
C
24%
D
🔥136👍6🤝1
🖥 Создание и изменение структуры (DDL)

В этой шпаргалке собраны основные команды языка определения данных, используемые для создания, изменения и удаления объектов базы данных: таблиц, столбцов, индексов и других элементов структуры. Они формируют архитектуру базы и позволяют гибко управлять её схемой.

➡️ SQL Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍186🔥6
Индекс по выражению — ускоряй запросы без изменения схемы!

Часто запросы не используют индекс, хотя поле индексировано.

Причиной может быть функция в условии:
SELECT * FROM users WHERE lower(email) = 'admin@example.com';


Даже если email проиндексирован, lower(email) ломает возможность использовать индекс.

Вариант решения - индекс по выражению (expression index):
CREATE INDEX users_lower_email_idx
ON users ((lower(email)));


Проверить можно через план запроса:
EXPLAIN ANALYZE
SELECT * FROM users WHERE lower(email) = 'admin@example.com';


🔥 Теперь в плане Index Scan, а не Full Table Scan.

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍147🔥7👎1