Пошук уроків, статей та іншого контенту
WHERE, ORDER BY, LIMIT та агрегатні функції — основний інструмент читання даних із бази.
SELECT name, email FROM users
WHERE created_at > '2026-01-01'
ORDER BY created_at DESC
LIMIT 10;SELECT визначає, які стовпці повернути (чи * для всіх — зручно під час дослідження даних, але в коді застосунку краще явно перелічувати потрібні стовпці, щоб не передавати зайві дані й не ламатись мовчки при зміні схеми таблиці). WHERE фільтрує рядки за умовою, ORDER BY сортує результат, LIMIT обмежує кількість повернутих рядків.
SQL пишеться в порядку SELECT → FROM → WHERE → ORDER BY → LIMIT, але виконується логічно в іншому порядку: спершу FROM (яка таблиця), потім WHERE (фільтрація рядків), потім SELECT (які стовпці лишити), потім ORDER BY і LIMIT. Це пояснює, чому в WHERE не можна посилатись на псевдонім стовпця, оголошений у SELECT того самого запиту, — на момент виконання WHERE цей псевдонім ще не існує.
COUNT, SUM, AVG, MIN, MAX обчислюють одне значення з набору рядків:
SELECT COUNT(*) FROM users; -- скільки всього користувачів
SELECT AVG(price) FROM products; -- середня ціна товару
SELECT MAX(created_at) FROM orders; -- дата останнього замовленняGROUP BY розбиває рядки на групи за значенням стовпця й обчислює агрегатну функцію окремо для кожної групи — наприклад, кількість замовлень на кожного користувача, а не одне загальне число:
SELECT user_id, COUNT(*) AS orders_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5; -- HAVING фільтрує ГРУПИ, WHERE фільтрував би окремі рядки до групуванняWHERE і HAVING виконують схожу роль (фільтрація), але на різних етапах: WHERE відсіює окремі рядки до групування, HAVING — уже готові групи після агрегації. Умову на кшталт COUNT(*) > 5 не можна поставити в WHERE — на етапі WHERE агрегат ще не обчислений.
SELECT * у коді застосунку замість явного переліку потрібних стовпців — передає зайві дані по мережі й мовчки продовжує працювати (можливо, неправильно) навіть коли схема таблиці зміниться.
Спроба використати агрегатну функцію в WHERE замість HAVING — WHERE виконується до групування, коли агрегат ще не має сенсу.
ORDER BY за стовпцем, якого немає в індексі, для великих таблиць — сортування без індексу вимагає повного проходу й впорядкування всіх відповідних рядків у пам'яті (стаття «Індекси в PostgreSQL»).
SELECT читає дані з таблиці, з WHERE для фільтрації окремих рядків, ORDER BY для сортування, LIMIT для обмеження кількості результатів. Агрегатні функції (COUNT, SUM, AVG) обчислюють одне значення з набору рядків, а GROUP BY розбиває рядки на групи для окремої агрегації в кожній — з HAVING, а не WHERE, для фільтрації вже агрегованих груп.