mysql 执行顺序
sql顺序
从上面看到,在sql中,on是写在了where条件之前,那么数据库引擎分析执行sql时,是否on也是在where前面呢?
一般sql的写法顺序
SELECT [列名称 *代表所有的列]
FROM [表名称]
join_type JOIN [表名称]
ON [join条件]
WHERE [过滤条件]
GROUP BY [分组字段]
HAVING [分组条件]
ORDER BY [排序字段]
那么sql在执行时,顺序是怎样的呢?
标准的sql解析顺序为:
FROM 组装数据,来自不同数据源(表)
WHERE 根据条件过滤记录
GROUP BY 对数据分组
计算聚集函数,如avg,sum
使用HAVING子句筛选分组
计算所有表达式
使用ORDER BY对结果排序
那么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 并返回调用者
到了这里,应该发现,要写好sql不容易。但是了解了sql的执行顺序,能在开发的同理,更好的帮助写出好的程序。
根据顺序:mysql 5.7以后:
group by : select 在group by 之后, 所有select的字段, 除聚合函数中的字段, 都必须在group by中出现
eg: select A,B,C,count(D),sum(E)from table group by A,B,C
group by 分组后只显示分组里面的第一条数据,所以 select 中一般都是聚合函数才有意义
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。一般having后面跟的条件判断的字段必须是聚合函数返回的结果,通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:
eg:SELECT A, COUNT(B) xx FROM TABLE GROUP BY A HAVING COUNT(B)>2
eg:SELECT A ,COUNT(B) xx FROM TABLE GROUP BY A HAVING xx >2
----第一种写法比较容易理解
换言之: select 和having 中的字段需要是group by 中的字段 或者是聚合函数
order by: order by 作用在select 之后, order by中的字段需要是select 中的 字段

浙公网安备 33010602011771号