← К оглавлению занятия

Занятие 05. Условные конструкции: операторы CASE, IF

📁 Блок: SQL / MySQL ⏱️ Время изучения: ~60 мин 🎯 Сложность: Начальная
#case #if #as #concat #left #right #substring #length #trim #replace #upper #lower #coalesce

⚡ Кратко: суть темы

Занятие учит создавать новые столбцы на основе условий. Разбираем оператор CASE, псевдонимы AS, функцию IF в MySQL, математические операции, строковые функции и конкатенацию.

  • CASE WHEN ... THEN ... ELSE ... END — переносит ветвление в SQL.
  • AS задаёт понятное имя вычисляемому столбцу.
  • IF(condition, true, false) — короткая альтернатива CASE, но только в MySQL.

Что запомнить: CASE — стандарт SQL и работает почти везде; IF — специфика MySQL.

Частая ошибка: забыть END в конце блока CASE.

✅ Решения

1–2. Классификация цены

-- явный вариант
SELECT product_name, standard_cost,
    CASE
        WHEN standard_cost > 50 THEN 'Дорогой'
        WHEN standard_cost > 20 AND standard_cost <= 50 THEN 'Средний'
        ELSE 'Дешевый'
    END AS price_category
FROM products;

-- оптимизированный вариант
SELECT product_name, standard_cost,
    CASE
        WHEN standard_cost > 50 THEN 'Дорогой'
        WHEN standard_cost > 20 THEN 'Средний'
        ELSE 'Дешевый'
    END AS price_category
FROM products;

3. Скидка по региону

SELECT *,
    CASE
        WHEN state_province IN ('WA', 'CA') THEN 5
        WHEN state_province IN ('ID', 'OR') THEN 7
        WHEN state_province IN ('UT', 'NV') THEN 13
        ELSE 0
    END AS discount
FROM customers;

4. Статус заказа

SELECT
    id,
    order_date,
    shipped_date,
    CASE
        WHEN shipped_date IS NULL THEN 'Ожидание отправки'
        WHEN shipped_date = order_date THEN 'Отправлено в день заказа'
        ELSE 'Отправлено'
    END AS order_status
FROM orders;

5. IF

SELECT
    product_name,
    IF(standard_cost > 20, 'Expensive', 'Affordable') AS price_category
FROM products;

6–9. Строковые функции

SELECT company, RIGHT(company, 2) AS short_name
FROM customers;

SELECT business_phone, SUBSTRING(business_phone, 6, 3) AS phone_code
FROM customers;

SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;

SELECT notes, COALESCE(notes, 'Not filled') AS notes_filled
FROM employees;