Напиши SQL-запрос для выгрузки всех активных подписок пользователей, у которых баланс менее 100 рублей.

## SQL-запрос для выгрузки активных подписок с балансом менее 100 рублей

Для решения задачи предположим стандартную схему базы данных с двумя таблицами:
— **users** — содержит данные о пользователях: `id`, `name`, `email`, `balance`
— **subscriptions** — содержит данные о подписках: `id`, `user_id`, `plan_name`, `status`, `start_date`, `end_date`

### Основной SQL-запрос

sql
SELECT
u.id AS user_id,
u.name AS user_name,
u.email AS user_email,
u.balance,
s.id AS subscription_id,
s.plan_name,
s.status,
s.start_date,
s.end_date
FROM users u
INNER JOIN subscriptions s ON s.user_id = u.id
WHERE s.status = ‘active’
AND u.balance < 100
ORDER BY u.balance ASC;

### Пояснение к запросу

— **INNER JOIN** — объединяет таблицы пользователей и подписок по полю `user_id`.
— **WHERE s.status = 'active'** — фильтрует только активные подписки.
— **AND u.balance < 100** — оставляет только тех пользователей, у которых баланс строго меньше 100 рублей.
— **ORDER BY u.balance ASC** — сортирует результат от наименьшего баланса к наибольшему, что удобно для приоритизации.

### Строка заголовка для CSV

Для будущего CSV-файла строка заголовков будет выглядеть так:

user_id,user_name,user_email,balance,subscription_id,plan_name,status,start_date,end_date

### Экспорт в CSV через SQL (PostgreSQL)

Если вы используете PostgreSQL, можно выгрузить результат напрямую:

sql
COPY (
SELECT
u.id,
u.name,
u.email,
u.balance,
s.id,
s.plan_name,
s.status,
s.start_date,
s.end_date
FROM users u
INNER JOIN subscriptions s ON s.user_id = u.id
WHERE s.status = 'active'
AND u.balance < 100
ORDER BY u.balance ASC
) TO '/tmp/active_subscriptions_low_balance.csv'
WITH (FORMAT CSV, HEADER TRUE, DELIMITER ',');

### Для MySQL

sql
SELECT
u.id, u.name, u.email, u.balance,
s.id, s.plan_name, s.status, s.start_date, s.end_date
FROM users u
INNER JOIN subscriptions s ON s.user_id = u.id
WHERE s.status = 'active'
AND u.balance < 100
INTO OUTFILE '/tmp/active_subscriptions.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n';

### Рекомендации

— Убедитесь, что поле `balance` хранится в числовом типе (`DECIMAL`, `NUMERIC`, `FLOAT`), а не в строковом.
— Если у одного пользователя может быть несколько активных подписок, все они попадут в выборку — это корректное поведение.
— Для больших таблиц добавьте индексы на `subscriptions.status` и `users.balance` для ускорения запроса.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.