← К оглавлению занятия

🐛 Типичные ошибки

⚡ Кратко: ошибки

  • LIMIT без ORDER BY — результат непредсказуем.
  • Путаница с OFFSET: OFFSET 10 пропускает 10 строк, а не страниц.
  • DISTINCT распространяется на всю выбранную строку, а не на один столбец.
1

Ошибка: LIMIT без ORDER BY

Без сортировки СУБД может возвращать строки в разном порядке при каждом выполнении.

-- Непредсказуемо
SELECT product_name, standard_cost
FROM products
LIMIT 5;

Как исправить:

-- Предсказуемо
SELECT product_name, standard_cost
FROM products
ORDER BY standard_cost ASC
LIMIT 5;
2

Ошибка: OFFSET считается страницами

OFFSET задаёт количество строк, не страниц.

-- Неправильно: пропустит всего 2 строки, а не 2 страницы по 10
SELECT product_name
FROM products
ORDER BY product_name ASC
LIMIT 10 OFFSET 2;

Как исправить: для страницы N используйте OFFSET (N - 1) * page_size.

-- Вторая страница по 10 товаров
SELECT product_name
FROM products
ORDER BY product_name ASC
LIMIT 10 OFFSET 10;
3

Ошибка: неправильное понимание DISTINCT

DISTINCT уникализирует всю строку, а не отдельный столбец.

-- Неправильно ожидание: "уникальные города с именами"
-- На самом деле уникальными будут пары (city, first_name)
SELECT DISTINCT city, first_name
FROM customers;

Как исправить: указывайте только те столбцы, комбинацию которых хотите сделать уникальной.

SELECT DISTINCT city
FROM customers;
4

Ошибка: ORDER BY по столбцу, которого нет в SELECT DISTINCT

В некоторых СУБД (например, PostgreSQL) нельзя сортировать по столбцу, не входящему в DISTINCT-выборку, потому что он не определяет уникальность строк.

-- Может вызвать ошибку в PostgreSQL
SELECT DISTINCT city
FROM customers
ORDER BY first_name;

Как исправить: сортируйте по столбцам из SELECT или уберите DISTINCT.

SELECT DISTINCT city
FROM customers
ORDER BY city;