Следуйте этому правильному подходу к написанию ваших 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.
Подпишитесь на меня, чтобы видеть мои публикации по науке о данных в своей ленте.