SQL — это универсальный язык для взаимодействия с базами данных, который должен знать каждый аналитик, разработчик и дата-инженер. На собеседованиях кандидатам часто предлагают решить практические задачи: написать эффективные запросы, оптимизировать их и предложить решение для конкретных бизнес-кейсов. Давай разберём распространённые типы SQL-задач и эффективные подходы к их решению.
Предыдущее задание:
Постановка задачи
Требуется вывести все рейсы, которые были совершены в период с 10:00 до 14:00 1 января 1900 года. Результирующая таблица должна содержать все поля таблицы рейсов (используется *).
Анализ структуры базы данных
Для решения задачи нам понадобится таблица:
- Trip — содержит информацию о рейсах, включая:
time_out — время вылета (ключевое поле для фильтрации)
Другие поля рейса (номер, модель самолёта, города вылета/прилёта и т.д.)
Детальный разбор решения
SQL-запрос
SELECT *
FROM Trip AS t
WHERE t.time_out >= '1900-01-01 10:00'
AND t.time_out <= '1900-01-01 14:00';
Альтернативный вариант с BETWEEN
SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';
Пошаговое объяснение:
- SELECT * — выбираем все поля таблицы Trip
- FROM Trip AS t — указываем таблицу с алиасом 't' (необязательно в данном случае)
- WHERE — условия фильтрации:
time_out >= '1900-01-01 10:00' — вылет не раньше 10:00
time_out <= '1900-01-01 14:00' — вылет не позже 14:00
Ключевые аспекты решения
1. Работа с датой и временем
Особенности временного интервала:
- Формат даты-времени должен соответствовать стандарту SQL: 'YYYY-MM-DD HH:MM'
- Временные границы включаются в результат (>= и <=)
- Можно использовать более точный формат с секундами
2. Использование BETWEEN
Альтернативный вариант с BETWEEN:
- Более читаемый синтаксис
- Включает граничные значения
- Эквивалентен комбинации >= и <=
3. Выбор всех полей таблицы
Использование SELECT * оправдано, когда:
- Нужны все поля таблицы
- Структура таблицы неизвестна или часто меняется
- В условии задачи явно требуется вывод всех полей
Возможные модификации запроса
1. Сортировка по времени вылета
SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00' AND '1900-01-01 14:00'
ORDER BY time_out;
2. Выбор конкретных полей
Если нужны не все поля:
SELECT trip_no, plane, town_from, town_to, time_out
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00' AND '1900-01-01 14:00';
3. Учёт временных зон
Если нужно учитывать часовой пояс:
Оптимизация запроса
Для улучшения производительности:
- Создать индекс на поле time_out
- Для больших таблиц ограничить выборку дополнительными условиями
- Рассмотреть возможность использования секционирования таблицы по датам
Частые ошибки
- Неправильный формат даты-времени
- Использование только > или < вместо >= и <= (потеря граничных значений)
- Путаница между time_out и time_in
- Неучёт временных зон при работе с распределёнными системами
Дополнительные соображения
- В реальных системах дата 1900 года может быть тестовой или означать "дата не указана"
- Для исторических данных могут быть особенности хранения дат
- Временной интервал можно задавать разными способами:
Через BETWEEN
Через >= и <=
Через диапазон в WHERE с AND
Заключение
Данная задача демонстрирует:
- Основы фильтрации по временным интервалам
- Работу с условиями диапазона
- Особенности сравнения дат и времени в SQL
🔑 Итоговое решение:
SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';
Альтернативное решение:
SELECT *
FROM Trip
WHERE time_out >= '1900-01-01 10:00:00'
AND time_out <= '1900-01-01 14:00:00';