Путаница с 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;