To effectively work with SQL, it’s crucial to understand the logical order in which SQL executes its clauses. This understanding is essential for crafting queries that yield accurate and meaningful results. The logical execution order differs from the way queries are written, starting with the FROM
clause, even though SELECT
appears first in the syntax.
Logical Execution Order of SQL Clauses
The logical execution order is as follows:
Execution Order | Clause |
---|---|
1 | FROM |
2 | WHERE |
3 | GROUP BY |
4 | HAVING |
5 | SELECT |
6 | ORDER BY |
Let’s use a real-world example involving sales data to illustrate these steps. Assume we have a table named sales_data
with the following fields:
city
: Name of the citycountry
: Country of the citysales
: Total sales in dollars
Step-by-Step Query Execution
Initial Data
The table sales_data
contains the following data:
City | Country | Sales |
---|---|---|
New York | USA | 20,000 |
Los Angeles | USA | 15,000 |
Chicago | USA | 12,000 |
Beijing | China | 25,000 |
Shanghai | China | 18,000 |
Shenzhen | China | 10,000 |
Tokyo | Japan | 22,000 |
Osaka | Japan | 16,000 |
1. Filtering with WHERE
The WHERE
clause filters cities with sales greater than 12,000:
SELECT city, country, sales FROM sales_data WHERE sales > 10000;
Result:
City | Country | Sales |
---|---|---|
New York | USA | 20,000 |
Los Angeles | USA | 15,000 |
Chicago | USA | 12,000 |
Beijing | China | 25,000 |
Shanghai | China | 18,000 |
Tokyo | Japan | 22,000 |
Osaka | Japan | 16,000 |
2. Grouping with GROUP BY
The GROUP BY
clause aggregates the data by country:
SELECT country, SUM(sales) AS total_sales FROM sales_data WHERE sales > 10000 GROUP BY country;
Result:
Country | Total Sales |
---|---|
USA | 47,000 |
China | 43,000 |
Japan | 38,000 |
3. Filtering Groups with HAVING
The HAVING
clause filters groups with total sales greater than 40,000:
SELECT country, SUM(sales) AS total_sales FROM sales_data WHERE sales > 10000 GROUP BY country HAVING SUM(sales) > 40000;
Result:
Country | Total Sales |
---|---|
USA | 47,000 |
Key Takeaways
The WHERE
clause filters rows before grouping, while the HAVING
clause filters aggregated groups. Combining these effectively allows precise control over the data included in your query results.