MySQL编程 基础篇(二)SQL执行流程

对于查询处理,可将其分为逻辑查询处理及物理查询处理。逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表MySQL数据库是如何得到该结果的。

逻辑查询处理的顺序以及步骤的序号,每一步操作都会产生一个虚拟表,该虚拟表作为下一个处理的输入。这些虚拟表对用户是透明的,只有最后一步生成的虚拟表才会返回给用户,如果没有在查询中指定某一子句,则将跳过相应的步骤。

 

  1. from,左表和右表执行笛卡尔积,产生虚拟表VT1

  2. on,对虚拟表VT1应用on筛选,产生虚拟表VT2;在产生VT2时,会增加一个额外的列来表示ON过滤条件的返回值,返回值有TRUE、FALSE、UNKNOWN。

对于在ON过滤条件下的NULL值比较,此时的比较结果为UNKNOWN,却被视为FALSE来进行处理,即两个NULL并不相同。但是在下面两种情况下认为两个NULL值的比较是相等的:GROUP BY子句把所有NULL值分到同一组。ORDER BY子句中把所有NULL值排列在一起。

  1. join,outer join,保留表中未匹配的行作为外部行添加到虚拟表VT2中,from包含两个以上表,重复执行1~3

  2. where

在当前应用WHERE过滤器时,有两种过滤是不被允许的:由于数据还没有分组,因此现在还不能在WHERE过滤器中使用 where_condition=MIN(col) 这类对统计的过滤。由于没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的,如SELECT city as c FROM t WHERE c='ShangHai'是不允许出现的。

  1. group byColumns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or column positions. Column positions are integers and begin with 1

  2. with

  3. having

  4. select,第二次执行SELECT操作,第一次是什么时候呢?我猜是group by。

  5. distinct

  6. order by

  7. limit

 

SELECT查询一共有3个过滤过程,分别是ON、WHERE、HAVING。ON是最先执行的过滤过程。

对于OUTER JOIN中的过滤,在ON过滤器过滤完之后还会添加保留表中被ON条件过滤掉的记录,所以on中的过滤条件不可靠,而WHERE条件中被过滤掉的记录则是永久的过滤。在INNER JOIN中两者是没有差别的,因为没有添加外部行的操作。

不要为表中的行假定任何特定的顺序。就是说,在实际使用环境中,如果确实需要有序输出行记录,则必须使用ORDER BY子句。

在MySQL数据库中,NULL值在升序过程中总是首先被选出,即NULL值在ORDER BY子句中被视为最小值

对于没有应用ORDER BY的LIMIT子句,结果同样可能是无序的,因此LIMIT子句通常和ORDER BY子句一起使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值