SELECT, WHERE, ORDER BY, LIMIT

Освежаем выборку данных и сразу пробуем фильтры и сортировку в живой песочнице.

SELECT — основная команда чтения: она выбирает столбцы, фильтрует строки условием, сортирует результат и ограничивает его размер.

Готовим данные для экспериментов

Создадим таблицу сотрудников — на ней мы будем тренироваться весь урок. Пример полностью переносимый, запускайте и меняйте условия.

CREATE TABLE staff (
    id     INTEGER PRIMARY KEY,
    name   TEXT,
    dept   TEXT,
    salary INTEGER
);

INSERT INTO staff (id, name, dept, salary) VALUES
    (1, 'Анна',   'IT',       120000),
    (2, 'Борис',  'IT',       95000),
    (3, 'Вера',   'Продажи',  80000),
    (4, 'Глеб',   'Продажи',  85000),
    (5, 'Дина',   'HR',       70000);

SELECT name, salary FROM staff;

Вывод:

Анна|120000
Борис|95000
Вера|80000
Глеб|85000
Дина|70000

Фильтрация: WHERE

WHERE отбирает строки по условию. Условия комбинируются через AND, OR, NOT.

SELECT name, dept, salary
FROM staff
WHERE dept = 'IT' AND salary > 100000;

Вывод:

Анна|IT|120000

Полезные операторы для WHERE: IN (...) — значение из списка, BETWEEN a AND b — диапазон, LIKE — поиск по шаблону, IS NULL — проверка на пустоту.

SELECT name, dept
FROM staff
WHERE dept IN ('IT', 'HR')
  AND salary BETWEEN 70000 AND 100000;

Вывод:

Борис|IT
Дина|HR

Сортировка: ORDER BY

ORDER BY упорядочивает результат. ASC — по возрастанию (по умолчанию), DESC — по убыванию. Можно сортировать по нескольким столбцам.

SELECT name, dept, salary
FROM staff
ORDER BY dept ASC, salary DESC;

Вывод:

Дина|HR|70000
Анна|IT|120000
Борис|IT|95000
Глеб|Продажи|85000
Вера|Продажи|80000

Сначала строки сгруппировались по отделу (по алфавиту), а внутри отдела — по убыванию зарплаты.

Ограничение: LIMIT и OFFSET

LIMIT ограничивает число строк, OFFSET пропускает первые N. Вместе это даёт постраничную выборку (пагинацию).

-- Топ-2 по зарплате
SELECT name, salary
FROM staff
ORDER BY salary DESC
LIMIT 2;

Вывод:

Анна|120000
Борис|95000

Чтобы получить «вторую страницу» по 2 записи, добавьте OFFSET 2. Важно: без ORDER BY порядок строк не гарантирован, поэтому пагинацию всегда делают с явной сортировкой.

Итог

  • WHERE фильтрует строки; операторы IN, BETWEEN, LIKE, IS NULL расширяют условия.
  • ORDER BY сортирует (ASC/DESC), можно по нескольким столбцам.
  • LIMIT и OFFSET ограничивают и пропускают строки; для стабильной пагинации нужен ORDER BY.
Проверьте себя
1. Что вернёт запрос с WHERE dept IN ('IT', 'HR')?
AСтроки, где dept не равен IT и HR
BТолько строки с dept = 'IT'
CСтроки, где dept равен IT или HR
DОшибку синтаксиса
2. Почему для надёжной пагинации обязателен ORDER BY?
ALIMIT не работает без ORDER BY
BOFFSET требует индекса
CЭто ускоряет запрос
DБез сортировки порядок строк не гарантирован, и страницы могут перемешаться
3. Как отсортировать по dept по возрастанию, а внутри отдела по зарплате по убыванию?
AORDER BY dept ASC, salary DESC
BORDER BY dept, salary
CORDER BY salary DESC, dept ASC
DORDER BY dept DESC, salary ASC