Выражения CASE и условная логика
Заставьте SQL выбирать значение для каждой строки, категоризировать данные и считать подмножества за один проход
Главная идея:
CASE - это if / else языка SQL. Он смотрит на каждую строку, проверяет условия по порядку и возвращает значение для первого истинного условия. Поскольку это выражение, оно даёт значение, которое можно вставить в список SELECT, в ORDER BY, в WHERE и даже внутрь агрегата вроде SUM(), чтобы посчитать именно те строки, которые вам нужны.
К концу этой темы вы сможете:
- писать простую и поисковую формы
CASE, - категоризировать строки в метки или диапазоны оценок,
- применять паттерн условной агрегации (
SUM(CASE ... )) для подсчёта подмножеств и построения сводных таблиц, - защищаться от деления на ноль с помощью
NULLIF, - заменять
NULLна запасное значение черезIFNULL/COALESCE.
0. Пример таблицы
Каждый запрос ниже выполняется над одной небольшой таблицей результатов экзаменов. Некоторые оценки равны NULL, потому что студент отсутствовал, а у одного студента attempts = 0 - оба факта пригодятся позже.
CREATE TABLE students (
student_id INT PRIMARY KEY,
full_name VARCHAR(50),
subject VARCHAR(20),
score INT, -- 0..100, NULL если студент отсутствовал
attempts INT
);
INSERT INTO students VALUES
(1, 'Aida Nurlan', 'Math', 92, 1),
(2, 'Bekzat Orozov', 'Math', 58, 2),
(3, 'Chris Doyle', 'Math', NULL, 0),
(4, 'Dina Sultan', 'History', 74, 1),
(5, 'Erlan Kadyr', 'History', 45, 3),
(6, 'Farida Iman', 'Science', 88, 1),
(7, 'Gulnara Sadyk', 'Science', 63, 2),
(8, 'Hasan Umar', 'Science', NULL, 0);
Держите эту таблицу в уме: 8 студентов, 3 предмета, двое отсутствующих (оценки NULL).