SQL 中的语法顺序与执行顺序

SQL 语句的语法顺序是:
SELECT DISTINCT
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
ORDER BY
< order_by_condition >
LIMIT < limit_number >
与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from–where–group by–having–select–order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据

from 子句–执行顺序为从后往前、从右到左
表名(最后面的那个表名为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后)
多表连接时,使用表的别名并把别名前缀于每个Column上。可以减少解析的时间并减少那些由Column 歧义引起的语法错误.

where子句–执行顺序为自下而上、从右到左

group by–执行顺序从左往右分组

执行select语句,使用聚集函数进行计算,再执行distinct, distinct一般放在select最后,
(聚合函数忽略null值), count(distinct(id))这种先执行distinct再聚合;

使用having子句筛选分组;

计算所有的表达式;

使用order by对结果集进行排序,执行顺序从左往右分组

limit 分页

sql的执行顺序: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 并返回调用者

mysql的where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个。(待验证,具体执行要看数据库的优化方案)有索引优先筛选索引

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页