SQL Portal | Базы Данных
13.7K subscribers
1.1K photos
142 videos
51 files
800 links
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
Варианты:
Anonymous Quiz
37%
A
63%
B
SQL-фишка, о которой знают далеко не все

А вы знали, что внутри transaction можно создавать контрольные точки с помощью SAVEPOINT? Обычный ROLLBACK отменяет всю transaction. А SAVEPOINT позволяет создать точку, к которой можно откатиться, отменив только изменения, сделанные после неё.

Без SAVEPOINT:
BEGIN;

INSERT INTO orders VALUES (1, 'Laptop');
INSERT INTO payments VALUES (1, 'FAILED');

-- Что-то пошло не так
ROLLBACK;

В этом случае будут отменены и заказ, и платёж.

С SAVEPOINT:
BEGIN;

INSERT INTO orders VALUES (1, 'Laptop');

SAVEPOINT before_payment;

INSERT INTO payments VALUES (1, 'FAILED');

-- Платёж не прошёл
ROLLBACK TO SAVEPOINT before_payment;

-- Пробуем другой способ оплаты
INSERT INTO payments VALUES (1, 'SUCCESS');

COMMIT;


Теперь можно откатить только неудачную часть transaction и продолжить работу с последней безопасной точки.

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

SAVEPOINT не предотвращает ошибку. Он просто помогает не откатывать всю работу из-за одной неудачной операции.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Проверка уникальности работает через =, а NULL = NULL не даёт true. По умолчанию NULL не считается уникальным значением.

Postgres не может доказать равенство двух NULL, поэтому пропускает обе строки.

Простой пример, где это ломается, — составной ключ:

-- UNIQUE (user_id, org_id, deleted_at)

INSERT INTO memberships VALUES (1, 10, NULL);
INSERT INTO memberships VALUES (1, 10, NULL);

-- обе строки будут вставлены


В итоге можно получить две активные записи membership для одного и того же пользователя, потому что ограничение уникальности вообще не срабатывает.

NULLS NOT DISTINCT

Начиная с Postgres 15, уникальные ограничения и индексы могут считать NULL равными:

UNIQUE NULLS NOT DISTINCT (user_id, org_id, deleted_at)


Второй INSERT уже завершится ошибкой.

Но это также запретит две строки с одинаковым значением deleted_at, а не только две активные строки.

Частичный уникальный индекс

Если уникальность нужно обеспечить только для активных строк, используйте partial unique index:

CREATE UNIQUE INDEX ON memberships (user_id, org_id)
WHERE deleted_at IS NULL;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
SQL-вопрос:

Что вернёт этот запрос?

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Варианты:
Anonymous Quiz
48%
A
7%
B
4%
C
41%
D
3👍1
Самый чистый способ получить последнюю запись для каждого пользователя

Можно фильтровать результаты window functions, таких как ROW_NUMBER() или RANK(), напрямую — без дополнительного subquery или CTE.

Вместо:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY timestamp DESC
) AS rn
FROM events
)
SELECT *
FROM ranked
WHERE rn = 1;


Можно написать:
SELECT *
FROM events
QUALIFY ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY timestamp DESC
) = 1;


QUALIFY
особенно удобен для deduplication, выбора последних записей и очистки данных. Он заметно уменьшает вложенность запросов и делает SQL проще для чтения. Только не забудьте проверить, поддерживает ли ваша СУБД QUALIFY.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
SQL-вопрос:

Что вернёт этот запрос?

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Варианты:
Anonymous Quiz
9%
A
48%
B
34%
C
9%
D
Уровни владения SQL

А на каком уровне вы?

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
Новые возможности – рядом! Теперь каждый может протестировать бесплатную «коробочную» версию объектного хранилища «S3 Архипелаг» 👨🏻‍💻

🚪Бесплатная версия снижает порог входа для проектов. Что нужно, чтобы начать? Просто скачайте дистрибутив, установите на свои серверы и приступите к работе сразу после авторизации через корпоративный SSO. Готово!

Сам «S3 Архипелаг» от Диасофт – российское S3-совместимое хранилище для работы с петабайтами данных в архитектурах Data Lakehouse, аналитических системах и консолидации разрозненных файловых хранилищ.

Оставляем ссылку на «S3 Архипелаг» 🔗
#реклама
О рекламодателе
Продвинутый планировщик задач, который живёт в экосистеме PostgreSQL

Утилита полностью управляемая через базу без серверных конфигов. Поддерживает пайплайны задач, запуск SQL и внешних команд, умные ретраи после сбоев и контроль параллельного запуска тяжёлых джобов.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
SQL-вопрос:

Как безопасно удалить записи?

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Варианты:
Anonymous Quiz
9%
A
39%
B
48%
C
5%
D
Шпаргалка по изучению SQL

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
UPDATE — оператор обновления данных в MySQL 🗂️

Если в таблице нужно изменить значение в уже существующей строке, используют команду UPDATE. Она позволяет обновлять записи точечно, но важно правильно задать условие: без него изменения могут затронуть всю таблицу.
UPDATE products
SET price = 50500
WHERE id = 1;

Этот запрос меняет значение price только у записи с id = 1.

С помощью UPDATE можно изменить сразу несколько полей:
UPDATE products
SET price = 78500, quantity = 3
WHERE id = 2;

Этот запрос обновляет параметры price и quantity у записи с id = 2.

💡 UPDATE используют, когда нужно:

изменить значение в конкретной записи,
обновить несколько полей за один запрос,
выбрать строки по условию,
массово изменить набор записей.

🔗 SQL — это база для работы с базами.
Если хотите не просто понять одну команду, а уверенно собирать запросы и менять данные без ошибок, регистрируйтесь на бесплатный мини-курс «MySQL для новичков» от Академии Selectel ➡️

Программа состоит из коротких уроков, которые помогут пройти путь от установки и настройки СУБД до создания таблиц, управления пользователями и основных операций с данными.

Реклама. АО "Селектел". erid:2W5zFHrsApy
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Вы создали composite index:
(first_name, last_name, city)


А затем выполнили запрос:
SELECT *
FROM users
WHERE last_name = 'Smith';


Результат? База данных проигнорировала index и выполнила Sequential Scan.

Почему? Разве index не должен использоваться, ведь last_name входит в него?

А что изменится для следующих условий?
WHERE first_name = ?

WHERE first_name = ? AND last_name = ?

WHERE first_name = ? AND city = ?


Понимание порядка столбцов в composite indexes — одна из важнейших тем SQL performance optimization, которую стоит знать каждому backend-разработчику.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1