Проверка совпадений сразу по нескольким полям одной операцией!
Когда нужно сравнить строки по составному ключу, многие пишут условия с AND, которые хуже читаются и сложнее поддерживаются:
SQL умеет сравнивать кортежи целиком (row value), поэтому несколько колонок можно проверить одним выражением:
Поддержка зависит от СУБД. Учитывайте поведение
🔥 Это особенно полезно при фильтрации, дедупликации, проверке попадания в списки, синхронизации таблиц и миграциях данных.
➡️ SQL Ready | #совет
Когда нужно сравнить строки по составному ключу, многие пишут условия с AND, которые хуже читаются и сложнее поддерживаются:
u.email = b.email AND u.phone = b.phone
SQL умеет сравнивать кортежи целиком (row value), поэтому несколько колонок можно проверить одним выражением:
(email, phone)
Поддержка зависит от СУБД. Учитывайте поведение
NULL и наличие составных индексов, оптимизация не всегда идентична AND.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤝9❤8🔥1
Дедупликация с приоритетом, оставляем лучшую строку!
Когда есть дубликаты по ключу (например, email), нужно сохранить запись с максимальным приоритетом — подтверждённую или самую новую.
Таблица: users(id, email, is_verified, created_at)
Сначала можно увидеть, какая строка будет считаться главной. Нумеруем строки внутри каждого email по приоритету:
Оконная функция делит строки по email и присваивает номер согласно приоритету, где подтверждённые и более новые записи идут первыми.
Оставим только одну запись на email — ту, у которой rn = 1:
Все остальные строки в каждой группе автоматически становятся дублями.
В PostgreSQL можно сделать то же самое короче:
Здесь ORDER BY фактически задаёт правило выбора победителя внутри каждой группы. СУБД оставит одну строку на email согласно приоритету сортировки.
🔥 Такой приём используют при очистке импортов, объединении источников данных и выборе канонической записи пользователя.
➡️ SQL Ready | #практика
Когда есть дубликаты по ключу (например, email), нужно сохранить запись с максимальным приоритетом — подтверждённую или самую новую.
Таблица: users(id, email, is_verified, created_at)
Сначала можно увидеть, какая строка будет считаться главной. Нумеруем строки внутри каждого email по приоритету:
SELECT id, email,
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY is_verified DESC, created_at DESC
) rn
FROM users;
Оконная функция делит строки по email и присваивает номер согласно приоритету, где подтверждённые и более новые записи идут первыми.
Оставим только одну запись на email — ту, у которой rn = 1:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY is_verified DESC, created_at DESC
) rn
FROM users
) t
WHERE rn = 1;
Все остальные строки в каждой группе автоматически становятся дублями.
В PostgreSQL можно сделать то же самое короче:
SELECT DISTINCT ON (email)
id, email, is_verified, created_at
FROM users
ORDER BY email, is_verified DESC, created_at DESC;
Здесь ORDER BY фактически задаёт правило выбора победителя внутри каждой группы. СУБД оставит одну строку на email согласно приоритету сортировки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤10🔥8
Основные функции и приёмы работы с календарными значениями в Oracle: получение текущих даты и времени на стороне БД, вычисление интервалов, смещение по месяцам, усечение до нужной гранулярности, извлечение компонентов даты, а также корректное преобразование строк в DATE и TIMESTAMP. Полезно для отчётов, аналитики, планирования, ETL-процессов и любой логики, связанной с датами и временем.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍10🤝7❤2
В этой статье:
• Показано, как реализовать полноценную игру, от хранения состояния до рендеринга 3D-сцены — средствами одной лишь базы данных;
• Разобрана архитектура, игровой цикл на транзакциях и многопользовательская синхронизация через SQL;
• На реальном проекте демонстрируются неожиданные возможности СУБД далеко за пределами типичных CRUD-задач.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥10🤝8
🔥13❤8👍7🤝3
Например, когда отправляешь
SELECT, UPDATE или другой SQL, СУБД сначала обрабатывает его внутренне, а уже потом выполняет.На схеме — путь запроса: приём — разбор (парсер) — оптимизация — выполнение — доступ к данным — буферы, транзакции и блокировки — чтение/запись (память или диск).
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥9👍8
Каналы с IT мероприятиями
Подписывайся,
чтобы не пропустить
1. IT мероприятия для стажеров и студентов
2. IT мероприятия по РФ
3. IT мероприятия и хакатоны
4. Бесплатные IT мероприятия
5. IT мероприятия онлайн
6. IT мероприятия Москва
7. IT мероприятия Санкт-Петербург
Please open Telegram to view this post
VIEW IN TELEGRAM
Анти-JOIN — как корректно выбирать строки без связанных записей!
Частая задача в SQL — найти строки, для которых отсутствуют связанные записи в другой таблице. Это классический anti-join. Например, нужно получить клиентов, которые ни разу не сделали заказ.
Таблицы:
Проверять нужно гарантированно
Запрос напрямую выражает отсутствие строк. В простом случае он эквивалентен
Почему не
Если подзапрос возвращает хотя бы один
Нюанс с условиями в
Этот запрос ищет клиентов без заказов после указанной даты.
Если требуется найти клиентов вообще без заказов, добавлять условия в
🔥 Минимально необходим индекс
➡️ SQL Ready | #практика
Частая задача в SQL — найти строки, для которых отсутствуют связанные записи в другой таблице. Это классический anti-join. Например, нужно получить клиентов, которые ни разу не сделали заказ.
Таблицы:
customers(id, name)
orders(id, customer_id, created_at)
LEFT JOIN + IS NULL:SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
WHERE o.id IS NULL;
LEFT JOIN возвращает всех клиентов. Если совпадений нет, поля из orders становятся NULL, и фильтр оставляет только клиентов без заказов.Проверять нужно гарантированно
NOT NULL колонку правой таблицы (обычно PK, например o.id), иначе возможны логические ошибки.NOT EXISTS (предпочтительно):SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
Запрос напрямую выражает отсутствие строк. В простом случае он эквивалентен
LEFT JOIN, но лучше отражает намерение, устойчив к NULL в подзапросе и часто даёт более предсказуемый план при усложнении условий. Почему не
NOT IN:SELECT c.id, c.name
FROM customers c
WHERE c.id NOT IN (
SELECT customer_id
FROM orders
);
Если подзапрос возвращает хотя бы один
NULL, результат может стать пустым из-за трёхзначной логики SQL. Использовать этот вариант безопасно только при гарантированном NOT NULL в orders.customer_id.Нюанс с условиями в
JOIN:SELECT c.id
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
AND o.created_at >= DATE '2026-01-01'
WHERE o.id IS NULL;
Этот запрос ищет клиентов без заказов после указанной даты.
Если требуется найти клиентов вообще без заказов, добавлять условия в
JOIN нельзя — это меняет бизнес-смысл. В таком случае корректнее использовать NOT EXISTS.orders(customer_id). При частой фильтрации по дате логичен составной индекс (customer_id, created_at).Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍9🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Этот репозиторий содержит структурированные задания, схемы баз данных и примеры SQL-запросов из курса на Stepik. Материалы охватывают работу с таблицами, фильтрацию, JOIN, группировки, агрегаты и другие ключевые темы языка, с акцентом на практику. Отличный ресурс для тех, кто хочет закрепить теорию через задачи.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤10👍10
"Как стать независимыми от зарубежных систем управления базами данных (СУБД)?"
Этот вопрос сегодня остро стоит не только перед банками и финтех-компаниями, но и перед промышленными, торговыми, сервисными и государственными организациями.
💡Если такие вопросы возникают и у вас, приглашаем на вебинар от Диасофт и Ассоциации ФинТех (АФТ) на тему "Digital Q.DataBase: современный путь перехода с MS SQL Server и Oracle".
10 марта в 12:00 эксперты расскажут, как Digital Q.DataBase помогает перенести промышленные решения с MS SQL Server и Oracle, сохранив привычную логику и SQL-код. Они также представят новые возможности СУБД и расскажут практический кейс (историю успеха!) 🚀
💌Принимайте приглашение и регистрируйтесь по ссылке!
#реклама
О рекламодателе
Этот вопрос сегодня остро стоит не только перед банками и финтех-компаниями, но и перед промышленными, торговыми, сервисными и государственными организациями.
💡Если такие вопросы возникают и у вас, приглашаем на вебинар от Диасофт и Ассоциации ФинТех (АФТ) на тему "Digital Q.DataBase: современный путь перехода с MS SQL Server и Oracle".
10 марта в 12:00 эксперты расскажут, как Digital Q.DataBase помогает перенести промышленные решения с MS SQL Server и Oracle, сохранив привычную логику и SQL-код. Они также представят новые возможности СУБД и расскажут практический кейс (историю успеха!) 🚀
💌Принимайте приглашение и регистрируйтесь по ссылке!
#реклама
О рекламодателе
❤2
Почему OFFSET может ломать производительность пагинации?
Даже если вы не видите эти строки, СУБД всё равно читает их из индекса или таблицы, поэтому время выполнения растёт вместе с
Эффективнее использовать
Такой запрос использует индекс напрямую (если id индексирован, обычно это PK), поэтому работает одинаково быстро на первой и на миллионной странице.
Если сортировка не уникальная (например
🔥 Такой подход широко используется в больших системах: API, лентах событий, лог-системах и бесконечных скроллах.
➡️ SQL Ready | #совет
OFFSET выглядит удобно для страниц, но база всё равно должна просканировать и пропустить все предыдущие строки. Поэтому чем дальше страница, тем медленнее запрос:OFFSET 100000
Даже если вы не видите эти строки, СУБД всё равно читает их из индекса или таблицы, поэтому время выполнения растёт вместе с
OFFSET:SELECT *
FROM orders
WHERE id > :last_seen_id
ORDER BY id
LIMIT 10;
Эффективнее использовать
keyset-pagination — продолжать выборку от последнего значения ключа, а не пропускать строки:WHERE id > :last_seen_id
:last_seen_id — это id последней строки предыдущей страницы.Такой запрос использует индекс напрямую (если id индексирован, обычно это PK), поэтому работает одинаково быстро на первой и на миллионной странице.
Если сортировка не уникальная (например
created_at), добавляйте tie-breaker:ORDER BY created_at, id
WHERE (created_at, id) > (:last_seen_created_at, :last_seen_id)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤9🔥6