WHERE в SQL: как домохозяйка наводит порядок в холодильнике
Каждый из нас ежедневно сталкивается с бытовыми вопросами. У вас огромный холодильник: продукты, напитки, соусы, остатки вчерашнего ужина. Каждый день нужно понять: что из этого пригодно к употреблению сегодня, что нужно использовать для обеда, а что отправить в мусор.
Вот тут и появляется WHERE. Это фильтр, который помогает выбрать именно нужные строки из таблицы — или продукты из холодильника.
А в своем канале На связи: SQL я публикую информацию с особенностями и нюансами в языке SQL, разбираю аналитические запросы и подходы работы с данными. Канал создала недавно с нулем подписчиков, но там уже есть интересная информация для работы аналитиков. Подписывайся!
Нам нужно выкинуть все продукты, у которых истек срок годности:
SELECT *
FROM fridge
WHERE expiry_date < CURRENT_DATE;
fridge — наша таблица с продуктами
expiry_date < CURRENT_DATE — условие: выбираем просроченные продукты
CURRENT_DATE - текущая дата
Что можно писать в WHERE
Сравнения: =, >, <, >=, <=
Логические связки: AND, OR, NOT
Проверки на вхождение: IN, BETWEEN, LIKE
Подзапросы: «проверить список покупок перед выбором»
Или, мы хотим приготовить что-то на десерт:
SELECT *
FROM fridge
WHERE category = 'dessert' AND expiry_date > CURRENT_DATE;
Условие AND expiry_date > CURRENT_DATE добавляем на случай, если мы не выкинули всю просрочку до этого.
Подзапросы
В WHERE можно использовать подзапросы. Это когда нам нужна информация из другого источника, чтобы использовать ее в своем запросе. Например, нам надо понять что из рецепта отсутствует у нас в холодильнике.
SELECT *
FROM cooking_recipe
WHERE product NOT IN (SELECT product FROM fridge);
WHERE проверяет какие продукты отсутствуют в холодильнике.
Аналогично можно использовать EXISTS или NOT EXISTS
SELECT *
FROM fridge f
WHERE EXISTS (SELECT 1 FROM cooking_recipe s WHERE s.product = f.product);
EXISTS = есть продукт в списке
NOT EXISTS = нет продукта в списке
ANY \ ALL
Эти конструкции позволяют сравнивать с набором значений.
SELECT *
FROM fridge
WHERE expiry_date <= ALL (SELECT expiry_date FROM fridge WHERE category = 'milk');
Все хорошие домохозяйки используют принцип ротации. Выбирают продукты, срок годности которых меньше всех в категории “молоко”.
Подзапрос (SELECT expiry_date FROM fridge WHERE category = 'milk') возвращает даты всех банок молока.
Условие expiry_date <= ALL (...) означает: выбрать только те банки, у которых дата годности меньше или равна каждой другой банке молока.
Практически это банка (или несколько, если даты совпадают), которая старше всех остальных.
То есть, результат будет одна или несколько банок с самой ранней датой годности.
SELECT *
FROM fridge
WHERE expiry_date <= ANY (SELECT expiry_date FROM fridge WHERE category = 'milk');
Условие expiry_date <= ANY (...) означает: выбрать все банки молока, у которых дата годности меньше или равна хотя бы одной другой банке молока.
Тут почти все банки проходят условие, кроме самой свежей (если она самая большая по сроку).
Результат может быть несколько банок, не обязательно только одна. Все, кто «моложе или равны хотя бы одной другой», будут выбраны.
CASE в WHERE
Можно использовать CASE для сложной логики
SELECT *
FROM fridge
WHERE
CASE
WHEN product = 'milk' THEN shelf = 'top'
ELSE shelf = 'middle'
END;
Если я ищу молочные продукты в холодильнике, то должна их искать на самой верхней полке, иначе - на средней.
Ну а если тебе нужны слова поддержки и мотивации, то заглядывай в канал Сила слов. Там каждое утро приходит мотивационное сообщение для тебя, чтобы ты верил себе и в себя, продолжал или только начинал действовать.