Выборка строк

SELECT, WHERE, ORDER BY и LIMIT — достать из таблицы нужные колонки и строки в нужном порядке.

Запрос SELECT достаёт данные из таблицы: какие колонки показать — после SELECT, из какой таблицы — после FROM.

SELECT name, price
FROM products;

SELECT * выводит все колонки. Это удобно, чтобы посмотреть на таблицу, но в рабочих запросах колонки лучше перечислять: видно, что именно нужно, и запрос не изменится, когда в таблицу добавят колонку.

Какие строки — WHERE

Условие в WHERE проверяется для каждой строки, и в результат попадают только те, где оно истинно. Сравнения — =, <> (не равно), <, <=, >, >=. Несколько условий соединяют через AND и OR, список значений — IN (…), диапазон — BETWEEN a AND b (обе границы входят). Строки и даты пишут в одинарных кавычках: 'Казань'.

SELECT name, price, stock
FROM products
WHERE price < 2000 AND stock > 0;

AND выполняется раньше OR — как умножение раньше сложения. Если в условии есть и то и другое, ставьте скобки: WHERE (category_id = 2 OR category_id = 3) AND price > 30000.

Пустое значение в таблице — NULL. Его проверяют не через =, а так: email IS NULL — почты нет, email IS NOT NULL — почта есть. Почему = NULL не работает, разберём в последнем блоке.

Поиск по части строки — LIKE

В шаблоне % — сколько угодно любых символов, _ — ровно один символ. LIKE различает большие и маленькие буквы, ILIKE — нет.

SELECT name
FROM products
WHERE name ILIKE '%книга%';

ILIKE — расширение PostgreSQL: в стандарте SQL его нет, и не во всякой СУБД он есть. Способ, который работает везде, — привести строку к маленьким буквам функцией lower() и искать маленькими: lower(name) LIKE '%книга%'. upper() делает наоборот — переводит в большие.

Порядок — ORDER BY

Без ORDER BY PostgreSQL отдаёт строки в каком угодно порядке, и от запуска к запуску он может меняться. По возрастанию — ASC (так по умолчанию), по убыванию — DESC. Колонок сортировки может быть несколько: вторая решает, когда в первой значения равны.

Сколько строк — LIMIT и OFFSET

LIMIT 5 оставляет первые пять строк результата, OFFSET 10 пропускает первые десять. Без ORDER BY «первые пять» — случайные пять.

SELECT name, price
FROM products
ORDER BY price DESC, name
LIMIT 5;

Примеры можно выполнить — кнопка под каждым. Все таблицы базы и их колонки — в панели «Таблицы базы».

Задачи

  1. Задача 1. Все категории
  2. Задача 2. Клиенты из Казани
  3. Задача 3. Дешевле тысячи
  4. Задача 4. Закончились на складе
  5. Задача 5. Дорогие смартфоны и ноутбуки
  6. Задача 6. Все наушники
  7. Задача 7. Вторая страница каталога
  8. Задача 8. Пять самых дорогих