1. 书写顺序

  select->distinct->from->join->on->where->group by->having->order by->limit

2. 执行顺序 

  from->on->join->where->group by->sum、count、max、avg->having->select->distinct->order by->limit

3. 详细说明  

  from: 需要从哪个数据表检索数据;

  join: 对需要关联查询的表进行关联;
    关联查询时,数据库会选择一个驱动表,然后用此表的记录去关联其他表;
    left join一般以左表为驱动表(right join一般为右表),inner join一般以结果集少的表为驱动表;
    left join某些情况下会被查询优化器优化为inner join.

  on: 关联条件

  where: 过滤表中数据的条件;
    执行顺序: 自下而上、从右到左.
    注:   对数据库记录生效,
      无法对聚合结果生效,
      可以过滤掉最大数量记录的条件必须写在where子句末尾,
      不能使用聚合函数(sum、count、max、avg).

  group by: 如何将上面过滤出的数据分组;
    执行顺序: 从左往右.
    注: 尽量在group by之前使用where过滤,避免之后使用having过滤.

  avg: 求平均值;

  having: 对上面已经分组的数据进行过滤的条件;
    注: 对聚合结果过滤,因此很耗资源,可以使用聚合函数.
    例: 筛选统计人口数量大于100W的地区.
      select region,sum(population),sum(area) from bbc group by region having sum(population)>1000000
    不能用where筛选超过100W的地区,因为不存在这样的一条记录.

  select: 查看结果集中的哪个列或列的计算结果;

  distinct: 对结果集重复值去重;

  order by: 按照什么样的顺序来查看返回的数据;
    执行顺序: 从左到右.
    注: 很耗资源.

  limit: 截取出目标页数据.