Шпаргалка по SQL

Все конструкции курса «SQL с нуля», собранные по задачам. Примеры — на учебной базе курса: книги books, покупатели customers и заказы orders. В колонке «Урок» — где конструкция разобрана подробно.

Порядок частей запроса

SQL
SELECT   столбцы
FROM     таблица
JOIN     другая_таблица ON условие
WHERE    условие для строк
GROUP BY столбцы
HAVING   условие для групп
ORDER BY столбцы
LIMIT    число;

Пишут в таком порядке, а выполняет база иначе: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Поэтому отбирать по агрегату в WHERE нельзя — для этого есть HAVING (урок 5).

Выбрать данные

Пример Что делает Урок
SELECT * FROM books; все столбцы таблицы 1
SELECT title, price FROM books; только нужные столбцы 1
SELECT price * 0.9 AS sale_price вычисляемый столбец со своим именем 3
SELECT DISTINCT genre FROM books; убрать повторы 3

Отобрать строки: WHERE

Пример Что делает Урок
WHERE price > 600 сравнение: =, <>, >, <, >=, <= 2
WHERE genre = 'роман' текст и даты — в одинарных кавычках 2
WHERE genre = 'роман' AND price < 500 оба условия верны 2
WHERE (genre = 'роман' OR genre = 'наука') AND price > 800 хотя бы одно из условий; AND выполняется раньше OR — нужны скобки 2
WHERE genre IN ('наука', 'IT') значение из списка 2
WHERE price BETWEEN 500 AND 700 диапазон вместе с границами 2
WHERE author LIKE 'Д%' по образцу: % — любые символы, _ — ровно один 2
WHERE city IS NULL значение не заполнено; = NULL не работает 4

Сортировка и ограничение

Пример Что делает Урок
ORDER BY price по возрастанию 3
ORDER BY price DESC по убыванию 3
ORDER BY genre, price DESC по нескольким столбцам 3
ORDER BY price DESC LIMIT 3 топ-3 3
LIMIT 3 OFFSET 3 следующие три после первых трёх 3

Без ORDER BY порядок строк не гарантирован. В Microsoft SQL Server вместо LIMIT пишут TOP, в стандарте SQL — FETCH FIRST.

Итоги и NULL

Пример Что делает Урок
COUNT(*) число строк 4
COUNT(city) число заполненных значений 4
SUM(amount), AVG(price) сумма и среднее 4
MIN(price), MAX(price) наименьшее и наибольшее 4
ROUND(AVG(amount), 2) округлить до двух знаков 4
COALESCE(city, 'не указан') подставить значение вместо NULL 4

Группировка

Пример Что делает Урок
SELECT status, COUNT(*) FROM orders GROUP BY status; итог по каждой группе 5
HAVING SUM(amount) > 1000 отобрать готовые группы 5

WHERE отбирает строки до группировки, HAVING — группы после. В SELECT группового запроса — только столбцы из GROUP BY и агрегаты.

Соединение таблиц

Пример Что делает Урок
FROM orders AS o JOIN customers AS c ON c.id = o.customer_id только строки, у которых нашлась пара 6
FROM customers AS c LEFT JOIN orders AS o ON o.customer_id = c.id все строки слева; где пары нет — NULL 6
LEFT JOIN … WHERE o.id IS NULL записи без пары: покупатели без заказов 6
COUNT(o.id) после LEFT JOIN считать связанные записи, а не строки 6

После соединения проверяйте число строк: ошибка в ON размножает данные.

Подзапросы и CASE

Пример Что делает Урок
WHERE price > (SELECT AVG(price) FROM books) сравнить с одним значением из подзапроса 7
WHERE id IN (SELECT book_id FROM orders) отобрать по списку из подзапроса 7
FROM (SELECT …) AS t подзапрос вместо таблицы, обязательно с именем 7
CASE WHEN price > 700 THEN 'дорого' ELSE 'доступно' END значение по условию; срабатывает первое подходящее 7
SUM(CASE WHEN status = 'доставлен' THEN 1 ELSE 0 END) посчитать строки, подходящие под условие 7

Изменить данные

Пример Что делает Урок
INSERT INTO customers (name, city) VALUES ('Жанна', 'Омск'); добавить строку 8
UPDATE books SET price = 500 WHERE id = 2; изменить значения 8
DELETE FROM orders WHERE status = 'отменён'; удалить строки 8
BEGIN; … COMMIT; транзакция: сохранить все изменения разом 8
ROLLBACK; отменить изменения незавершённой транзакции 8

UPDATE и DELETE без WHERE меняют всю таблицу. Перед ними выполните SELECT с тем же WHERE и посмотрите, какие строки попадут под правку.