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 или HR
CТолько строки с dept = 'IT'
DОшибку синтаксиса
2. Почему для надёжной пагинации обязателен ORDER BY?
ALIMIT не работает без ORDER BY
BБез сортировки порядок строк не гарантирован, и страницы могут перемешаться
COFFSET требует индекса
DЭто ускоряет запрос
3. Как отсортировать по dept по возрастанию, а внутри отдела по зарплате по убыванию?
AORDER BY dept, salary
BORDER BY dept ASC, salary DESC
CORDER BY salary DESC, dept ASC
DORDER BY dept DESC, salary ASC
Поддержать проект