1. The SQL Logical Execution Pipeline
Why WHERE cannot see column aliases and why HAVING filters after aggregation.
The Problem & Mental Model
In SQL, the code is written in lexical order (SELECT → FROM → WHERE), but the query engine executes it in an entirely different logical sequence. Attempting to filter by a newly aliased column in WHERE causes an 'Unknown Column' error.
-- Fails: WHERE executes BEFORE SELECT, so alias 'net_rev' does not exist yet!
SELECT
product_id,
gross_sales - discount_amount AS net_rev
FROM sales
WHERE net_rev > 1000;-- Method A: Repeat the underlying expression
SELECT
product_id,
gross_sales - discount_amount AS net_rev
FROM sales
WHERE (gross_sales - discount_amount) > 1000;
-- Method B: Encapsulate with a CTE (Clean & Readable)
WITH calculated_sales AS (
SELECT
product_id,
gross_sales - discount_amount AS net_rev
FROM sales
)
SELECT *
FROM calculated_sales
WHERE net_rev > 1000;