SELECT: базовые запросы
SELECT — основная команда чтения данных из таблиц; WHERE, ORDER BY и LIMIT управляют выборкой.
Почему это важно: SELECT — самая частая операция в backend. Медленные или неправильные SELECT-запросы замедляют API и перегружают БД.
Главная идея
SELECT описывает, какие столбцы нужны, FROM — из какой таблицы, WHERE — какие строки, ORDER BY — в каком порядке, LIMIT — сколько.
Как это выглядит на практике
- SELECT * FROM users возвращает все строки и столбцы таблицы users.
- WHERE email = 'user@example.com' фильтрует по конкретному значению.
- ORDER BY created_at DESC сортирует по дате создания от новых к старым.
- LIMIT 20 OFFSET 40 возвращает 20 строк, пропустив первые 40 — пагинация.
Что происходит под капотом
- Порядок выполнения SQL: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT.
- SELECT * читает все столбцы, включая ненужные — для production-кода лучше перечислять конкретные.
- LIKE '%pattern%' не использует индексы и медленен на больших таблицах.
- EXPLAIN или EXPLAIN ANALYZE показывает план выполнения запроса и помогает найти узкие места.
Типичные ошибки и заблуждения
- Ошибка: ORDER BY без LIMIT даёт стабильный порядок. Без явной сортировки порядок строк не гарантирован.
- Ошибка: SELECT * — удобный вариант для production. Это создаёт риск утечки данных и перегружает сеть.
- Ошибка: WHERE id = '5' и WHERE id = 5 — одно и то же. Несовпадение типов может вызвать неявное приведение и потерю индекса.
- Ошибка: LIMIT ускоряет запрос. LIMIT только ограничивает вывод; без индекса БД всё равно сканирует всю таблицу.
Ключевые выводы
- WHERE фильтрует строки; используйте конкретные условия для работы с индексами.
- ORDER BY + LIMIT — основа пагинации.
- SELECT * опасен в production: перечисляйте нужные столбцы.
- EXPLAIN помогает понять, как БД выполняет запрос.
Термины урока
Связь с работой backend-разработчика
В ORM (ActiveRecord, SQLAlchemy) каждый вызов .where, .order, .limit в итоге генерирует SQL. Умение читать и писать SQL вручную помогает оптимизировать медленные запросы.
Мини-разбор реальной ситуации
Эндпоинт /api/users возвращает список пользователей. Без LIMIT он возвращает все 500 000 строк, что роняет сервер. Добавление LIMIT 50 и пагинации через OFFSET решает проблему.
Что запомнить
- Всегда указывайте LIMIT в запросах, которые возвращают списки.
- WHERE должен использовать проиндексированные столбцы для производительности.
- EXPLAIN — ваш инструмент диагностики медленных запросов.
Итог
SELECT — это язык общения с базой данных. Правильные фильтры, сортировка и лимиты — основа производительного backend.