В предыдущем уроке мы научились создавать базы данных, таблицы и добавлять, обновлять и удалять записи. Мы создали структуру для интернет-магазина, добавили пользователей, товары и заказы. Но сейчас наши данные просто лежат в таблицах — мы не можем их использовать, чтобы получить информацию. Чтобы извлечь данные, нужны запросы на чтение. И самая частая операция с базой данных — это именно чтение (SELECT). Умение правильно и эффективно извлекать данные отличает профессионала от новичка. В этом уроке (втором из двух по SQL) мы погрузимся в искусство выборки данных — научимся задавать базе данных вопросы и получать ответы.
Вы узнаете всё о операторе SELECT. Начнём с простых запросов: SELECT * FROM table для получения всех столбцов, SELECT column1, column2 FROM table для выбора конкретных столбцов, SELECT DISTINCT для получения уникальных значений. Научимся создавать псевдонимы с помощью AS, чтобы делать результаты более читаемыми, и выполнять простые вычисления прямо внутри запроса.
Освоим фильтрацию данных с помощью WHERE — это сердце любого осмысленного запроса. Без WHERE вы получаете все строки таблицы. С WHERE вы можете задать условие: «покажи только тех пользователей, которым больше 18 лет» или «найди все заказы, сделанные в декабре». Разберём все операторы сравнения (=, <>, >, <, >=, <=), логические операторы (AND, OR, NOT), проверку на вхождение в список (IN), проверку на диапазон (BETWEEN), поиск по шаблону (LIKE с % и _), а также работу с NULL (IS NULL, IS NOT NULL). Все эти инструменты позволяют формулировать условия любой сложности.
Научимся сортировать результаты с помощью ORDER BY. Когда вы делаете запрос, строки возвращаются в том порядке, в котором они хранятся в базе данных (обычно по первичному ключу). Но пользователю почти всегда нужен определённый порядок: самые новые заказы первыми, товары от дешёвых к дорогим, студенты по алфавиту. Узнаем разницу между сортировкой по возрастанию (ASC) и убыванию (DESC), а также как сортировать по нескольким полям одновременно (например, сначала по городу, затем по имени).
Познакомимся с группировкой данных с помощью GROUP BY и агрегатными функциями. Что делать, если нужно не просто вывести список строк, а получить сводную информацию: сколько всего пользователей, какова средняя цена товаров, какой товар самый дорогой? Для этого используются агрегатные функции: COUNT() для подсчёта количества, SUM() для суммы, AVG() для среднего значения, MIN() и MAX() для минимального и максимального значений. А GROUP BY позволяет разбить данные на группы и применить агрегатные функции к каждой группе отдельно (например, посчитать количество заказов каждого пользователя). Узнаем, как фильтровать сгруппированные данные с помощью HAVING (аналог WHERE, но для групп).
Самая мощная и важная тема — объединение таблиц с помощью JOIN. В реальных базах данных информация почти всегда разнесена по разным таблицам: пользователи в одной таблице, их заказы — в другой. Чтобы получить полную информацию о заказе (кто заказал, что заказал, сколько), нужно объединить данные из нескольких таблиц. Вы узнаете, что такое внешние ключи и как связывать таблицы. Разберём INNER JOIN (только совпадающие записи из обеих таблиц — заказы только тех пользователей, которые существуют), LEFT JOIN (все записи из левой таблицы и совпадающие из правой — все пользователи, даже если у них нет заказов), RIGHT JOIN (все записи из правой таблицы и совпадающие из левой). Научимся объединять несколько таблиц в одном запросе.