sql的查询语句执行顺序

      sql语言中的查询的执行顺序,以前不是很了解,最近查阅了相关资料,在sql语言中,第一个被处理的字句总是from字句,最后执行的limit操作。现有以下的sql语句。

      (8)SELECT (9)DISTINCT<select_list>

      (1)FROM<left_table>

      (3)<join_type>JOIN<right_table>

      (2)  ON<join_condition>

      (5)GROUP BY<group_by_list>

      (6)WITH{CUBE|ROLLUP}

      (7)HAVING<having_condition>

      (10)ORDER BY<order_by_list>

      (11)LIMIT<limit_number>

以上的sql语句前的数字代表该sql语句的执行顺序,每一个操作都会产生一个虚拟表,这个虚拟表作为下个操作的输入,依次类推,最后生成的虚拟表作为结果输出。如果没有在查询中指定某一字句,则将跳过相应的步骤

1)FROM:对FROM子句中的左表<left_table>和右表<right_table>执行笛卡尔积,产生虚拟表VT1.

2)ON:对虚拟表VT1应用ON筛选,只有那些符合条件<join_condition>的行才会被插入虚拟表VT2中。

3)JOIN:如果是外连接,还要根据外连接的类型执行join操作,例如左外连接将左表中的行并且不在VT2中的行加入到VT2中,产生VT3.

4)WHERE:对虚拟表VT3应用where过滤条件,只有符合<where_condition>的记录才被插入虚拟表VT4中。

5)GROUP BY:根据GROUP BY字句中的列,对VT4中的记录进行分组操作,产生VT5.

6)CUBE|ROLLUP:对表VT5执行cube或者rollup操作,产生虚拟表VT6.

7)HAVING:对虚拟表VT6应用HAVING过滤器,只有符合<having_condition>的记录才会被插入虚拟表VT7中

8)SELECT:对VT7执行select操作,将指定的数据插入到虚拟表VT8中

9)DISTINCT:去除重复数据,产生虚拟表VT9.

10)ORDER BY:按照<order_by_list>对VT9进行排序操作,产生虚拟表VT10

11).LIMIT:选出指定的行,产生虚拟表VT11,返回给用户。

 

ps:在应用where过滤器的时候,有两种过滤不被允许。

(1).由于此时数据还没有分组,所以还不能在where中使用where_condition=MIN(col)这类对统计的过滤

(2).由于此时还没有进行select操作,所以where中不能使用在select中定义的列的别名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值