SQL 的执行顺序

  1. select distinct user.name
  2. from user
  3. join vip on user.id = vip.id
  4. where user.id > 10
  5. group by user.mobile
  6. having count(*) > 2
  7. order by user.id
  8. limit 3;

1. 首先 from 表名1 join 表名2

首先执行 from user join vip on user.id = vip.id 但是到底是 user 表作为驱动表呢,还是 vip 作为驱动表呢?这个需要视情况而定:

  • 如果使用的是内连接(join、inner join)的话,优化器基于成本决定哪个表作为驱动表(优化器会优先把 where 条件查询字段带有索引的表作为被驱动表,以加快连接速度)
  • 如果使用的是左外连接(left join)的话,会把 user 表作为驱动表【其实也不一定,MySQL 可能会对 SQL 进行优化】
  • 如果使用的是右外连接(right join)的话,会把 vip 表作为驱动表【其实也不一定,MySQL 可能会对 SQL 进行优化】

如果被驱动表的条件查询字段带有索引,那么会使用 NLJ 算法。
如果被驱动表的条件查询字段不带有索引,那么会使用 BNL 算法。

2. where 语句

3. group by 语句

group by 是分组语句。

4. 聚合函数

常用的聚合函数有 max、min、count、sum。
不论聚合函数是写在 select 后,比如 select count();还是写在 having 后,比如 having count() > 1,都是聚合函数的执行在 group by 之后,having 之前

5. having 语句

having 是和 group by 配合使用的,用来做分组后的条件限定。

6. select 语句

select 对分组、聚合、筛选后的记录挑选出需要查询的数据。

7. distinct 语句

distinct 是对数据进行去重的语句。

8. order by 语句

order by 是排序语句。
这里可以使用 select 语句中创建的别名。(as 别名)

8. limit 语句

limit 语句用于指定返回的数据条数。
limit 常配合 order by 使用。

NLJ 算法 和 BNL 算法

参考资料

34 | 到底可不可以使用 join?
35 | join语句怎么优化?