Пошук уроків, статей та іншого контенту
Застосуєте пошук у списку, діапазоні та тексті за шаблоном із урахуванням або ігноруванням регістру.
INОператор IN перевіряє, чи відповідає значення одному зі значень у списку.
SELECT *
FROM products
WHERE category IN ('books', 'games');Запит поверне товари, категорія яких — books або games.
Такий запис еквівалентний кільком умовам із OR:
SELECT *
FROM products
WHERE category = 'books'
OR category = 'games';IN зручніший, коли список містить багато значень:
SELECT *
FROM products
WHERE id IN (2, 5, 8, 13);Оператор можна використовувати не лише з текстом, а й із числами, датами та іншими типами даних.
NOT INЩоб виключити значення зі списку, використовуйте NOT IN:
SELECT *
FROM products
WHERE category NOT IN ('books', 'games');Запит поверне товари всіх інших категорій.
Якщо список для
NOT INміститьNULL, результат може бути неочікуваним. ЗначенняNULLокремо розглядають за допомогоюIS NULLабоIS NOT NULL.
BETWEENОператор BETWEEN перевіряє, чи потрапляє значення в заданий діапазон:
SELECT *
FROM products
WHERE price BETWEEN 100 AND 500;Цей запит поверне товари з ціною від 100 до 500 включно.
Запис:
WHERE price BETWEEN 100 AND 500еквівалентний такому:
WHERE price >= 100
AND price <= 500Межі діапазону включаються в результат. Тобто товари з ціною рівно 100 або 500 також будуть знайдені.
NOT BETWEENЗа допомогою NOT BETWEEN можна виключити діапазон:
SELECT *
FROM products
WHERE price NOT BETWEEN 100 AND 500;Запит поверне товари з ціною меншою за 100 або більшою за 500.
BETWEEN також можна використовувати з датами:
SELECT *
FROM orders
WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31';Для значень типу date цей запит включає обидві дати. Якщо created_at має тип timestamp, для пошуку за весь січень часто безпечніше використовувати напіввідкритий діапазон:
SELECT *
FROM orders
WHERE created_at >= '2025-01-01'
AND created_at < '2025-02-01';LIKEОператор LIKE шукає текст, який відповідає шаблону.
У шаблонах LIKE використовуються спеціальні символи:
% — будь-яка кількість символів, зокрема нуль;
_ — рівно один будь-який символ.
%Знайти всі імена, які починаються з Ann:
SELECT *
FROM users
WHERE name LIKE 'Ann%';Можливі результати:
Anna;
Annabelle;
Ann.
Знайти всі електронні адреси з доменом example.com:
SELECT *
FROM users
WHERE email LIKE '%@example.com';Знайти текст, який містить слово phone у будь-якій частині:
SELECT *
FROM products
WHERE name LIKE '%phone%';_Знайти коди, що складаються з трьох символів і починаються з A:
SELECT *
FROM products
WHERE code LIKE 'A__';Шаблон A__ означає:
перший символ — A;
другий символ — будь-який;
третій символ — будь-який.
Наприклад, підійдуть A12 і ABC, але не підійдуть AB12 або A1.
У PostgreSQL оператор LIKE враховує регістр:
SELECT *
FROM users
WHERE name LIKE 'anna%';Цей запит може не знайти значення Anna, оскільки A і a — різні символи.
ILIKEILIKE працює як LIKE, але не враховує регістр символів:
SELECT *
FROM users
WHERE name ILIKE 'anna%';Такий запит може знайти:
Anna;
anna;
ANNA;
Annabelle.
Пошук частини тексту без урахування регістру:
SELECT *
FROM products
WHERE name ILIKE '%phone%';Це корисно для пошуку, який вводить користувач у поле форми.
NOT LIKE і NOT ILIKEЩоб знайти значення, які не відповідають шаблону, використовуйте NOT LIKE:
SELECT *
FROM products
WHERE name NOT LIKE 'Phone%';Для пошуку без урахування регістру використовуйте NOT ILIKE:
SELECT *
FROM products
WHERE name NOT ILIKE '%pro%';Наведений скрипт створює тимчасову таблицю, додає тестові дані та демонструє всі чотири оператори:
CREATE TEMP TABLE products (
id integer,
name text,
category text,
price numeric(10, 2)
);
INSERT INTO products (id, name, category, price)
VALUES
(1, 'PostgreSQL для початківців', 'books', 450.00),
(2, 'SQL Practice', 'books', 320.00),
(3, 'Wireless Keyboard', 'electronics', 1200.00),
(4, 'USB Phone Charger', 'electronics', 180.00),
(5, 'Board Game', 'games', 650.00),
(6, 'Notebook', 'stationery', 80.00);
-- Пошук товарів у списку категорій
SELECT *
FROM products
WHERE category IN ('books', 'games');
-- Пошук товарів у діапазоні цін, межі включаються
SELECT *
FROM products
WHERE price BETWEEN 300 AND 700;
-- Пошук назв, які містять слово phone без урахування регістру
SELECT *
FROM products
WHERE name ILIKE '%phone%';
-- Пошук назв, які починаються з SQL без урахування регістру
SELECT *
FROM products
WHERE name ILIKE 'sql%';
-- Виключення товарів із категорій books і games
SELECT *
FROM products
WHERE category NOT IN ('books', 'games');Оператори можна поєднувати з AND та OR.
Наприклад, знайдемо електроніку в діапазоні цін від 100 до 1000:
SELECT *
FROM products
WHERE category = 'electronics'
AND price BETWEEN 100 AND 1000;Знайдемо книги або ігри, назва яких містить слово game без урахування регістру:
SELECT *
FROM products
WHERE category IN ('books', 'games')
AND name ILIKE '%game%';Коли поєднуєте AND та OR, використовуйте дужки для явного визначення порядку перевірки:
SELECT *
FROM products
WHERE (category = 'books' OR category = 'games')
AND price < 500;LIKE ігнорує регістрУ PostgreSQL LIKE враховує регістр. Для нечутливого до регістру пошуку використовуйте ILIKE:
-- Пошук із урахуванням регістру
WHERE name LIKE 'sql%'
-- Пошук без урахування регістру
WHERE name ILIKE 'sql%'%Умова без % шукає точну відповідність усього тексту:
WHERE name LIKE 'phone'Вона знайде лише значення phone, але не Smart Phone.
Для пошуку слова всередині тексту потрібні символи %:
WHERE name ILIKE '%phone%'BETWEENBETWEEN включає обидві межі:
WHERE price BETWEEN 100 AND 500Це означає price >= 100 AND price <= 500, а не строгий діапазон без меж.
NULLIN, BETWEEN, LIKE та ILIKE не знаходять NULL як звичайне значення. Для перевірки NULL використовуйте окремий оператор:
SELECT *
FROM products
WHERE category IS NULL;IN перевіряє значення на належність до списку.
NOT IN виключає значення зі списку.
BETWEEN шукає значення в діапазоні, включно з обома межами.
NOT BETWEEN виключає значення із заданого діапазону.
LIKE шукає текст за шаблоном і враховує регістр.
ILIKE шукає текст за шаблоном без урахування регістру.
% позначає будь-яку кількість символів.
_ позначає один будь-який символ.
Для перевірки NULL використовують IS NULL або IS NOT NULL.