sql语句顺序
理解sql内在的执行顺序有利于我们写的高质量的sql语句
书写顺序
SQL 语句的书写顺序如下:
- SELECT [列名称]
- FROM [表名称]
- join_type(内,左右外连接) JOIN [表名称]
- ON [join条件]
- WHERE [过滤条件]
- GROUP BY [分组字段]
- HAVING [分组条件]
- ORDER BY [排序字段]
解析顺序
- FROM 组装数据,来自不同数据源(表)
- WHERE 根据条件过滤记录
- GROUP BY 对数据分组
- 计算聚集函数,如avg,sum
- 使用HAVING子句筛选分组
- 使用ORDER BY对结果排序
- SELECT 选择
执行顺序
FROM: 对前2个表执行笛卡尔积,生成虚表vt1
ON: 对vt1应用on条件,只有满足join_condition条件的才能插入虚表vt2
OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
WHERE: 对vt3进行where筛选,只有满足where条件的才能插入vt4
GROUP BY: 对vt4按group by字段分组,得到vt5
HAVING:对vt5应用HAVING筛选器只有使 having_condition 为true的组才插入vt6
SELECT:处理select列表产生vt7
DISTINCT:将重复的行从vt7中去除产生vt8
ORDER BY:将vt8的行按order by子句中的列 列表排序生成一个游标vc9
LIMIT(Mysql): 从vc9的开始处选择指定数量的行生成vt10 并返回调用者
简单来讲:
就是用FROM 来得到要操作的表(将符合条件的连接表加入),然后排除掉不符合WHERE条件的记录,接着对现存集合分组(GROP BY),筛选(HAVING),计算聚集函数,得到一个新集合,根据有没有DISTINCT去重,LIMIT选部分,最后返回结果。
提高sql的效率就是要减少操作的数据量和步骤
join表不能太多,先过滤条件然后再根据表连接,同时在表中建立相关查询字段的索引(减少步骤)
简单示例
理解记忆
这张图很不错,来自这里
参考链接
https://www.douban.com/note/721210149/
https://www.jianshu.com/p/37e2bd6f5a7a
https://blog.youkuaiyun.com/weigeshikebi/article/details/80766494