Основы SQL: SELECT, WHERE, ORDER BY и LIMIT
Основы4 минРедакция Innovialabs
Коротко
Почти любой запрос на чтение строится по схеме SELECT столбцы FROM таблица WHERE условие ORDER BY сортировка LIMIT количество. Освоив эти пять частей, а также LIKE, IN и IS NULL, вы сможете достать из базы большинство нужных данных.
Формула первого запроса
Запрос на чтение данных в SQL почти всегда собирается из одних и тех же частей в фиксированном порядке:
SELECT столбцы
FROM таблица
WHERE условие
ORDER BY сортировка
LIMIT количество;
- SELECT — какие столбцы показать.
- FROM — из какой таблицы.
- WHERE — какие строки оставить.
- ORDER BY — как отсортировать.
- LIMIT — сколько строк вернуть.
Обязательны только SELECT и FROM, остальное добавляется по необходимости. Порядок частей менять нельзя.
Учебная таблица orders
Все примеры ниже — для такой таблицы заказов:
| id | customer | city | status | total | created_at |
|---|---|---|---|---|---|
| 1 | Алия | Ташкент | paid | 450000 | 2026-03-01 |
| 2 | Бобур | Самарканд | new | 120000 | 2026-03-02 |
| 3 | Дилноза | Ташкент | cancelled | 89000 | 2026-03-02 |
| 4 | Евгений | Бухара | paid | 1200000 | 2026-03-03 |
| 5 | Алия | Ташкент | new | NULL | 2026-03-04 |
SELECT: выбираем столбцы
SELECT customer, total FROM orders;
SELECT * вернёт все столбцы. Это удобно для изучения таблицы, но в коде приложения лучше перечислять столбцы явно: так запрос быстрее и не сломается, если в таблицу добавят новые поля.
WHERE: фильтруем строки
SELECT id, customer, total
FROM orders
WHERE status = 'paid' AND total > 300000;
Основные операторы:
- сравнение:
=,<>(не равно),>,<,>=,<=; - логика:
AND,OR,NOT; - диапазон:
total BETWEEN 100000 AND 500000(границы включаются).
Если смешиваете AND и OR, ставьте скобки — AND выполняется раньше:
WHERE city = 'Ташкент' AND (status = 'new' OR status = 'paid')
IN и LIKE
IN заменяет цепочку OR:
SELECT * FROM orders WHERE city IN ('Ташкент', 'Бухара');
LIKE ищет по шаблону: % — любое количество символов, _ — ровно один символ.
SELECT * FROM orders WHERE customer LIKE 'Ал%';
Учтите: в PostgreSQL LIKE чувствителен к регистру (для поиска без учёта регистра есть ILIKE), а в MySQL это зависит от настроек сравнения строк. Шаблон, начинающийся с %, обычно не может использовать обычный индекс и на больших таблицах работает медленно.
NULL: отдельная история
NULL означает «значение неизвестно», а не ноль и не пустую строку. В заказе 5 сумма ещё не посчитана.
-- неправильно: не вернёт ни одной строки
SELECT * FROM orders WHERE total = NULL;
-- правильно
SELECT * FROM orders WHERE total IS NULL;
SELECT * FROM orders WHERE total IS NOT NULL;
Любое сравнение с NULL даёт «неизвестно», поэтому строка не проходит фильтр. Из-за этого WHERE total < 100000 тоже не покажет заказ 5. Если нужно подставить значение по умолчанию, используйте COALESCE(total, 0).
ORDER BY и LIMIT
SELECT customer, total, created_at
FROM orders
WHERE status <> 'cancelled'
ORDER BY total DESC, created_at ASC
LIMIT 3;
ASC— по возрастанию (по умолчанию),DESC— по убыванию.- Можно сортировать по нескольким столбцам: сначала по первому, при равенстве — по второму.
- Куда попадут NULL при сортировке, зависит от СУБД. В PostgreSQL это можно задать явно:
NULLS LAST. LIMITработает в PostgreSQL, MySQL и SQLite. В SQL Server вместо негоTOPилиOFFSET ... FETCH.
Без ORDER BY порядок строк не гарантирован, поэтому LIMIT без сортировки может каждый раз возвращать разные строки.
Частые ошибки начинающих
- Двойные кавычки для текста. Строки пишутся в одинарных:
'paid'. Двойные в стандартном SQL обозначают имена столбцов. = NULLвместоIS NULL.- Забытые скобки при сочетании
ANDиOR. NOT INсо списком, где есть NULL — такой запрос не вернёт ни одной строки.LIMITбезORDER BY— «первые 10» оказываются случайными.- Тестовые запросы на рабочей базе. Пока учитесь, работайте с копией.