如果要深入了解数据库,首先就要从数据库的SQL执行顺序来开始学习,只有知道了基本的执行过程,才能更好的去思考优化的问题。
在说这个SQL的执行顺序之前,还有几个知识点需要提一下。
笛卡尔积:两个集合相乘,得到的结果包含了两个集合中元素之和。
永久表:普通意义上自行创建的表,用于长期保存数据等操作。
临时表:分为两种,其一是为了保存数据,也可以长期存在于数据库中;其二是因为SQL执行中临时创建的,在SQL执行结束后,就会被删除。
虚表:虚表类似于一个结果集,也可以说成是一个视图,只是个执行结果。
下面就来看一下MySQL的SQL执行顺序吧。
FROM
首先解析From两边的表,进行笛卡尔积的计算,产生一个虚表table1。
ON
接着通过ON条件来进行筛选,形成第二个虚表table2,最新的数据也在这里面。
JOIN
根据内连接和外连接的不同,这里也会有所不同,内连接会增加外部行,左连接会将ON过滤条件的左表添加进去,右连接会将ON过滤条件的右表添加进去,生成虚表table3。
WHERE
接着就是执行where过滤,通过where条件的过滤形成虚表table4。
GROUP BY
如果SQL语句中存在group by,则会对虚表table4进行分组,产生出虚表table5,紧接着会执行聚合函数。
HAVING
Group by执行完毕,会继续执行having过滤,从而生成虚表table6
SELECT
执行完上述语句后,就会执行select语句了,将虚表table6中的列,针对select进行筛选,随后生成出虚表table7
DISTINCT
select语句执行完毕后,就会去执行去重操作了,这里同样会生成新的虚表table8
ORDER BY
执行完上述操作后,就该执行排序了,在排序之后还会执行limit操作。