在查询中逻辑查询和物理查询有着本质的区别,SQL不同于其它编程的最明显的特征就是处理代码的顺序,虽然总是最先写SELECT 但是几乎总在最后执行,那到底是怎么一个执行顺序呢?

首要作者给出了如下的SQL查询句子履行鸡飞蛋打

详解SQL逻辑查询的各个阶段(sql的查询处理分为哪几个阶段)  SQL 逻辑查询 优化 第1张

(8) select (9) distinct (11) <top_specification> <select_list>

(1)from <left_table>

(3) <join_type> join <right_table>

(2) on <join _condition>

(4) where <where_condition>

(5)group by <group_by_list>

(6) with {cube|rollup}

(7)having(having_condition)

(10) order by <order_by_condition>

从这个鸡飞蛋打中咱们不难发现,一切的 查询句子都是从from开端履行的,在履行进程中,每个立刻都会为

下一个立刻生成一个虚拟表,这个虚拟表将作为下一个履行立刻的输入。

***步:首要对from子句中的前两个表履行一个笛卡尔乘积,此刻生成虚拟表 vt1

第二步:接下来便是运用on挑选器,on 中的逻辑表达式将运用到 vt1 中的各个行,挑选出满意on逻辑表达式的行,生成虚拟表 vt2

第三步:假如是outer join 那么这一步就将增加外部行,left outer jion 就把左表在第二步中过滤的增加进来,假如是right outer join 那么就将右表在第二步中过滤掉的行增加进来,这样生成虚拟表 vt3

第四步:假如 from 子句中的表数目吉人天相两个表,那么就将vt3和第三个表衔接然后核算笛卡尔乘积,生成虚拟表,该进程便是一个重复1-3的立刻,终究得到一个新的虚拟表 vt3

第五步:运用where挑选器,对上一步出产的虚拟表引证where挑选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,关于包括outer join子句的查询,就有一个让人感到困惑的问题,到底在on挑选器仍是用where挑选器指定逻辑表达式呢?on和where的***差异在于,假如在on运用逻辑表达式那么在第三步outer join中还能够把移除的行再次增加回来,而where的移除的终究的。

举个简略的比如,有一个学生表(班级,假充)和一个成果表(假充,成果),我现在需求回来一个x班级的全体同学的成果,可是这个班级有几个学生缺考,也便是说在成果表中没有记载。为了得到咱们预期的成果咱们就需求在on子句指定学生和成果表的联系(学生.假充=成果.假充)那么咱们是否发现在履行第二步的时分,关于没有参加考试的学生记载就不会呈现在vt2中,由于他们被on的逻辑表达式过滤掉了,可是咱们用left outer join就能够把左表(学生)中没有参加考试的学生找回来,由于咱们想回来的是x班级的一切学生,假如在on中运用学生.班级='x'的话,那么在left outer join 中就会将不会把x班级的学生的一切记载找回来,所以只能在where挑选器中运用 学生.班级='x' 应为它的过滤是终究的。

第六步:group by 子句将中的仅有的值组合成为一组,得到虚拟表vt5。假如运用了group by,那么走私的一切立刻都只能得到的vt5的列或许是聚合函数(count、sum、avg等)。原因在于终究的成果会集只为每个组包括一行。这一点请紧记。

第七步:运用cube或许rollup选项,为vt5生成超组,生成vt6.

第八步:运用having挑选器,生成vt7。having挑选器是***个也是为仅有一个运用到已分组数据的挑选器。

第九步:处理select列表。将vt7中的在select中呈现的列挑选出来。生成vt8.

第十步:运用distinct子句,vt8中移除相同的行,生成vt9。事实上假如运用了group by子句那么distinct是吉人天相的,原因相同在于,分组的时分是将列中仅有的值分红一组,画蛇添足只为每一组回来一行记载,那么所以的记载都将是不相同的。

第十一步:运用order by子句。依照order_by_condition排序vt9,此刻回来的一个游标,而不是虚拟表。sql是根据调集的理论的,调集不会预先对他的行排序,它仅仅成员的逻辑调集,成员的鸡飞蛋打是无关紧要的。对表进行排序的查询能够回来一个光辉,这个光辉包括特定的物理鸡飞蛋打的逻辑安排。这个光辉就叫游标。正由于回来值是游标,那么运用order by 子句查询不能运用于表表达式。排序是很需求本钱的,除非你必需要排序,不然***不要指定order by,***,在这一步中是***个也是仅有一个能够运用select列表中别号的立刻。

第十二步:运用top选项。此刻才回来成果给请求者即用户。到此为止咱们将一个sql查询句子的逻辑履行进程梳理了一遍,关于运用查询句子多年的我来说,无疑对曾经的不少问题得出了隔绝。期望你也能从中获益。我将在走私介绍sqlserver 2005中新参加的逻辑处理阶段。

【修改引荐】

  1. 教你怎么优化SQL句子中的物理查询
  2. SQL Server 2008的晋级与布置
  3. 在SQL中运用正则表达式来查找你所要的字符
转载请说明出处
知优网 » 详解SQL逻辑查询的各个阶段(sql的查询处理分为哪几个阶段)

发表评论

您需要后才能发表评论