mysql 语句执行顺序问题
今天在写程序的时候,做分页查找时无意中,将计算数据库查询数量的语句,放到了limit之中,导致出现了bug。
所以发现以下问题:
select count(1) from table limit 0,20; 可以返回正确的结果
select count(1) from table limit 20,40;返回数量为0
当时还半天没想懂为什么,网友一语点醒:count返回的结果只有一个,你的limit 20,40当然没有结果!
突然警醒,是sql语句的执行顺序问题导致的我的理解错误。所以记录一下sql语句的执行顺序问题。
过滤条件由大到小,以下为自己理解。如有错误,请指正:
1.from sql执行的顺序永远第一个时from,只有拿出数据,才能够进行筛选
2.join,链接查询,将多表中的数据进行联接,才能够形成符合条件的数据
3.on,将符合条件的查询,进行第一次筛选,和join合成,以哪个字段为依据,
4.where,最大的条件筛选,
5.group,分组查询,
6.rollup,所得结果集,进行列聚合
7.HAVING,将第五步所得分组,进一步根据having条件进行过滤,例如数量超过50的分组,故必须在group之后
8.select,是在之前的所得结果集选择相应的列,所以要建立在已经筛选过的数据集合
9.distinct,去重,由于由unikey的原因,如果table存在三个字段作为unikey,select其中的两个字段,这时在select之前distinct去重,那么select所得的字段还会有重复数据,所以只有在select之后,才能真正的去重。
10.orderby,排序
11.limit,所有sql,都是最后才执行limit,他对数据集不进行过滤,只是进行截取。
同时查看了以下count函数,count(*),count(1),count(coloumn)三种的区别:
count(1)效率最快,1不代表任何字段,只是代表一个值,返回计数结果,count(2),count(3)的结果也一样,不代表实际意义;
count(*)效率第二快,只不过执行时,会把*翻译成具体字段,进行查询,多了一个翻译的步骤;
count(coloumn)效率最差,他不只是查询数量,而且计数不准确,他会遍历表中每一个该字段,并过滤掉该字段的无效值,返回计数。
mysql 语句执行顺序问题的更多相关文章
- Mysql 语句执行顺序
1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西? 在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需 ...
- MySQL语句执行顺序
执行顺序:见:http://www.cnblogs.com/rollenholt/p/3776923.html 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计 ...
- mysql语句执行顺序图示
- 关于sql和MySQL的语句执行顺序(必看!!!)
今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...
- (转)关于sql和MySQL的语句执行顺序(必看!!!)
原文:https://blog.csdn.net/u014044812/article/details/51004754 https://blog.csdn.net/j080624/article/d ...
- MySQL的语句执行顺序
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- 关于sql和MySQL的语句执行顺序
sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...
- python 3 mysql sql逻辑查询语句执行顺序
python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...
- mysql优化必知(mysql的语句执行顺序)
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
随机推荐
- Linux 组群账户管理
一.Linux组群账户配置文件 1./etc/group文件 /etc/group文件是用户组群的配置文件,内容包括用户和用户组群,并且能显示出用户是归属哪个用户组群或哪几个用户组群.一个用户可以归属 ...
- 一个CString的实现 拷贝构造函数的应用
class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...
- 深入理解JS异步编程三(promise)
jQuery 原本写一个小动画我们可能是这样的 $('.animateEle').animate({ opacity:'.5' }, 4000,function(){ $('.animateEle2' ...
- CentOS网络配置详解
转载于CentOS中文站:http://www.centoscn.com/CentOS/2015/0507/5376.html一.配置文件详解 在RHEL或者CentOS等Redhat系的Linux系 ...
- 快考试了,尽快写完HashTable。
(1)Count Primes 质数(素数):在大于1 的自然数中,除了1和它本身之外,不能被任何其他整数整除. 解题思路:使用一个boolean类型的数组,从i(2) 开始循环,将小于N的i的倍数都 ...
- Echarts tooltip文字没有左对齐
tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type : 'shadow' // 默认为直线,可选为:'line' | ...
- TCP通讯socket自定义协议的实现
转发(JAVA):http://blog.csdn.net/u010818425/article/details/53448817 一个简单的自定义通信协议(socket),http://blog.c ...
- 关于Android的布局
Android中五大布局是直接继承ViewGroup的布局:RelativeLayout.GridLayout.FrameLayout.AbsoluteLayout.LinnerLayout(Tabl ...
- UVA315 (无向图求割点)
题目大意:给定一个无向图,问共存在多少个割点.(割点:去掉此点后此图会断开连接)割点有两种存在:一种是第一次搜索的根节点,若其子节点数超过两个,则此点去掉后图会 断开连接,因此此点为割点:或者此点为搜 ...
- AngularJS学习--- AngularJS中模板链接和图像 ng-src step6
接上一篇文章,本文将主要介绍angularjs中的模板链接,和图像显示? 首先,切换分支,启动项目: git checkout step- npm start 1.效果 相较于前一篇文章,明显感觉多了 ...