今天在写程序的时候,做分页查找时无意中,将计算数据库查询数量的语句,放到了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 语句执行顺序问题的更多相关文章

  1. Mysql 语句执行顺序

    1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西?  在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需 ...

  2. MySQL语句执行顺序

    执行顺序:见:http://www.cnblogs.com/rollenholt/p/3776923.html 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计 ...

  3. mysql语句执行顺序图示

  4. 关于sql和MySQL的语句执行顺序(必看!!!)

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...

  5. (转)关于sql和MySQL的语句执行顺序(必看!!!)

    原文:https://blog.csdn.net/u014044812/article/details/51004754 https://blog.csdn.net/j080624/article/d ...

  6. MySQL的语句执行顺序

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

  7. 关于sql和MySQL的语句执行顺序

    sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...

  8. python 3 mysql sql逻辑查询语句执行顺序

    python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...

  9. mysql优化必知(mysql的语句执行顺序)

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

随机推荐

  1. android 横竖屏切换

    解决Android手机 屏幕横竖屏切换 Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的 ...

  2. C#的 is 和 as 类型转换

    C#在操作类型转换时,提供了 as 和 is , 显式,隐式类型转换,由于显式和隐式类型转换比较容易理解,这里主要介绍下 is 和 as 的转换. 1. is  转换   is 操作符指定一个对象类型 ...

  3. Oracle 表分区

    从以下几个方面来整理关于分区表的概念及操作: 表空间及分区表的概念 表分区的具体作用 表分区的优缺点 表分区的几种类型及操作方法 对表分区的维护性操作 1.表空间及分区表的概念 表空间: 是一个或多个 ...

  4. Fragment一些问题

    1.使用fragment静态加载,当需要替换的时候使用replace方式是无效的....... 2.replace的容器如果是线性布局,那么将会出现之前的页面残留的情况,正确做法是使用FrameLay ...

  5. sqlite支持各种交集差集 并集操作了

  6. java length size

    1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这 ...

  7. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

  8. Docker上运行dotnet core

    下载microsoft/dotnet镜像 运行命令: docker pull microsoft/dotnet 如果没有使用阿里镜像加速的,参照这篇先配置好再跑上面命令: http://www.cnb ...

  9. [python] defaultdict

    import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaul ...

  10. jquery中append跟prepend的用法

    jquery中append和prepend的用法 append   是插入到元素中,并放到元素内的最后面prepend  是插入到元素中,并放到元素内的最前面例$("body"). ...