SQL查询语句执行的逻辑顺序
一、简介
大家都知道SELECT语句是用来查询数据表中的数据的,构成SELECT语句的还有各种元素(where、from、group by等),不同元素又代表了不同的处理逻辑,那么这些元素在执行查询时处理的顺序是怎么样的?
本文就说明每个元素在执行查询时的逻辑顺序和作用。
二、逻辑查询和物理查询
逻辑查询,是一个术语名词,其意思是SQL查询在处理的原理和概念,理解SQL语句背后的查询逻辑是为了让我们把查询知识更好的融会贯通。在分析逻辑查询的原理时,往往表面上会看似效率低下。
但是真正在执行的时候,数据库服务器引擎实行物理查询,数据库服务器引擎不会按部就班的按照逻辑查询的方式和步骤去执行,它会在遵守“逻辑查询”的规范和要求的前提下,实行优化方案。
三、执行顺序
对于大多数编程语言,代码的执行是按照编写时的顺序处理的,在SQL中有所不同。就select来说,虽然它出现在语句的首部,但是它实际上并不是第一个处理的元素。
通过示例代码更好的描述select查询的逻辑。
select empid,YEAR(orderdate) as orderyear,COUNT(*) as numorder
from Sales.Orders
where custid=71
group by empid,YEAR(orderdate)
having COUNT(*) >1
order by empid,orderyear
SQL语句解读:
此查询要查出客户ID为71其下的订单,按照员工ID和订单年份进行分组,并且对分组后的数据进行筛选,筛选订单数量大于1的。
查询显示的字段信息有:员工ID、订单年份和订单数量,并按照员工ID和订单年份进行了排序。
查询语句的执行顺序:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
按照执行逻辑我们可以对比下示例中的语法,可以得出一个结论,SQL语句的逻辑执行顺序不是按照我们编写的语法格式顺序去执行的。
将语法按照逻辑执行顺序编写,分析每个元素子句执行的功能:
四、SQL语句的元素不按照编写的顺序执行
SQL设计师想把编写SQL语句的构思,就好像我们说一段话一样,让我们更好的编写查询语句。试想,一个人对另一个人下达一个指令,通常是这样描述:“给我厨房里左上方抽屉中的车钥匙”。
我们按照这样的方式去编写SQL语句就变道很直观。但如果你对机器或者计算机程序去表达指令,你就不得不以操作的角度去表达你的指令,指令会像这样描述:“去厨房,打开左上方的抽屉,拿车钥匙,带给我”。
所以我们编写SQL语句时,就可以像人与人之间表达指令一样,就像查询语句先从SELECT开始(你需要什么),而逻辑查询就像机器执行指令的概念一样(先去找到执行地点,所以它首先处理FROM)。