Девять из десяти запросов, которые вы напишете в жизни, — это чтение данных: найти заказ, посмотреть статус, проверить, что запись появилась. Всё чтение делается одной командой — SELECT. Она безопасна: сколько ни выполняй, данные не изменятся. Продолжаем на базе магазина с таблицами customers и orders.
SELECT и FROM: что и откуда
Минимальный запрос — «покажи всё из таблицы»:
SELECT * FROM orders;
FROM называет таблицу, SELECT — какие столбцы показать; звёздочка значит «все». На практике чаще перечисляют нужные столбцы явно:
SELECT id, status, amount FROM orders;
Так результат читается легче, а на широких таблицах (по 40 столбцов) это единственный способ не утонуть. Точка с запятой завершает запрос; регистр не важен (select = SELECT), но команды принято писать заглавными — глазу проще отделять их от имён.
WHERE: оставить только нужное
Вся сила запросов — в фильтре WHERE: он оставляет строки, для которых условие истинно.
SELECT id, amount FROM orders WHERE status = 'paid';
Сравнения: =, <> (не равно), >, <, >=, <=. Текстовые значения — в одинарных кавычках: 'paid'. Числа — без кавычек: amount > 1000.
Условия соединяются через AND и OR:
SELECT id FROM orders
WHERE status = 'paid' AND amount > 1000;
С OR внимательнее: AND склеивает сильнее, чем OR, поэтому смешанные условия берите в скобки — WHERE (status = 'created' OR status = 'paid') AND amount > 500 и WHERE status = 'created' OR (status = 'paid' AND amount > 500) — два разных запроса.
Три полезных фильтра сверх сравнений:
IN— значение из списка:WHERE status IN ('created', 'paid')— короче, чем цепочка OR.BETWEEN— диапазон включительно:WHERE amount BETWEEN 500 AND 1500.LIKE— поиск по шаблону в строках:WHERE email LIKE '%@gmail.com'. Процент означает «любые символы»:'анна%'— начинается с «анна»,'%анна%'— содержит «анна». В PostgreSQL есть регистронезависимый вариантILIKE— для поиска по именам и почтам обычно нужен именно он.
ORDER BY и LIMIT: порядок и порция
Без явной сортировки база возвращает строки в непредсказуемом порядке — сегодня так, завтра иначе. Нужен порядок — скажите об этом:
SELECT id, amount FROM orders
ORDER BY amount DESC
LIMIT 10;
ORDER BY amount DESC — по убыванию суммы (ASC — по возрастанию, он по умолчанию). LIMIT 10 — только первые десять строк. Вместе это «топ-10 самых дорогих заказов» — и одновременно защита: если в таблице миллионы строк, запрос без LIMIT будет тащить их все.
Сортировать можно по нескольким столбцам: ORDER BY status, amount DESC — сначала группировка по статусу, внутри — по убыванию суммы.
Где это применяется
SELECT … FROM … WHERE … — рабочая лошадка на каждый день: проверить, что заказ из интерфейса действительно создался; убедиться, что после отмены статус сменился; найти пользователя по кусочку почты через LIKE; глянуть последние записи через ORDER BY created_at DESC LIMIT 20. Как только вы перестаёте просить разработчика «посмотри в базе, а?» и смотрите сами — скорость вашей работы меняется скачком.
Где спотыкаются начинающие:
- Двойные кавычки вместо одинарных.
WHERE status = "paid"во многих СУБД — ошибка: двойные кавычки — для имён столбцов, одинарные — для значений. - Сравнение без учёта регистра и пробелов.
'Paid','paid'и'paid '— три разных значения. Не находится очевидное — проверьте регистр и хвостовые пробелы. - Полагаются на «естественный» порядок строк. Без ORDER BY порядок не гарантирован — «вчера первая строка была другой» не баг базы, а отсутствие сортировки в запросе.
Что учить дальше. Настоящие данные размазаны по нескольким таблицам: имя клиента — в одной, его заказы — в другой. Собирать их вместе учит JOIN.