Девять из десяти запросов, которые вы напишете в жизни, — это чтение данных: найти заказ, посмотреть статус, проверить, что запись появилась. Всё чтение делается одной командой — 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.