Пошук уроків, статей та іншого контенту
Відфільтруєте рядки за заданими умовами та навчитеся комбінувати кілька критеріїв відбору.
WHEREОператор WHERE визначає, які рядки потрібно повернути з таблиці. Запит повертає лише ті рядки, для яких умова має значення TRUE.
Загальний вигляд:
SELECT стовпці
FROM таблиця
WHERE умова;Наприклад, виберімо активних користувачів:
SELECT id, name, email
FROM users
WHERE is_active = TRUE;Результат міститиме лише користувачів, у яких стовпець is_active дорівнює TRUE.
WHERE розташовується після FROM, але перед такими частинами запиту, як ORDER BY або LIMIT.
Для побудови умов використовують оператори порівняння:
= — дорівнює;
<> або != — не дорівнює;
> — більше;
< — менше;
>= — більше або дорівнює;
<= — менше або дорівнює.
Приклад:
SELECT id, name, price
FROM products
WHERE price >= 100;Цей запит повертає товари, ціна яких не менша за 100.
Текстові значення потрібно записувати в одинарних лапках:
SELECT id, name, status
FROM orders
WHERE status = 'paid';Подвійні лапки в PostgreSQL використовують для ідентифікаторів, наприклад назв стовпців або таблиць, а не для текстових значень.
Дати також записують в одинарних лапках:
SELECT id, customer_id, created_at
FROM orders
WHERE created_at >= '2025-01-01';Запит повертає замовлення, створені 1 січня 2025 року або пізніше.
ANDAND поєднує умови. Рядок буде вибрано лише тоді, коли всі умови будуть істинними.
SELECT id, name, price
FROM products
WHERE price >= 100
AND price <= 500;Тут одночасно перевіряються дві умови:
ціна не менша за 100;
ціна не більша за 500.
Можна поєднувати умови для різних стовпців:
SELECT id, name, category
FROM products
WHERE category = 'books'
AND price < 300;Запит повертає книги, ціна яких менша за 300.
OROR повертає рядок, якщо істинна хоча б одна з умов.
SELECT id, name, status
FROM orders
WHERE status = 'paid'
OR status = 'shipped';Результат міститиме замовлення зі статусом paid або shipped.
Коли в умові є одночасно AND і OR, використовуйте дужки, щоб явно визначити порядок перевірки:
SELECT id, name, category, price
FROM products
WHERE category = 'books'
AND (price < 200 OR price > 1000);Цей запит повертає книги, які:
коштують менше за 200; або
коштують більше за 1000.
Без дужок умова могла б бути зрозуміла неправильно. У SQL AND має вищий пріоритет, ніж OR, але дужки роблять логіку очевидною.
NOTNOT заперечує умову:
SELECT id, name, status
FROM orders
WHERE NOT status = 'cancelled';Запит повертає замовлення, статус яких не дорівнює cancelled.
Для простої перевірки нерівності зазвичай зрозуміліше використовувати <>:
SELECT id, name, status
FROM orders
WHERE status <> 'cancelled';INЯкщо потрібно перевірити кілька можливих значень одного стовпця, замість довгого ланцюжка OR зручно використовувати IN.
Ці два запити еквівалентні:
SELECT id, name, status
FROM orders
WHERE status = 'paid'
OR status = 'shipped';SELECT id, name, status
FROM orders
WHERE status IN ('paid', 'shipped');IN особливо зручний, коли список значень довший:
SELECT id, name, category
FROM products
WHERE category IN ('books', 'games', 'music');Щоб перевірити, що значення не входить до списку, використовуйте NOT IN:
SELECT id, name, category
FROM products
WHERE category NOT IN ('books', 'games');BETWEENОператор BETWEEN перевіряє, чи належить значення заданому діапазону. Межі діапазону включаються в перевірку.
SELECT id, name, price
FROM products
WHERE price BETWEEN 100 AND 500;Це еквівалентно такій умові:
WHERE price >= 100
AND price <= 500BETWEEN можна застосовувати до дат:
SELECT id, customer_id, created_at
FROM orders
WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31';Для значень типу date цей запит охоплює весь січень. Якщо created_at має тип timestamp, для фільтрації всього місяця часто краще використовувати напіввідкритий діапазон:
SELECT id, customer_id, created_at
FROM orders
WHERE created_at >= '2025-01-01'
AND created_at < '2025-02-01';Так запит містить усі моменти часу січня, але не включає 1 лютого.
Оператор LIKE дає змогу порівнювати текст зі шаблоном.
Спеціальні символи шаблону:
% — будь-яка кількість символів, зокрема нуль;
_ — рівно один будь-який символ.
Наприклад, знайдемо імена, які починаються з Ann:
SELECT id, name
FROM users
WHERE name LIKE 'Ann%';Можливі результати:
Anna;
Annabel;
Ann Smith.
Знайдемо адреси електронної пошти з доменом example.com:
SELECT id, email
FROM users
WHERE email LIKE '%@example.com';У PostgreSQL оператор LIKE чутливий до регістру. Для пошуку без урахування регістру використовують ILIKE:
SELECT id, name
FROM users
WHERE name ILIKE 'ann%';Цей запит знайде і Anna, і anna, і ANN.
NULLNULL означає відсутнє або невідоме значення. Його не можна перевіряти за допомогою = або <>.
Неправильний варіант:
-- Така умова не перевіряє відсутність значення
WHERE phone = NULLДля перевірки використовують IS NULL:
SELECT id, name, phone
FROM users
WHERE phone IS NULL;Щоб знайти рядки, де значення є:
SELECT id, name, phone
FROM users
WHERE phone IS NOT NULL;Наведений приклад можна виконати в PostgreSQL. Тимчасова таблиця існуватиме лише протягом поточного підключення до бази даних.
-- Створюємо тимчасову таблицю товарів
CREATE TEMP TABLE products (
id integer,
name text,
category text,
price numeric(10, 2),
stock integer,
is_active boolean
);
-- Додаємо прикладові товари
INSERT INTO products (id, name, category, price, stock, is_active)
VALUES
(1, 'PostgreSQL для початківців', 'books', 450.00, 8, TRUE),
(2, 'Бездротова клавіатура', 'electronics', 1200.00, 3, TRUE),
(3, 'Настільна гра', 'games', 350.00, 0, TRUE),
(4, 'Класичний роман', 'books', 180.00, 20, TRUE),
(5, 'Старий монітор', 'electronics', 800.00, 2, FALSE);
-- Знаходимо активні книги дешевші за 500
SELECT id, name, price
FROM products
WHERE category = 'books'
AND price < 500
AND is_active = TRUE;
-- Знаходимо товари з категорії books або games
SELECT id, name, category
FROM products
WHERE category IN ('books', 'games');
-- Знаходимо активні товари, які є на складі
SELECT id, name, stock
FROM products
WHERE is_active = TRUE
AND stock > 0;
-- Знаходимо товари з ціною від 300 до 1000 включно
SELECT id, name, price
FROM products
WHERE price BETWEEN 300 AND 1000;
-- Знаходимо назви, у яких є слово або частина слова "Post"
SELECT id, name
FROM products
WHERE name ILIKE '%post%';Кожен оператор SELECT незалежно застосовує умову до рядків таблиці products.
У спрощеному вигляді PostgreSQL обробляє запит так:
бере рядки з таблиці, зазначеної у FROM;
відкидає рядки, які не відповідають WHERE;
формує набір вибраних стовпців із SELECT.
Тому умова в WHERE працює з назвами стовпців таблиці, а не з псевдонімами, створеними в SELECT.
Наприклад, такий запит не спрацює:
-- Помилка: псевдонім total_price ще недоступний у WHERE
SELECT price * 2 AS total_price
FROM products
WHERE total_price > 500;Замість цього повторіть вираз:
SELECT price * 2 AS total_price
FROM products
WHERE price * 2 > 500;Неправильно:
WHERE status = "paid"Правильно:
WHERE status = 'paid'Неправильно:
WHERE category = booksПравильно:
WHERE category = 'books'NULLНеправильно:
WHERE phone = NULLПравильно:
WHERE phone IS NULLAND та ORУмова без дужок може мати інший результат, ніж очікується:
WHERE category = 'books'
AND price < 200
OR is_active = TRUEЧерез пріоритет операторів це читається так:
WHERE (category = 'books' AND price < 200)
OR is_active = TRUEЯкщо потрібно спочатку об'єднати варіанти категорії, запишіть умову з дужками:
WHERE (category = 'books' OR category = 'games')
AND is_active = TRUEСтовпці мають типи даних. Числове значення не потрібно брати в лапки:
WHERE price > 100Текстове значення, навпаки, потрібно брати в одинарні лапки:
WHERE category = 'books'Для таблиці products із прикладу напишіть запити, які:
знаходять товари з нульовим залишком;
знаходять активні товари дорожчі за 500;
знаходять товари категорії books або electronics;
знаходять товари, у назві яких є слово клавіатура, без урахування регістру;
знаходять неактивні товари або товари без залишку.
WHERE фільтрує рядки за умовою.
Для порівняння використовують =, <>, >, <, >= і <=.
AND вимагає виконання всіх умов.
OR достатньо виконання хоча б однієї умови.
Дужки допомагають явно визначити логіку складних умов.
IN перевіряє належність значення списку.
BETWEEN перевіряє входження в діапазон, включно з його межами.
LIKE та ILIKE використовують для пошуку тексту за шаблоном.
Для NULL потрібно використовувати IS NULL або IS NOT NULL.