Основи баз даних
VTFK • 2025
Лекція 8: WHERE фільтрація
Фокус: складні умови у WHERE
Слова AND, OR, NOT які комбінують або негують умови у WHERE.
Аналогія: Як в математиці: AND=множення, OR=додавання, NOT=інверс
Обидві умови мають бути TRUE
| A | B | A AND B | A OR B | NOT A |
|---|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE | FALSE |
| TRUE | FALSE | FALSE | TRUE | FALSE |
| FALSE | TRUE | FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE | FALSE | TRUE |
SELECT * FROM table
WHERE condition1 AND condition2;
SELECT * FROM table
WHERE condition1 OR condition2;
SELECT * FROM table
WHERE NOT condition;
Дві умови разом
-- Активні дорослі користувачи
SELECT * FROM users
WHERE age >= 18 AND status = 'active';
-- Дорогі товари на складі
SELECT * FROM products
WHERE price > 100 AND stock > 0;
-- Замовлення за період з мінімальною сумою
SELECT * FROM orders
WHERE created_at >= '2025-01-01'
AND created_at <= '2025-12-31'
AND amount >= 100;
Одна з умов
-- Дітей або пенсіонерів
SELECT * FROM users
WHERE age < 13 OR age >= 65;
-- Замовлення у статусі 'pending' або 'processing'
SELECT * FROM orders
WHERE status = 'pending' OR status = 'processing';
-- або скорочено: WHERE status IN ('pending', 'processing')
-- Gmail або Yahoo почта
SELECT * FROM users
WHERE email LIKE '%@gmail.com' OR email LIKE '%@yahoo.com';
Заперечення умови
-- Активні користувачи (не видалені)
SELECT * FROM users
WHERE NOT status = 'deleted';
-- Або: WHERE status != 'deleted'
-- Не у діапазоні
SELECT * FROM products
WHERE NOT (price BETWEEN 50 AND 100);
-- Не NULL
SELECT * FROM users
WHERE NOT phone IS NULL;
-- Або: WHERE phone IS NOT NULL
Порядок важливий
Одна діяння вимагає дужок
-- БЕЗ дужок: AND першим
SELECT * FROM users
WHERE age > 18 AND status = 'active' OR country = 'USA';
-- Розуміється як: (age > 18 AND status = 'active') OR country = 'USA'
-- З ДУЖКАМИ для ясності
SELECT * FROM users
WHERE age > 18 AND (status = 'active' OR country = 'USA');
-- Розуміється як: age > 18 AND (status = 'active' OR country = 'USA')
AND завжди виконується перед OR у SQL.
Неправильна логіка без дужок
-- Потрібні дорослих з USA або активних з будь-якого місця
SELECT * FROM users
WHERE age > 18 AND country = 'USA' OR status = 'active';
-- Це дає: (18+ AND USA) ИЛИ active (активних отовсюду!)
OR поширює фільтр на активних користувачів всіх країн
SELECT * FROM users
WHERE (age > 18 AND country = 'USA') OR status = 'active';
Дужки роблять намір явним
Від 1970-х
AND/OR/NOT
Стандарт AND/OR
CASE для складної логіки
JSON та вкладені логіки
Кілька логічних операторів
-- Дорослі активні преміум-користувачи або адміністратори
SELECT id, name, email, subscription
FROM users
WHERE
(age >= 18 AND status = 'active' AND subscription = 'premium')
OR role = 'admin';
-- Замовлення за період, активні, або завдання VIP
SELECT *
FROM orders
WHERE
(created_at >= '2025-01-01' AND created_at <= '2025-12-31')
AND (status IN ('processing', 'shipped') OR vip_customer = true);
Далі — NULL та його особливості
Лекція 10: NULL Handling
Дякую за увагу! 💾