Пошук уроків, статей та іншого контенту
Розглянете оператори порівняння, AND, OR і NOT для побудови складних умов у SQL-запитах.
Оператори порівняння використовують у SQL, щоб перевірити умову. Найчастіше вони з’являються після ключового слова WHERE.
| Оператор | Значення | |---|---| | = | дорівнює | | <> | не дорівнює | | != | не дорівнює | | > | більше | | < | менше | | >= | більше або дорівнює | | <= | менше або дорівнює |
Наприклад:
SELECT *
FROM products
WHERE price > 100;Цей запит повертає товари, ціна яких більша за 100.
-- Товари з ціною 100
SELECT *
FROM products
WHERE price = 100;
-- Товари з ціною не 100
SELECT *
FROM products
WHERE price <> 100;
-- Товари дешевші за 50
SELECT *
FROM products
WHERE price < 50;
-- Товари за ціною від 50 включно
SELECT *
FROM products
WHERE price >= 50;Результатом умови є логічне значення:
TRUE — умова істинна;
FALSE — умова хибна;
NULL — результат невідомий.
До результату SELECT потрапляють лише рядки, для яких умова в WHERE має значення TRUE.
ANDОператор AND поєднує умови. Результат буде істинним лише тоді, коли істинні всі умови.
SELECT *
FROM products
WHERE price > 100
AND in_stock = TRUE;Запит повертає товари, які одночасно:
коштують більше ніж 100;
є в наявності.
Зазвичай кожну умову записують з нового рядка. Це робить запит зрозумілішим, хоча перенесення рядка не впливає на його виконання.
SELECT *
FROM products
WHERE category = 'Books'
AND price <= 500
AND in_stock = TRUE;Тут будуть вибрані лише книжки ціною до 500, які є в наявності.
ORОператор OR повертає істинний результат, якщо істинна хоча б одна з умов.
SELECT *
FROM products
WHERE category = 'Books'
OR category = 'Games';Запит повертає товари з категорією Books або Games.
OR також можна використовувати для числових умов:
SELECT *
FROM products
WHERE price < 50
OR price > 1000;У результаті будуть товари, які або дешевші за 50, або дорожчі за 1000.
NOTОператор NOT заперечує умову:
якщо умова істинна, NOT робить її хибною;
якщо умова хибна, NOT робить її істинною.
SELECT *
FROM products
WHERE NOT in_stock = TRUE;Цей запит вибирає товари, яких немає в наявності.
Частіше для такої умови використовують оператор = з FALSE або порівняння з FALSE:
SELECT *
FROM products
WHERE in_stock = FALSE;NOT зручно застосовувати до складних умов:
SELECT *
FROM products
WHERE NOT (category = 'Books' AND price < 100);Цей запит виключає товари, які одночасно є книжками та коштують менше ніж 100.
Логічні оператори можна комбінувати в одному запиті.
SELECT *
FROM products
WHERE category = 'Books'
AND (price < 100 OR price > 500);Умова означає:
категорія має бути Books;
і ціна має бути або меншою за 100, або більшою за 500.
Дужки важливі, оскільки вони явно визначають, які умови потрібно об’єднати першими.
Якщо в умові немає дужок, PostgreSQL застосовує оператори в такому порядку:
NOT;
AND;
OR.
Наприклад:
SELECT *
FROM products
WHERE category = 'Books'
OR category = 'Games'
AND price < 100;Цей вираз обробляється так:
SELECT *
FROM products
WHERE category = 'Books'
OR (category = 'Games' AND price < 100);Тобто будуть вибрані:
усі книжки, незалежно від ціни;
або ігри дешевші за 100.
Якщо потрібна інша логіка, використовуйте дужки:
SELECT *
FROM products
WHERE (category = 'Books' OR category = 'Games')
AND price < 100;Тепер ціна має бути меншою за 100 і для книжок, і для ігор.
Наведений приклад можна виконати в PostgreSQL послідовно. Він створює тимчасову таблицю, додає дані та демонструє різні умови.
CREATE TEMP TABLE products (
id integer,
name text,
category text,
price numeric(10, 2),
in_stock boolean
);
INSERT INTO products (id, name, category, price, in_stock)
VALUES
(1, 'SQL для початківців', 'Books', 350.00, TRUE),
(2, 'Настільна гра', 'Games', 80.00, TRUE),
(3, 'Навушники', 'Electronics', 1200.00, FALSE),
(4, 'Блокнот', 'Books', 45.00, TRUE),
(5, 'Стратегічна гра', 'Games', 600.00, FALSE);
-- Товари дорожчі за 100
SELECT *
FROM products
WHERE price > 100;
-- Книжки, які є в наявності
SELECT *
FROM products
WHERE category = 'Books'
AND in_stock = TRUE;
-- Книжки або ігри
SELECT *
FROM products
WHERE category = 'Books'
OR category = 'Games';
-- Книжки або ігри дешевші за 500
SELECT *
FROM products
WHERE (category = 'Books' OR category = 'Games')
AND price < 500;
-- Товари, яких немає в наявності
SELECT *
FROM products
WHERE in_stock = FALSE;NULLNULL означає відсутнє або невідоме значення. Його не можна коректно перевіряти операторами = або <>.
Неправильна перевірка:
SELECT *
FROM products
WHERE price = NULL;Така умова не знайде рядки з відсутньою ціною.
Для перевірки NULL використовують спеціальні оператори:
SELECT *
FROM products
WHERE price IS NULL;Щоб знайти значення, які не є NULL, використовують:
SELECT *
FROM products
WHERE price IS NOT NULL;Це важливо і для логічних колонок. Значення NULL у колонці in_stock не є ні TRUE, ні FALSE, а означає, що стан невідомий.
AND та ORЗапит:
SELECT *
FROM products
WHERE category = 'Books'
OR category = 'Games'
AND price < 100;не означає, що обидві категорії мають бути дешевшими за 100. Для цього потрібні дужки:
SELECT *
FROM products
WHERE (category = 'Books' OR category = 'Games')
AND price < 100;Текстові значення записують в одинарних лапках:
-- Правильно
WHERE category = 'Books'Без лапок PostgreSQL сприйматиме Books як назву колонки або інший ідентифікатор.
= для NULLДля NULL використовуйте IS NULL або IS NOT NULL, а не = чи <>.
AND і ORУмова:
WHERE price > 100
AND price < 500вибирає товари в діапазоні від 100 до 500.
А умова:
WHERE price < 100
OR price > 500вибирає товари поза цим діапазоном.
Оператори порівняння перевіряють рівність, нерівність і порядок значень.
AND вимагає, щоб усі поєднані умови були істинними.
OR достатньо, щоб істинною була хоча б одна умова.
NOT заперечує умову.
Дужки допомагають явно визначити порядок обчислення складної умови.
NULL перевіряють за допомогою IS NULL та IS NOT NULL.
У WHERE повертаються лише рядки, для яких умова має значення TRUE.