Следуйте этому правильному подходу к написанию ваших SQL-запросов.

Проблема

Большинство разработчиков начинают писать свои SQL-запросы с предложения «SELECT», затем пишут «FROM», «WHERE», «HAVING»… и так далее. Но это не «правильный» способ написания ваших SQL-запросов, поскольку он очень подвержен синтаксическим ошибкам, особенно если вы новичок в SQL.

Решение

«Идеальная» последовательность написания запросов должна соответствовать тому, как исполнитель SQL выполняет запросы. Это гарантирует, что вы не совершите синтаксических ошибок и будете писать эффективные SQL-запросы. Вы узнаете, как фильтровать данные перед выполнением соединения, когда использовать предложение «HAVING» или «WHERE» и многое другое.

В этом сообщении блога мы рассмотрим «идеальный» способ написания SQL-запроса, который поможет вам стать эффективным разработчиком SQL.

Мы будем использовать таблицы «Клиенты» и «Заказы» (ниже), чтобы найти двух крупнейших клиентов из США/Великобритании, общая сумма расходов которых превышает 300 долларов США.

Давайте углубимся в правильный способ написания SQL-запросов.

1. Всегда начинайте с FROM/JOIN

Интуитивно понятно, что первым шагом является чтение таблиц с использованием предложения FROM и выполнение JOIN (если требуется). Таким образом, вы всегда должны начинать свой запрос с оператора «FROM» / «JOIN».

FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id

Мы также можем фильтровать строки из входных таблиц еще до выполнения объединения. Мы можем сделать это, добавив предложение «И» после предложения «ON» соединения.

-- Filter happens before Join

FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
AND country in ('USA','UK')

2. Затем перейдите к ГДЕ

Второе предложение в порядке выполнения — это предложение WHERE. Он используется для фильтрации таблиц данных после применения соединения.

Предложение WHERE очень полезно для уменьшения количества строк, особенно когда мы работаем с большими наборами данных, содержащими миллионы строк.

FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')

3. Затем используйте GROUP BY

Предложение Group By должно быть написано после предложения Where. Он используется для группировки строк на основе выбранного столбца/столбцов.

В следующем запросе мы группируем строки на основе идентификатора клиента. После группировки каждый идентификатор клиента будет иметь одну строку в выходных данных. Обычно мы используем агрегацию (сумма, минимум, максимум и т. д.), когда группируем данные. В этом примере мы найдем сумму столбца суммы в таблице «Заказы».

FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')
GROUP BY Customers.customer_id

4. HAVING после GROUP BY

Предложение HAVING выполняется после GROUP BY, оно используется для фильтрации агрегированных строк, созданных в группе по операции.

В нашем примере мы будем фильтровать сумму, потраченную каждым клиентом, чтобы она превышала 300.

FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')
GROUP BY Customers.customer_id
HAVING sum(amount) >300

Предложение WHERE выполняется до GROUP BY, а HAVING выполняется после него. Таким образом, предложение WHERE не может фильтровать агрегированные данные.

5. Затем напишите предложение SELECT

Столбцы, которые мы хотим показать в выводе, выбираются с помощью предложения SELECT.

Если мы группируем наши данные с помощью предложения GROUP BY, нам нужно выбрать сгруппированный столбец с помощью оператора SELECT.

В нашем примере мы выберем идентификатор клиента и сумму (сумму), чтобы показать расходы, соответствующие каждому клиенту.

select Customers.customer_id, sum(amount) as total_amount
FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')
GROUP BY Customers.customer_id
HAVING sum(amount) >300

6. Используйте ORDER BY после предложения SELECT

После выбора столбцов следующим шагом является указание порядка, в котором мы хотим вывести строки.

В нашем примере мы можем использовать предложение ORDER BY, чтобы упорядочить строки в порядке убывания общих расходов.

SELECT Customers.customer_id, sum(amount) as total_amount
FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')
GROUP BY Customers.customer_id
HAVING sum(amount) >=300
ORDER BY total_amount desc

7. Напишите, наконец, предложение LIMIT!

Последним шагом в последовательности записи является ограничение количества строк, которые мы хотим видеть на выходе.

В нашем примере мы можем ограничить общее количество выходных строк до 2.

SELECT Customers.customer_id, sum(amount) as total_amount
FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE country in ('USA','UK')
GROUP BY Customers.customer_id
HAVING sum(amount) >=300
ORDER BY total_amount desc
LIMIT 2

Заключение

Мы рассмотрели идеальный способ написания запросов SQL, который соответствует тому, как выполняются запросы SQL.

Я надеюсь, что вы будете писать свои SQL-запросы в приведенной ниже последовательности, если вы еще этого не сделали.

Спасибо за чтение!

Вы можете получать все мои сообщения в свой почтовый ящик. Сделайте это здесь!

Если вам нравится работать с Medium, поддержите меня и тысячи других авторов, подписавшись на членство. Это стоит всего 5 долларов в месяц, это очень поддерживает нас, писателей, и вы получаете доступ ко всем удивительным историям на Medium.

Подпишитесь на меня, чтобы видеть мои публикации по науке о данных в своей ленте.