博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL编程 基础篇(二)SQL执行流程
阅读量:3906 次
发布时间:2019-05-23

本文共 1295 字,大约阅读时间需要 4 分钟。

对于查询处理,可将其分为逻辑查询处理及物理查询处理。逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表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子句一起使用

转载地址:http://biqen.baihongyu.com/

你可能感兴趣的文章
位运算符的使用总结(编辑网络的资源)
查看>>
RMS使用时要注要的地方
查看>>
android简单demo学习系例之菜单实现
查看>>
显示python库路径
查看>>
android简单demo学习系例之排版(LinearLayout)[xml-based]
查看>>
J2ME相关的开源项目
查看>>
android简单demo学习系例之排版(TableLayout)[code-based]
查看>>
android简单demo学习系例之排版(TableLayout)[xml-based]
查看>>
bash日期格式转换(去掉无意义的零)的可选方法
查看>>
常用计算机端口解释
查看>>
转载)保护眼睛,把电脑窗口背景设置成绿颜色
查看>>
FireFox 的强大Web开发插件
查看>>
MIME相关
查看>>
WAP1.0与WAP2.0页面的DTD
查看>>
如何学好C++语言
查看>>
包的设计原则
查看>>
回顾时光 详解HTML的发展史
查看>>
MinGW与Cygwin
查看>>
用WEB标准进行开发
查看>>
[译]关于Android图形系统的一些事实真相
查看>>