请着重讲解原理。
众所周知在mysql查询语句关键字中,select关键字运行顺序是在having后,在order by前。
那么既然是如此,select coloum as 别名 更不应该可以被having操作吧?因为在having运行的的时候,select还没运行呢,也就是没产生视图吧。
是我理解的有误,还是他有另外一种运行方式(例如运行sql语句前率先初始化..等等)
望懂的人不吝赐教,谢谢!
mysql/oracle 都可以讲讲
请着重讲解原理。
众所周知在mysql查询语句关键字中,select关键字运行顺序是在having后,在order by前。
那么既然是如此,select coloum as 别名 更不应该可以被having操作吧?因为在having运行的的时候,select还没运行呢,也就是没产生视图吧。
是我理解的有误,还是他有另外一种运行方式(例如运行sql语句前率先初始化..等等)
望懂的人不吝赐教,谢谢!
mysql/oracle 都可以讲讲
sqlserver
一:查询的逻辑执行顺序
(1) FROM < left_table>
(3) < join_type> JOIN < right_table> (2) ON < join_condition>
(4) WHERE < where_condition>
(5) GROUP BY < group_by_list>
(6) WITH {cube | rollup}
(7) HAVING < having_condition>
(8) SELECT (9) DISTINCT (11) < top_specification> < select_list>
(10) ORDER BY < order_by_list>
标准的SQL 的解析顺序为:
(1).FROM 子句 组装来自不同数据源的数据
(2).WHERE 子句 基于指定的条件对记录进行筛选
(3).GROUP BY 子句 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用HAVING子句筛选分组
(6).计算所有的表达式
(7).使用ORDER BY对结果集进行排序
二 执行顺序:
1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1
2.ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2
3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
4.WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5
6.CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6
7.HAVING:对vt6应用HAVING筛选器只有使< having_condition> 为true的组才插入vt7
8.SELECT:处理select列表产生vt8
9.DISTINCT:将重复的行从vt8中去除产生vt9
10.ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10
11.TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
5 回答1.4k 阅读
2 回答1.8k 阅读
我之前也考虑过这个问题。
结论是:网上给的资料都是大概的针对整个sql来说,而并非针对mysql.
mysql的处理方式是中间生成虚拟表(或者叫临时表),而这个虚拟表的生成的列靠的就是select,所以猜测类似having之后的操作,其实内部已经根据select生成了虚拟表,列自然也是as后的。