Фільтрація і Сортування Даних

Вітаю знову.
У попередній лекції ти вивчив типи даних і обмеження.
Ти дізнався, що PostgreSQL не повинен приймати дурниці.
Жодних бананових віків.
Жодних негативних цін.
Жодних дубльованих email.
Жодних загадкових порожніх користувачів, які заходять у базу даних так, ніби це їхня квартира.
Дуже добре.
Сьогодні ми навчимося знаходити саме ті дані, які нам потрібні.
Бо коли таблиця має багато рядків, цього вже недостатньо:
SELECT * FROM products;
Це повертає все.
А іноді тобі не потрібно все.
Тобі потрібно:
- товари дешевші за
100; - користувачі з одного міста;
- активні customers;
- книги, опубліковані після певного року;
- курси, які містять слово
JavaScript; - найдорожчі товари;
- тільки перші пʼять результатів.
Саме тут фільтрація і сортування стають важливими.
База даних корисна не тільки тому, що вона зберігає дані.
База даних корисна тому, що допомагає знайти правильні дані.
Інакше це просто дуже дорога шухляда.
Що Ти Вивчиш
У цій лекції ти вивчиш:
- як фільтрувати рядки через
WHERE; - як працюють оператори порівняння;
- як використовувати
=; - як використовувати
!=; - як використовувати
>; - як використовувати
<; - як використовувати
>=; - як використовувати
<=; - як поєднувати умови через
AND; - як поєднувати умови через
OR; - як шукати текст через
LIKE; - як шукати текст без урахування регістру через
ILIKE; - як сортувати дані через
ORDER BY; - як обмежувати результати через
LIMIT; - як пропускати результати через
OFFSET; - як уникати типових помилок фільтрації.
Наприкінці цієї лекції ти зможеш ставити PostgreSQL більш точні питання.
Не:
Дай мені все.
А:
Дай мені активних customers з Мілана, посортованих за іменем, але тільки перших 10.
Набагато краще.
Набагато професійніше.
Менше крику на базу даних.
Підготуй Базу Даних
Відкрий PostgreSQL:
sudo -iu postgres psql
Підключись до бази даних:
\c learning_postgresql
Якщо цієї бази немає, створи її:
CREATE DATABASE learning_postgresql;
Потім підключись:
\c learning_postgresql
Тепер створи таблицю для цієї лекції.
Ми використаємо products.
Спочатку видали стару таблицю, якщо вона існує:
DROP TABLE IF EXISTS products;
Тепер створи її:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category VARCHAR(100),
price NUMERIC(10, 2) CHECK (price >= 0),
available BOOLEAN DEFAULT true,
rating INTEGER CHECK (rating >= 1 AND rating <= 5)
);
Ця таблиця має:
id;name;category;price;available;rating.
Тепер встав дані:
INSERT INTO products (name, category, price, available, rating)
VALUES
('Laptop', 'Electronics', 900.00, true, 5),
('Mouse', 'Electronics', 25.00, true, 4),
('Keyboard', 'Electronics', 70.00, false, 4),
('Desk Chair', 'Furniture', 150.00, true, 5),
('Notebook', 'Office', 5.00, true, 3),
('Pen', 'Office', 2.00, true, 3),
('Desk Lamp', 'Furniture', 45.00, true, 4),
('Monitor', 'Electronics', 250.00, true, 5),
('Bookshelf', 'Furniture', 120.00, false, 4),
('USB Cable', 'Electronics', 10.00, true, 2);
Перевір дані:
SELECT * FROM products;
Тепер у нас достатньо даних для практики.
Не мільйони рядків.
Але достатньо, щоб PostgreSQL трохи розімʼявся.
Як database yoga.
WHERE
WHERE фільтрує рядки.
Без WHERE PostgreSQL повертає всі рядки:
SELECT * FROM products;
З WHERE PostgreSQL повертає тільки рядки, які відповідають умові:
SELECT * FROM products
WHERE category = 'Electronics';
Це означає:
Дай мені тільки товари, де категорія — Electronics.
Ти маєш побачити товари типу:
- Laptop;
- Mouse;
- Keyboard;
- Monitor;
- USB Cable.
WHERE — одна з найважливіших частин SQL.
Він допомагає ставити конкретні питання.
А конкретні питання дають корисні відповіді.
Дуже життєвий урок.
І дуже SQL.
Фільтрація за Текстом
Щоб фільтрувати за текстом, використовуй одинарні лапки.
Приклад:
SELECT * FROM products
WHERE category = 'Office';
Це повертає товари з категорії Office.
Інший приклад:
SELECT * FROM products
WHERE name = 'Laptop';
Це повертає товар з назвою Laptop.
Важливо:
Текстові значення потребують одинарних лапок.
Правильно:
WHERE name = 'Laptop'
Неправильно:
WHERE name = Laptop
Без лапок PostgreSQL думає, що Laptop — це назва колонки.
PostgreSQL не вгадує.
Це база даних.
Не читач думок.
Фільтрація за Boolean
Boolean-колонки зберігають true або false.
Приклад:
SELECT * FROM products
WHERE available = true;
Це повертає доступні товари.
Можна також знайти недоступні товари:
SELECT * FROM products
WHERE available = false;
Це корисно для значень типу:
- active;
- published;
- completed;
- available;
- verified.
Не зберігай такі дані як текст:
yes
no
maybe
Використовуй BOOLEAN.
Твої запити будуть чистішими.
База даних буде менше протестувати.
Усі виграють.
Майже.
Оператори Порівняння
PostgreSQL дозволяє порівнювати значення.
Популярні оператори порівняння:
= дорівнює
!= не дорівнює
> більше ніж
< менше ніж
>= більше або дорівнює
<= менше або дорівнює
Важливо для MDX:
Коли пишеш оператори типу <, <=, > і >= у звичайному тексті, клади їх у backticks.
Інакше MDX може подумати, що ти намагаєшся писати JSX.
А потім може емоційно вибухнути.
SQL-блоки безпечні.
Markdown-текст — небезпечний район.
Більше Ніж
Знайди товари з ціною більшою за 100:
SELECT * FROM products
WHERE price > 100;
Це повертає товари типу:
- Laptop;
- Desk Chair;
- Monitor;
- Bookshelf.
Це корисно, коли ти хочеш знайти дорогі товари.
Або коли хочеш зрозуміти, чому гаманець плаче.
Менше Ніж
Знайди товари з ціною меншою за 50:
SELECT * FROM products
WHERE price < 50;
Це повертає дешевші товари, наприклад:
- Mouse;
- Notebook;
- Pen;
- Desk Lamp;
- USB Cable.
Це корисно для знижок, бюджету, фільтрів і моментів, коли життя каже:
Можливо, не laptop за 900 euro сьогодні.
Сумно.
Але фінансово відповідально.
Більше або Дорівнює
Знайди товари з rating більшим або рівним 4:
SELECT * FROM products
WHERE rating >= 4;
Це повертає товари з rating 4 і 5.
Оператор >= означає:
більше або дорівнює
Тому 4 включено.
Це корисно, коли ти хочеш хороші товари.
Не ідеальні.
Але достатньо хороші.
Як багато реальних проєктів.
Менше або Дорівнює
Знайди товари з ціною меншою або рівною 25:
SELECT * FROM products
WHERE price <= 25;
Це включає товари з ціною 25.
Тому Mouse зʼявляється, бо його ціна точно 25.
Оператор <= означає:
менше або дорівнює
Маленькі символи.
Велике значення.
Бази даних повні такого.
Не Дорівнює
Знайди товари, які не належать до категорії Electronics:
SELECT * FROM products
WHERE category != 'Electronics';
Це повертає товари з інших категорій.
Можна також використати:
SELECT * FROM products
WHERE category <> 'Electronics';
І !=, і <> можуть означати “не дорівнює” у PostgreSQL.
У цьому курсі ми зазвичай будемо використовувати !=, бо його легко читати.
PostgreSQL дає варіанти.
Іноді забагато.
Але ці нормальні.
AND
AND поєднує умови.
Усі умови мають бути правдивими.
Приклад:
SELECT * FROM products
WHERE category = 'Electronics'
AND price < 100;
Це означає:
Дай мені товари, де категорія Electronics і ціна менша за 100.
Обидві умови мають бути правдивими.
Тому можна отримати:
- Mouse;
- Keyboard;
- USB Cable.
Але не Laptop.
Laptop — це Electronics, так.
Але Laptop не дешевший за 100.
Laptop вибрав дорогий стиль життя.
Більше Прикладів з AND
Знайди доступні Electronics товари:
SELECT * FROM products
WHERE category = 'Electronics'
AND available = true;
Знайди Furniture товари з rating 5:
SELECT * FROM products
WHERE category = 'Furniture'
AND rating = 5;
Знайди товари дешевші за 100 і з rating щонайменше 4:
SELECT * FROM products
WHERE price < 100
AND rating >= 4;
AND суворий.
Кожна умова має пройти.
Як дуже серйозний checklist.
Жодної умови не залишаємо позаду.
OR
OR поєднує умови, де хоча б одна умова має бути правдивою.
Приклад:
SELECT * FROM products
WHERE category = 'Office'
OR category = 'Furniture';
Це означає:
Дай мені товари, де категорія Office або Furniture.
Товар може відповідати одній з цих умов.
Не обовʼязково обом.
Бо щось зазвичай не може бути одночасно Office і Furniture.
Хіба що твоє офісне крісло має кризу ідентичності.
Більше Прикладів з OR
Знайди товари, які дуже дешеві або мають високий rating:
SELECT * FROM products
WHERE price < 10
OR rating = 5;
Це повертає товари, які відповідають хоча б одній умові.
Тобто товар зʼявиться, якщо:
- його ціна менша за
10; - або його rating дорівнює
5; - або обидва варіанти одразу.
OR гнучкіший за AND.
Іноді занадто гнучкий.
Використовуй обережно.
AND і OR Разом
Можна поєднувати AND і OR.
Але треба бути уважним.
Приклад:
SELECT * FROM products
WHERE category = 'Electronics'
AND price < 100
OR rating = 5;
Це може означати не те, що ти думаєш.
PostgreSQL виконує AND перед OR.
Тому запит інтерпретується так:
SELECT * FROM products
WHERE (category = 'Electronics' AND price < 100)
OR rating = 5;
Це означає:
Electronics дешевші за 100 або будь-що з rating 5.
Якщо хочеш інше значення, використовуй дужки.
Дужки роблять твою логіку зрозумілою.
Твій майбутній ти подякує.
Можливо, кавою.
Дужки
Використовуй дужки, щоб групувати умови.
Приклад:
SELECT * FROM products
WHERE category = 'Electronics'
AND (price < 100 OR rating = 5);
Це означає:
Дай мені Electronics товари, де ціна менша за 100 або rating дорівнює 5.
Тепер товар має бути Electronics.
Потім він також має відповідати одній з умов у дужках.
Дужки — це не декорація.
Це логічний паркан.
Використовуй їх, коли змішуєш AND і OR.
Інакше запит може стати диким звіром.
LIKE
LIKE шукає текстові шаблони.
Приклад:
SELECT * FROM products
WHERE name LIKE 'Desk%';
Це знаходить назви, які починаються з Desk.
Символ % означає:
тут може бути що завгодно
Тому Desk% підходить для:
- Desk Chair;
- Desk Lamp.
Інший приклад:
SELECT * FROM products
WHERE name LIKE '%book%';
Це знаходить назви, які містять book.
Може знайти:
- Notebook;
- Bookshelf.
Але є важливий момент.
LIKE часто чутливий до регістру.
Тому book може не знайти Book.
PostgreSQL має інший варіант.
Він називається ILIKE.
ILIKE
ILIKE — це як LIKE, але без урахування регістру.
Приклад:
SELECT * FROM products
WHERE name ILIKE '%book%';
Це може знайти:
- Notebook;
- Bookshelf;
- BOOKSHELF;
- notebook.
Дуже корисно.
Особливо коли users вводять текст як люди.
Люди не послідовні.
Іноді пишуть laptop.
Іноді Laptop.
Іноді LAPTOP.
Іноді lapotp.
Останнє — не вина PostgreSQL.
ORDER BY
ORDER BY сортує результати.
Сортування за ціною від найнижчої до найвищої:
SELECT * FROM products
ORDER BY price;
Це те саме, що:
SELECT * FROM products
ORDER BY price ASC;
Сортування за ціною від найвищої до найнижчої:
SELECT * FROM products
ORDER BY price DESC;
Сортування за назвою в алфавітному порядку:
SELECT * FROM products
ORDER BY name;
Сортування робить дані легшими для читання.
Без сортування рядки приходять у тому порядку, в якому PostgreSQL вирішить їх повернути.
Не довіряй natural order.
Natural order — це не контракт.
Це настрій.
ORDER BY з WHERE
Можна фільтрувати й сортувати одночасно.
Приклад:
SELECT * FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
Це означає:
Дай мені Electronics товари, посортовані від найдорожчих до найдешевших.
Інший приклад:
SELECT name, price FROM products
WHERE available = true
ORDER BY price ASC;
Це означає:
Дай мені доступні товари, посортовані за ціною від найнижчої до найвищої.
Це дуже часто використовується в реальних застосунках.
Спочатку фільтр.
Потім сортування.
Потім показ користувачу.
Користувач думає, що сайт розумний.
Насправді SQL робить важку роботу.
Тихо.
Як втомлений працівник складу.
LIMIT
LIMIT контролює, скільки рядків буде повернуто.
Приклад:
SELECT * FROM products
LIMIT 3;
Це повертає тільки три рядки.
Знайди три найдорожчі товари:
SELECT * FROM products
ORDER BY price DESC
LIMIT 3;
Це дуже корисно для:
- top товарів;
- останніх posts;
- першої сторінки результатів;
- маленьких preview;
- dashboard-ів.
Без LIMIT запит може повернути занадто багато даних.
А занадто багато даних — як занадто багато пасти.
Спочатку цікаво.
Потім небезпечно.
OFFSET
OFFSET пропускає рядки.
Приклад:
SELECT * FROM products
ORDER BY id
LIMIT 3 OFFSET 3;
Це означає:
Пропусти перші 3 рядки, потім поверни 3 рядки.
Це корисно для pagination.
Сторінка 1:
SELECT * FROM products
ORDER BY id
LIMIT 3 OFFSET 0;
Сторінка 2:
SELECT * FROM products
ORDER BY id
LIMIT 3 OFFSET 3;
Сторінка 3:
SELECT * FROM products
ORDER BY id
LIMIT 3 OFFSET 6;
Pagination — це спосіб, яким сайти показують результати сторінками.
Не все одразу.
Бо ніхто не хоче завантажувати 5000 товарів, щоб знайти мишку.
Можливо, тільки база даних.
База даних не скаржиться.
Але users будуть.
Поєднання Всього
Тепер поєднаємо фільтрацію, сортування і limit.
Приклад:
SELECT name, category, price, rating
FROM products
WHERE available = true
AND price >= 10
ORDER BY rating DESC, price ASC
LIMIT 5;
Це означає:
Дай мені доступні товари з ціною щонайменше 10.
Покажи тільки name, category, price і rating.
Сортуй за rating від найвищого до найнижчого.
Якщо rating однаковий, сортуй за price від найнижчого до найвищого.
Поверни тільки 5 рядків.
Це справжній запит.
Не іграшкова теорія.
Саме такі речі реальні застосунки роблять постійно.
Шукай.
Фільтруй.
Сортуй.
Обмежуй.
Показуй.
Повторюй.
Web development часто саме це, тільки з красивішими кнопками.
Типові Помилки
Забути Лапки для Тексту
Неправильно:
SELECT * FROM products
WHERE category = Electronics;
Правильно:
SELECT * FROM products
WHERE category = 'Electronics';
Текстові значення потребують одинарних лапок.
Назви колонок — ні.
PostgreSQL не буде вгадувати.
Знову.
Він має межі.
Добре для PostgreSQL.
Плутати AND і OR
Це:
WHERE category = 'Office'
OR category = 'Furniture'
означає одне або інше.
Це:
WHERE category = 'Office'
AND category = 'Furniture'
зазвичай нічого не повертає.
Бо один товар зазвичай не може мати обидві категорії одночасно.
AND означає всі умови.
OR означає хоча б одну умову.
Маленькі слова.
Великі наслідки.
Як “так” і “ні” в контрактах.
Забути Дужки
Небезпечно:
WHERE category = 'Electronics'
AND price < 100
OR rating = 5
Краще:
WHERE category = 'Electronics'
AND (price < 100 OR rating = 5)
Дужки роблять логіку зрозумілою.
Зрозуміла логіка означає менше сюрпризів.
Менше сюрпризів означає менше крику на terminal.
Здорово.
Використовувати LIKE, Коли Потрібен ILIKE
Це може пропустити результати через регістр:
WHERE name LIKE '%book%'
Це часто краще для user search:
WHERE name ILIKE '%book%'
Користувачів не цікавить твоя case sensitivity.
Вони хочуть результати.
PostgreSQL може допомогти.
Дозволь йому.
Практика
Напиши запити для таблиці products.
Знайди всі Electronics товари:
SELECT * FROM products
WHERE category = 'Electronics';
Знайди товари дешевші за 50:
SELECT * FROM products
WHERE price < 50;
Знайди доступні товари з rating щонайменше 4:
SELECT * FROM products
WHERE available = true
AND rating >= 4;
Знайди товари, назва яких містить desk:
SELECT * FROM products
WHERE name ILIKE '%desk%';
Знайди три найдорожчі товари:
SELECT * FROM products
ORDER BY price DESC
LIMIT 3;
Запусти кожен запит.
Змінюй значення.
Ламай речі.
Виправляй речі.
Так SQL стає нормальним.
Мінічелендж
Створи таблицю з назвою students.
Вона має мати:
id;name;city;age;active;score.
Встав щонайменше вісім студентів.
Потім напиши запити, які:
- показують усіх студентів;
- показують студентів з одного міста;
- показують студентів старших за
18; - показують активних студентів;
- показують студентів зі score більшим або рівним
80; - показують студентів з одного міста й активних;
- показують студентів, чиє імʼя містить
an; - сортують студентів за score від найвищого до найнижчого;
- показують тільки трьох найкращих студентів за score.
Цей challenge важливий.
Бо фільтрація і сортування всюди.
Якщо ти можеш писати такі запити, ти вже не просто зберігаєш дані.
Ти контролюєш дані.
Обережно.
Сподіваюсь.
Підсумок
Сьогодні ти вивчив:
WHEREфільтрує рядки;=перевіряє рівність;!=перевіряє нерівність;>перевіряє “більше ніж”;<перевіряє “менше ніж”;>=перевіряє “більше або дорівнює”;<=перевіряє “менше або дорівнює”;ANDвимагає, щоб усі умови були правдивими;ORвимагає, щоб хоча б одна умова була правдивою;- дужки роблять складну логіку зрозумілою;
LIKEшукає текстові шаблони;ILIKEшукає текстові шаблони без урахування регістру;ORDER BYсортує результати;ASCсортує за зростанням;DESCсортує за спаданням;LIMITобмежує кількість повернутих рядків;OFFSETпропускає рядки.
Це великий крок.
Тепер ти можеш ставити PostgreSQL точні питання.
Не тільки:
SELECT * FROM products;
А:
SELECT name, price
FROM products
WHERE available = true
AND price < 100
ORDER BY price ASC
LIMIT 5;
Це справжня сила бази даних.
Маленький запит.
Велика користь.
Дуже PostgreSQL.
Наступна Лекція
У наступній лекції ми вивчимо звʼязки через primary keys і foreign keys.
Саме тут таблиці починають говорити одна з одною.
Students і courses.
Users і orders.
Products і categories.
Одна таблиця корисна.
Повʼязані таблиці — це місце, де реляційні бази даних стають потужними.
І трохи драматичнішими.