Примечание
ЭТО АРХИВНАЯ ВЕРСИЯ КУРСА!
Материалы предназначаются для пересдающих дисциплину "ОП.08 - Основы проектирования баз данных" в соответствии с учебными планами СПО годов набора ДО 2024-го. Для того чтобы ознакомиться с актуальным курсом "ИТ.03 - Основы проектирования баз данных" включающим интерактивные примеры, перейдите по ссылке.
Материалы были перенесены со старого сайта с минимальной доработкой, поэтому не все возможности курса могут работать как ожидается, где-то может слететь форматирование.
Домашние задания в рамках курса проверяться не будут!
ОП.08 - 06 - Специальные операторы IN и BETWEEN. Составные условия запросов AND, OR, NOT. Модификатор запроса DISTINCT
Примеры данной темы используют учебную БД:
orders_01.sql
Специальные операторы IN и BETWEEN
Оператор IN
Специальный оператор IN позволяет узнать входит ли проверяемое значение столбца в список определённых значений.
Выведем все данные о заказах которые находятся в статусе новых (new) или находятся в обработке (in_progress) из таблицы orders:
SELECT * FROM orders
WHERE status IN ('new', 'in_progress');
Также существует синтаксис [NOT] IN, который исключает данный набор значений.
SELECT * FROM orders
WHERE status NOT IN ('new', 'in_progress');
Оператор BETWEEN
Специальный оператор BETWEEN min AND max позволяет узнать расположено ли проверяемое значение столбца в интервале между min и max включительно.
Выведем все данные о заказах с ценой от 1000 до 8000 рублей из таблицы orders:
SELECT * FROM orders
WHERE sum BETWEEN 1000 AND 8000;
Также существует синтаксис [NOT] BETWEEN min AND max, который исключает данный диапазон.
SELECT * FROM orders
WHERE sum NOT BETWEEN 1000 AND 8000;
Составные условия запросов AND, OR, NOT
Условие AND
Оператор AND — общее значение выражения истинно, если они оба истинны
Например выберем из таблицы orders все заказы, у которых сумма (sum) от 2000 и выше и количество товаров (products_count) меньше пяти.
SELECT * FROM orders WHERE sum >= 2000 AND products_count < 5;
Условие OR
Оператор OR — общее значение выражения истинно, если хотя бы одно из них истинно.
Например выберем из таблицы orders все заказы, у которых сумма (sum) больше 1500 или количество товаров (products_count) больше одного:
SELECT * FROM orders WHERE sum > 1500 OR products_count > 1;
Также существует вариант оператора XOR (исключающее «или») — общее значение выражения истинно, если один и только один аргумент является истинным, но он поддерживается не всеми СУБД.
Условие NOT
Оператор NOT — меняет значение специального оператора на противоположный.
Например выберем из таблицы orders все заказы, кроме отмененных (cancelled) и находящихся в доставке (delivery):
SELECT * FROM orders WHERE status NOT IN ('cancelled', 'delivery');
Порядок комбинирования условий
Оператор NOT всегда имеет наивысший приоритет и относится непосредственно к конструкции которая идет за ним до любого другого оператора.
Условие AND имеет больший приоритет, и выполняется ПЕРЕД оператором OR, даже если стоит после него. При использовании нескольких операторов AND или OR рекомендуется не полагаться на порядок обработки по умолчанию, а всегда использовать скобки для его директивного определения. Это повысит читаемость и стабильность кода.
Например, нам необходимо вывести все заказы у которых больше одного товара кроме статусов отмененный и новый, либо все заказы содержащие меньше 5 товаров в статусе отмененный:
SELECT * FROM orders
WHERE
( products_count > 1 AND status NOT IN ('cancelled', 'new') )
OR
( products_count < 5 AND status = 'cancelled' )
Модификатор запроса DISTINCT
Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать модификатор запроса DISTINCT.
Например, выведем список уникальных статусов которые могут быть у заказа в таблице orders:
SELECT DISTINCT status FROM orders;
И сравните результат с запросом без данного модификатора:
SELECT status FROM orders;
Задания для самопроверки
Задание 1
Выберите из таблицы orders все отмененные заказы. У отмененных заказов status равен "cancelled".
ОТВЕТ
SELECT * FROM orders WHERE status = 'cancelled';
Задание 2
Выберите из таблицы orders все заказы кроме отмененных. У отмененных заказов status равен "cancelled".
ОТВЕТ
SELECT * FROM orders WHERE status != 'cancelled';
Задание 3
Выберите из таблицы orders все заказы содержащие более 3 товаров (products_count). Вывести нужно только номер (id) и сумму (sum) заказа.
ОТВЕТ
SELECT id, sum FROM orders WHERE products_count > 3;
Задание 4
Выберите из таблицы orders все отмененные (cancelled) и возвращенные (returned) товары. Используйте IN.
ОТВЕТ
SELECT * FROM orders WHERE status IN ('cancelled', 'returned');
Задание 5
Выберите из таблицы orders все заказы, у которых сумма (sum) больше 3000 или количество товаров (products_count) от 3 и больше.
ОТВЕТ
SELECT * FROM orders WHERE sum > 3000 OR products_count >= 3;
Задание 6
Выберите из таблицы orders все заказы, у которых сумма (sum) от 3000 и выше, а количество товаров (products_count) меньше 3.
ОТВЕТ
SELECT * FROM orders WHERE sum >= 3000 AND products_count < 3;
Задание 7
Выберите из таблицы orders все отмененные заказы стоимостью от 3000 до 10000 рублей включительно. Используйте BETWEEN.
ОТВЕТ
SELECT * FROM orders WHERE status = 'cancelled' AND sum BETWEEN 3000 AND 10000;
Задание 8
Выберите из таблицы orders все отмененные заказы исключая заказы стоимостью от 3000 до 10000 рублей включительно.
ОТВЕТ
SELECT * FROM orders WHERE status = 'cancelled' AND NOT sum BETWEEN 3000 AND 10000;
Задание 9
Выберите из таблицы orders все существующие статусы, исключив повторения при помощи DISTINCT.
ОТВЕТ
SELECT DISTINCT status FROM orders;