ИТ.03 - 05 - Специальные операторы IN и BETWEEN. Составные условия запросов AND, OR, NOT. Модификатор запроса DISTINCT
Введение
В предыдущей теме мы познакомились с базовыми конструкциями SQL — SELECT
, FROM
и WHERE
.
Сегодня разберём логические операторы, которые позволяют задавать сложные условия фильтрации данных: AND
, OR
, NOT
, специальные операторы IN
, BETWEEN
для работы с наборами значений и диапазонами, а также изучим модификатор DISTINCT
, который помогает убирать повторяющиеся строки из результата запроса.
Эти операторы позволяют делать запросы гибкими и точными.
AND
— возвращает строки, где выполняются оба условияOR
— возвращает строки, где выполняется хотя бы одно условиеNOT
— исключает строки, удовлетворяющие условиюXOR
— возвращает строки, где выполняется только одно из условий, но не обаIN
— проверяет, входит ли значение в заданный списокBETWEEN
— проверяет, находится ли значение в диапазонеDISTINCT
— убирает дубликаты из результатов запроса
Пример таблицы orders
id | user_id | products_count | sum | status |
---|---|---|---|---|
1 | 1 | 2 | 1300 | new |
2 | 18 | 1 | 10000 | cancelled |
3 | 45 | 3 | 800 | cancelled |
4 | 11 | 1 | 2140 | in_progress |
5 | 145 | 5 | 6800 | new |
6 | 23 | 1 | 999 | new |
7 | 1 | 2 | 7690 | cancelled |
8 | 17 | 1 | 1600 | new |
9 | 5 | 4 | 400 | delivery |
10 | 11 | 1 | 1450 | new |
11 | 13 | 7 | 13000 | cancelled |
12 | 11 | 1 | 1000 | in_progress |
13 | 45 | 2 | 3000 | returned |
Код создания таблицы на языке SQL в диалекте SQLite
CREATE TABLE
orders (
id INTEGER PRIMARY KEY,
user_id INT NULL,
products_count INT NULL,
sum INT NULL,
status VARCHAR(20) NULL
);
INSERT INTO
orders (id, user_id, products_count, sum, status)
VALUES
(1, 1, 2, 1300, 'new'),
(2, 18, 1, 10000, 'cancelled'),
(3, 45, 3, 800, 'cancelled'),
(4, 11, 1, 2140, 'in_progress'),
(5, 145, 5, 6800, 'new'),
(6, 23, 1, 999, 'new'),
(7, 1, 2, 7690, 'cancelled'),
(8, 17, 1, 1600, 'new'),
(9, 5, 4, 400, 'delivery'),
(10, 11, 1, 1450, 'new'),
(11, 13, 7, 13000, 'cancelled'),
(12, 11, 1, 1000, 'in_progress'),
(13, 45, 2, 3000, 'returned');
Оператор AND
Оператор AND
используется, когда нужно выбрать строки, удовлетворяющие всем условиям одновременно.
SELECT id, user_id, sum, status
FROM orders
WHERE status = 'new' AND sum > 1000;
Результат:
Отбираются только заказы со статусом new
, сумма которых превышает 1000.
Оператор OR
Оператор OR
возвращает строки, где выполняется хотя бы одно из указанных условий.
SELECT id, user_id, sum, status
FROM orders
WHERE status = 'cancelled' OR status = 'returned';
Результат:
Отбираются все отменённые (cancelled
) и возвращённые (returned
) заказы.
Оператор NOT
Оператор NOT
исключает строки, удовлетворяющие условию.
SELECT id, user_id, sum, status
FROM orders
WHERE NOT status = 'cancelled';
Результат:
Выводятся все заказы, кроме отменённых.
Приоритет операторов
Порядок выполнения в SQL следующий:
NOT
AND
OR
Чтобы задать свой порядок, используйте скобки ()
.
SELECT id, user_id, sum, status
FROM orders
WHERE (status = 'new' OR status = 'in_progress') AND sum < 2000;
Результат:
Отбираются заказы в статусах new
или in_progress
, при этом сумма меньше 2000.
Оператор XOR
Оператор XOR
(исключающее ИЛИ) используется редко,
но бывает полезен, когда нужно выбрать строки, где только одно из двух условий истинно, а если оба выполняются — строка не попадёт в результат.
SELECT id, user_id, sum, status
FROM orders
WHERE (sum > 5000) XOR (status = 'new');
Результат:
Будут показаны заказы, где либо сумма больше 5000,
либо статус "new", но не оба одновременно.
Примечание
Поддержка XOR
зависит от диалекта SQL.
В MySQL он есть, а в SQLite можно заменить выражением:
SELECT id, user_id, sum, status
FROM orders
WHERE (sum > 5000 AND status != 'new')
OR (sum <= 5000 AND status = 'new');
Оператор IN
Оператор IN
используется для проверки, входит ли значение в указанный список.
Он делает запросы короче и нагляднее, чем несколько OR
.
SELECT id, user_id, sum, status
FROM orders
WHERE status IN ('cancelled', 'returned', 'delivery');
Результат:
Отбираются все заказы, у которых статус — cancelled
, returned
или delivery
.
Аналогичный запрос через OR:
WHERE status = 'cancelled' OR status = 'returned' OR status = 'delivery';
Оператор BETWEEN
Оператор BETWEEN
используется для проверки, входит ли значение в заданный диапазон включительно.
SELECT id, user_id, sum, status
FROM orders
WHERE sum BETWEEN 1000 AND 5000;
Результат:
Выводятся заказы, сумма которых от 1000 до 5000 включительно.
Совет
Диапазон можно использовать и с датами — SQL корректно сравнивает даты по порядку.
DISTINCT — уникальные значения
DISTINCT
используется, чтобы убрать дубли в результатах запроса.
SELECT DISTINCT status
FROM orders;
Результат:
Показывает список уникальных статусов заказов без повторений.
Комбинация DISTINCT и WHERE
Можно объединять DISTINCT
с условиями фильтрации:
SELECT DISTINCT user_id
FROM orders
WHERE status = 'cancelled';
Результат:
Выводятся уникальные пользователи, у которых есть хотя бы один отменённый заказ.
Практические задания
- Выведите заказы, у которых статус
new
и сумма больше 1500. - Покажите заказы, которые либо отменены, либо возвращены.
- Выведите заказы, кроме тех, что находятся в статусе
delivery
. - Найдите всех уникальных пользователей, у которых есть активные (
in_progress
) заказы. - Покажите уникальные значения статусов заказов.
- Выведите заказы, сумма которых находится в диапазоне от 2000 до 7000.
- Покажите заказы, статус которых входит в список
('new', 'in_progress')
.
-- Ваши решения можно писать здесь