记一次子查询优化,where与having优先级问题
2018-03-06 11:52
239 查看
原始sql
SELECT b.school_id , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id where COUNT(school_id)<90;
报错 !
原因:
大致解释如下,sql语句的执行过程是:from-->where-->group by -->having --- >order by --> select;
聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,会出现错误,
而having不一样,having是针对结果集做筛选的,所以我门一般吧组函数放在having中,用having来代替where,having一般跟在group by后
优化经历
第一版:将结果放入子查询实现where查询
SELECT school_id,shuliang from ( SELECT b.* , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id ) t WHERE shuliang<90 ;
第二版:使用having
SELECT b.*,COUNT(school_id) shuliang FROM Sheet1 a JOIN tag b ON a.学校编号 = b.school_id GROUP BY b.school_id HAVING shuliang < 90;
第三版:简化代码
SELECT b.school_id , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id HAVING COUNT(school_id)<90;
附上执行计划:
从第一版到最终sql 性能大概提升了40%
SELECT b.school_id , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id where COUNT(school_id)<90;
报错 !
原因:
大致解释如下,sql语句的执行过程是:from-->where-->group by -->having --- >order by --> select;
聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,会出现错误,
而having不一样,having是针对结果集做筛选的,所以我门一般吧组函数放在having中,用having来代替where,having一般跟在group by后
优化经历
第一版:将结果放入子查询实现where查询
SELECT school_id,shuliang from ( SELECT b.* , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id ) t WHERE shuliang<90 ;
第二版:使用having
SELECT b.*,COUNT(school_id) shuliang FROM Sheet1 a JOIN tag b ON a.学校编号 = b.school_id GROUP BY b.school_id HAVING shuliang < 90;
第三版:简化代码
SELECT b.school_id , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id HAVING COUNT(school_id)<90;
附上执行计划:
从第一版到最终sql 性能大概提升了40%
相关文章推荐
- 4000 SQL之解决where 1=1 问题及优化多条件查询
- 数据库查询优化问题笔记
- 关于MYSQL查询时WHERE条件值为数字的问题
- SQL语句---from 和where 查询条件的优先级
- Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.ht
- 查询语句中select from where group by having order by的执行顺序
- 当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序
- 分页语句where条件中的子查询有or关键字优化
- MOSS中SPQuery对象的查询问题与优先级问题?
- 当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序
- Mysql中Group By使用Having语句配合查询(where和having区别)
- MOSS中SPQuery对象的查询问题与优先级问题
- 查询语句中select from where group by having order by的执行顺序
- union all 和where条件一起使用查询数据不对的问题
- MySQL性能优化小记:MySQL子查询很慢的问题
- 项目问题总结三、分表跨月查询速度优化
- 查询语句中select from where group by having order by的执行顺序
- oracle查询语句中select from where group by having order by的解释与应用
- MySQL查询之ON,WHERE,HAVING
- oracle11g分页优化,rowid和rownum的性能比较,解决越往后数据查询越慢的问题