查询执行顺序

SQL 查询执行顺序与书写规范

一、SQL 语句关键词顺序与执行顺序

查询中用到的关键词主要包含六个,书写顺序依次为:

select → from → where → group by → having → order by

其中 select 和 from 是必须的,其他关键词可选。但这六个关键词的执行顺序与书写顺序不同,实际执行顺序如下:

from → where → group by → having → select → order by

各阶段作用说明:

  • from:需要从哪个数据表检索数据
  • where:过滤表中数据的条件
  • group by:如何将上面过滤出的数据分组
  • having:对上面已经分组的数据进行过滤的条件
  • select:查看结果集中的哪个列,或列的计算结果
  • order by:按照什么样的顺序来查看返回的数据

示例:

SELECT s.学号, c.班级名 -- ⑤ 决定要显示哪些列
  FROM dbo.学生信息 as s  -- ① 20 条记录
  full join [dbo].[班级信息] as c
  on c.班级编号 = s.所属班级  
  WHERE s.学号 is null OR c.班级编号 is null -- ② 过滤了18条
  -- group by xxx  -- ③
  -- having xxx    -- ④
  ORDER BY s.学号 -- ⑥ 对显示的列进行排序Code language: JavaScript (javascript)

二、解析顺序与书写建议

  • from 后面的表关联,是自右向左解析的;where 条件的解析顺序是自下而上的。
  • 写 SQL 语句时,尽量把数据量大的表放在最右边来进行关联,而把能筛选出大量数据的条件放在 where 语句的最下面。

三、SQL Select 语句完整执行顺序(从 DBMS 使用者角度)

  1. from 子句组装来自不同数据源的数据;
  2. where 子句基于指定的条件对记录行进行筛选;
  3. group by 子句将数据划分为多个分组;
  4. 使用聚集函数进行计算;
  5. 使用 having 子句筛选分组;
  6. 计算所有的表达式;
  7. 使用 order by 对结果集进行排序。

四、注意

  1. having 子句:很耗资源,尽量少用。
  2. on 与 where 的执行时机:在多表联接查询时,on 比 where 更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由 where 进行过滤,然后再计算,计算完后再由 having 进行过滤。
  3. select 子句:少用 * 号,尽量写字段名称。在解析的过程中,会将 * 依次转换成所有的列名,这个工作是通过查询数据字典完成的,使用列名意味着将减少消耗时间。
  4. order by 子句:执行顺序为从左到右排序,很耗资源。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注