----Mysql Select 语句执行顺序
SQL查询的大致语法结构如下
(5)select distinct <select_list>
(1) from <left_table> <join_type> join <right_table> on <on_predicate>
(2) where <where_predicate>
(3) group by <group_by_specification>
(4)having <having_predicate>
(6)order by <order _by_list>
(7)limit n,m
查询处理的顺序如下:
1.from
2.on
3.join
4.where
5.group by
6.having
7.select
8.distinct
9.order by
10.limit
这些步骤执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作
下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外
部查询)不可用。只是最后一步生成的表才会返回给调用者。如果
没有在查询中指定某一子句,将跳过相应的步骤
select各个阶段分别干了什么:
1.from阶段
from阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:
求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(CROSS JOIN),求笛卡儿积(Cartesian product),生成虚拟表VT1-J1。
ON筛选器。 这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。
添加外部行。如果指定了OUTER JOIN,如LEFT OUTERJOIN、RIGHT OUTER JOIN),还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,
生成VT1-J3。如果FROM子句包含两个以上表,则对上一个连接生成的结果表VT1-J3和下一个表重复依次执行3个步骤,直到处理完所有的表为止。
2.where阶段
WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。此时数据还没有分组,所以不能在WHERE中出现对统计的过滤。
3.group by
GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。在GROUP BY阶段,数据库认为两个NULL值是相等的,因此会将NULL值分到同一个分组中。
4.having
该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。COUNT(expr) 会返回expr不为NULL的行数,count(1)、count(*)会返回包括NULL值在内的所有数量。
5.select
这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行:
计算SELECT列表中的表达式,生成VT5-1。
若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2。
6.order by
根据ORDER BY子句中指定的列明列表,对VT5-2中的行,进行排序,生成VT6。如果不指定排序,数据并非总是按照主键顺序进行排序的。NULL被视为最小值。
7.limit
取出指定行的记录,产生虚拟表VT7,并返回给查询用户。LIMIT n, m的效率是十分低的,一般可以通过在WHERE条件中指定范围来优化 WHERE id > ? limit 10。
----结构化查询语言分类
结构化查询语言可分为5类
数据查询语言(DQL:Data Query Language):
语句主要包括select,用于从表中检索数据
数据操作语言(DML:Data Manipulation Language):
语句主要包括insert,updata和delete,用于添加,修改和删除表中的行数据。
事务处理语言(TPL:Transaction Process Language):
语句主要包括commit和rollback,用于提交和回滚
数据控制语言(DCL:Data Control Language):
语句主要包括grant和revoke,用于进行授权和收回权限
数据定义语言(DDL:Data Definition Language):
语句主要包括create,drop,alter,用于定义、销毁、修改数据库对象。