摘抄自 —— https ://juejin.im/post/5cf14feaf265da1b5e72daa5(https ://juejin.im/post/5cf244246fb9a07edf272c6f ——MySQL基础架构)
*以下顺序,是按照一个select查询语句执行顺序排序
1.from
from 是一次查询语句的开端
- 如果是一张表,会直接操作这张表 -select * from Atable
- 如果后面跟的是一个子查询,先执行子查询内容
- from后面关联多张表,用join,见2,3 -select * from Atable join Btable on Atable.id=Btable.id
2.join
from后面关联多张表,使用join关联,先对前两张表执行一个笛卡尔乘积,生成一个虚拟表T1
select * from Atable join Btable
3.on
对虚拟表进行on筛选,符合的行才会被记录在虚拟表T2中(如果还有第3、第4张表,T2与第3张表执行笛卡尔积产生T3表,依次持续下去~)
select * from Atable a join Btable b on a.id=b.id join Ctable c on c.uid=b.uid
4.where(针对行hang进行的过滤)
条件筛选,对虚拟表T2进行筛选,符合条件的才会被插入T3中
select * from Atable a join Btable b on a.id=b.id where a.id>=5
5.group by
将最后得到的虚拟表T3,把同一列的同一个字段分在一组,只给每一组返回一行记录,后得到T4虚拟表(ps:使用了group by,后面的所有操作只能在虚拟表T4的列上,行不能操作,或者聚合函数(count、sum、avg等))
select * from Atable a join Btable b on a.id=b.id where a.id>=5 group by a.id
6.avg,sum...等聚合函数
聚合函数只对分组结果进行处理,拿到需要的聚合值,不会插入到虚拟表中。
7.having(针对分组进行过滤)
类似where,不同之处在于,having是做分组之后的条件筛选(一般和group by配合使用),生成虚拟表T5
select id count(*) as total from Atable where id<=5 group by id having total>200
8.select
select选择指定列,插入虚拟表T6中
9.distinct
对虚拟表T6去重,移除相同的行,得到虚拟表T7(如果使用了group by,那么无需再去重)
10.orderby
·order by的返回值是游标,其子查询不能应用于表达式;
- 使用order by查询成本高,非必要不使用
- asc升序,desc降序
11.limit
取出制定行记录,产生虚拟表T9,返回结果
- limit m 前m条数据
- limit m n 从m到n条数据