本文共 1295 字,大约阅读时间需要 4 分钟。
对于查询处理,可将其分为逻辑查询处理及物理查询处理。逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表MySQL数据库是如何得到该结果的。
逻辑查询处理的顺序以及步骤的序号,每一步操作都会产生一个虚拟表,该虚拟表作为下一个处理的输入。这些虚拟表对用户是透明的,只有最后一步生成的虚拟表才会返回给用户,如果没有在查询中指定某一子句,则将跳过相应的步骤。
from,左表和右表执行笛卡尔积,产生虚拟表VT1
on,对虚拟表VT1应用on筛选,产生虚拟表VT2;在产生VT2时,会增加一个额外的列来表示ON过滤条件的返回值,返回值有TRUE、FALSE、UNKNOWN。
对于在ON过滤条件下的NULL值比较,此时的比较结果为UNKNOWN,却被视为FALSE来进行处理,即两个NULL并不相同。但是在下面两种情况下认为两个NULL值的比较是相等的:GROUP BY子句把所有NULL值分到同一组。ORDER BY子句中把所有NULL值排列在一起。
join,outer join,保留表中未匹配的行作为外部行添加到虚拟表VT2中,from包含两个以上表,重复执行1~3
where
在当前应用WHERE过滤器时,有两种过滤是不被允许的:由于数据还没有分组,因此现在还不能在WHERE过滤器中使用 where_condition=MIN(col)
这类对统计的过滤。由于没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的,如SELECT city as c FROM t WHERE c='ShangHai'是不允许出现的。
group by,Columns 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
with
having
select,第二次执行SELECT操作,第一次是什么时候呢?我猜是group by。
distinct
order by
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/