In SQL, as far as I know, the logical query processing order, which is the conceptual interpretation order, starts with FROM in the following way: 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. ORDER BY Following this list it's easy to see why you can't have SELECT aliases in a WHERE clause, because the alias hasn't been created yet. T-SQL (SQL Server) follows this strictly and you can't use SELECT aliases until you've passed SELECT. **But in MySQL it's possible to use SELECT aliases in the HAVING clause even though it should (logically) be processed before the SELECT clause. How can this be possible?** To give an example: SELECT YEAR(orderdate), COUNT(*) as Amount FROM Sales.Orders GROUP BY YEAR(orderdate) HAVING Amount>1; The statement is invalid in T-SQL (because HAVING is referring to the SELECT alias `Amount`)... Msg 207, Level 16, State 1, Line 5 Invalid column name 'Amount'. ...but works just fine in MySQL. Based upon this, I'm wondering: - Is MySQL taking a shortcut in the SQL rules to help the user? Maybe using some kind of pre-analysis? - Or is MySQL using a different conceptual interpretation order than the one I though all RDBMS were following?