要想学好 SQL ,理解 SQL 语句的执行顺序是非常重要的,只有理解了 SQL 语句的执行顺序,才不会在我们写 SQL 语句发现错误时变得手足无措。
在大多数编程语言中,代码行是按照它们的编写顺序来执行处理的。而在 SQL 语句中,情况则有些不同。即使 SELECT 子句在查询中最先出现,在逻辑上差不多是最后才处理它。
各子句在逻辑上按以下顺序进行处理:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
例如:
select empid,YEAR(orderdate) as orderyear,COUNT(*) as numorders
from Sales.Orders
where custid=71
group by empid,YEAR(orderdate)
having COUNT(*)>1
order by empid,orderyear;
即使这个简单的查询在语法上以 SELECT 子句作为开始,而在逻辑上则应该以如下顺序来处理它的各个子句:
FROM Sales.Orders
WHERE custid=71
GROUP BY empid,YEAR(orderdate)
HAVING COUNT(*)>1
SELECT empid,YEAR(orderdate) AS orderyear,COUNT(*) AS numorders
ORDER BY empid,orderyear
该语句的功能是:
1. 从 Sales.Orders 表中查询数据行。
2. 对订单数据进行过滤,只保留客户 ID 等于 71 的记录。
3. 按雇员 ID 和订单年份对订单数据进行分组。
4. 对分组数据(雇员 ID 和订单年份)进行过滤,只保留具有多个订单的分组。
5. 选择(返回)每个分组的雇员 ID 、订单年份,以及订单数量。
6. 按照雇员 ID 和订单年份对输出结果进行排序。
注意:推荐使用分号来结束 SQL 语句。 SQL Server 并不强制要求所有语句都要用分号结束,只有当代码的含义可能产生歧义的特殊情况下,才需要使用分号。推荐使用分号作为所有语句的结束,这是一种标准,可以提高代码的可读性,以后很可能SQL Server 在更多的情况下都将要求使用分号。目前,虽然不要求必须使用分号,不过,加上分号也不会有什么影响。