ЛЕКЦІЯ 9

Логічні оператори AND/OR/NOT

Основи баз даних

VTFK • 2025

Що вже вивчили

Лекція 8: WHERE фільтрація

  • Оператори порівняння
  • BETWEEN, IN, LIKE
  • Базові умови

План лекції

  • AND для перетину умов
  • OR для об'єднання
  • NOT для заперечення
  • Комбінування та дужки

Фокус: складні умови у WHERE

Логічні оператори

Логічні оператори

Logical Operators

Слова AND, OR, NOT які комбінують або негують умови у WHERE.

Аналогія: Як в математиці: AND=множення, OR=додавання, NOT=інверс

Таблиця істинності AND

Обидві умови мають бути TRUE

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% table A | B | AND T | T | T T | F | F F | T | F F | F | F

Таблиці істинності

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;
AND — обидві умови TRUE
OR — хоча б одна TRUE
NOT — навпаки умови
AND — обидві умови TRUE
OR — хоча б одна TRUE
NOT — навпаки умови
AND — обидві умови TRUE
OR — хоча б одна TRUE
NOT — навпаки умови

AND — перетин умов

AND приклади

Дві умови разом

-- Активні дорослі користувачи
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;

OR — об'єднання умов

OR приклади

Одна з умов

-- Дітей або пенсіонерів
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';

NOT - заперечення

NOT приклади

Заперечення умови

-- Активні користувачи (не видалені)
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/OR з дужками

Порядок важливий

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% flowchart LR A[age > 18] B[status='active'] C[country='USA'] Q1[AND без дужок:
A AND B OR C] Q2[З дужками:
A AND B) OR C] Q3[З дужками:
A AND (B OR C)] A --> Q1 B --> Q1 C --> Q1

Порядок операцій

Приклад порядку

Одна діяння вимагає дужок

-- БЕЗ дужок: 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')

Міні-вікторина

Яка умова виконується першою?

  • OR завжди першим
  • AND має вищий пріоритет
  • Залежить від БД
✅ Правильна відповідь: AND має вищий пріоритет
💡 Пояснення:

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';

Дужки роблять намір явним

Логіка у SQL історія

Від 1970-х

1974

Boole

AND/OR/NOT

1986

SQL-86

Стандарт AND/OR

2003

SQL:2003

CASE для складної логіки

2025

Сьогодні

JSON та вкладені логіки

Best practices AND/OR/NOT

Міні ТЗ: складна фільтрація

Комплексний WHERE

Кілька логічних операторів

-- Дорослі активні преміум-користувачи або адміністратори
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);

Підсумки

  • AND скорочує результати
  • OR розширює результати
  • NOT запиває умови
  • Дужки змінюють пріоритет

Далі — NULL та його особливості

Домашнє завдання

Наступна лекція:

Лекція 10: NULL Handling

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій