SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_condition> (10) LIMIT <limit_number>
一、执行FROM语句数据库
第一步是执行from语句,找到<left_table>
和<right_table>
两张表,再作笛卡尔积,不论是否有对应关系,全都作好对应。把两张表的记录所有拼到一块儿。获得第一张虚拟表VT1。缓存
二、执行ON过滤大数据
第二步执行ON关键字,一个连表的依据,只取leftt_able.xx=right_table.xx的一个字段。在笛卡尔积的基础上,取两张表有对应关系的记录。获得第二张虚拟表VT2。spa
三、添加外部行code
实际就是实行JOIN类型,如LEFT OUTER JOIN
、RIGHT OUTER JOIN
和FULL OUTER JOIN
。在大多数的时候,咱们都是会省略掉OUTER
关键字的,但OUTER
表示的就是外部行的概念。在VT2的基础留下左表或者右边呃记录,获得虚拟表VT3。blog
四、执行where过滤排序
添加外部行获得的VT3进行WHERE过滤,只有符合<where_condition>的记录才会输出到虚拟表VT4中。索引
五、执行GROUP BY分组内存
GROU BY
子句主要是对使用WHERE
子句获得的虚拟表进行分组操做。获得的内容会存入虚拟表VT5中,此时,咱们就获得了一个VT5虚拟表开发
六、执行HAVING过滤
HAVING
子句主要和GROUP BY
子句配合使用,对分组获得的VT5虚拟表进行条件过滤。获得VT6虚拟表
七、SELECT列表
如今才会执行到SELECT
子句(不要觉得SELECT
子句被写在第一行,就是第一个被执行的)。
执行SELECT语句从VT6中选择出须要的内容。
八、DISTINCT子句
若是在查询中指定了DISTINCT
子句,则会建立一张内存临时表(若是内存放不下,就须要存放在硬盘了)。
临时表的表结构和上一步产生的虚拟表VT7是同样的,不一样的是对进行DISTINCT操做的列增长了一个惟一索引,以此来除重复数据。
九、ORDER BY子句
对虚拟表中的内容按照指定的列进行排序,而后返回一个新的虚拟表VT8。
十、执行LIMIT子句
LIMIT
子句从上一步获得的VT8虚拟表中选出从指定位置开始的指定行数据。对于没有应用ORDER BY的LIMIT子句,获得的结果一样是无序的,因此,不少时候,咱们都会看到LIMIT子句会和ORDER BY子句一块儿使用。
MySQL数据库的LIMIT支持以下形式的选择:
LIMIT n, m
表示从第n条记录开始选择m条记录。而不少开发人员喜欢使用该语句来解决分页问题。对于小数据,使用LIMIT子句没有任何问题,当数据量很是大的时候,使用LIMIT n, m
是很是低效的。由于LIMIT的机制是每次都是从头开始扫描,若是须要从第60万行开始,读取3条数据,就须要先扫描定位到60万行,而后再进行读取,而扫描的过程是一个很是低效的过程。因此,对于大数据处理时,是很是有必要在应用层创建必定的缓存机制(如今的大数据处理,大都使用缓存)