问题:数据库查询语句,如何只返回一部分数据?

Top子句

  TOP 子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。

  在SQL Server数据库中语法为:
    SELECT TOP number|percent column_name(s) FROM table_name

  但是并非所有的数据库系统都支持 TOP 子句,比如Oracle和MySQL,它们有等价的语法。

  在Oracle数据库中语法为:
    SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

  在MySQL数据库中语法为:
    SELECT column_name(s) FROM table_name LIMIT number

MySQL的Limit子句

  Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

  //初始记录行的偏移量是 0(而不是 1):
  mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15

  //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
  mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last

  //如果只给定一个参数,它表示返回最大的记录行数目。换句话说,LIMIT n 等价于 LIMIT 0,n:
  mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

Limit的效率高?

  常说的Limit的执行效率高,是对于一种特定条件下来说的:即数据库的数量很大,但是只需要查询一部分数据的情况。
  高效率的原理是:避免全表扫描,提高查询效率。

  比如:每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录。
  SELECT * FROM t_user WHERE email=?;
  上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低。
  SELECT * FROM t_user WHERE email=? LIMIT 1;
  加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。

Limit的效率低?

  在一种情况下,使用limit效率低,那就是:只使用limit来查询语句,并且偏移量特别大的情况

  做以下实验:
      语句1:
           select * from table limit 150000,1000;
  语句2:
           select * from table while id>=150000 limit 1000;
  语句1为0.2077秒;语句2为0.0063秒
  两条语句的时间比是:语句1/语句2=32.968
 
  比较以上的数据时,我们可以发现采用where...limit....性能基本稳定,受偏移量和行数的影响不大,而单纯采用limit的话,受偏移量的影响很大,当偏移量大到一定后性能开始大幅下降。不过在数据量不大的情况下,两者的区别不大。

  所以应当先使用where等查询语句,配合limit使用,效率才高

  ps:在sql语句中,limt关键字是最后才用到的。以下条件的出现顺序一般是:where->group by->having-order by->limit

附录:OFFSET

  为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
  经常用到在数据库中查询中间几条数据的需求
  比如下面的sql语句:
    ① selete * from testtable limit 2,1;
    ② selete * from testtable limit 2 offset 1;
  注意:
    1.数据库数据计算是从0开始的
    2.offset X是跳过X个数据,limit Y是选取Y个数据
    3.limit  X,Y  中X表示跳过X个数据,读取Y个数据
  这两个都是能完成需要,但是他们之间是有区别的:
    ①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
    ②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

原创文章,欢迎转载,转载请注明出处!

参考了以下链接:
[1]http://blog.csdn.net/tuenbotuenbo/article/details/7974909
[2]http://www.w3school.com.cn/sql/sql_top.asp
[3]http://www.server110.com/mysql/201310/2228.html
[4]http://www.cnblogs.com/yxnchinahlj/p/4096484.html

MySQL的Limit详解的更多相关文章

  1. MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  2. MySQL日志功能详解

    MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...

  3. MySQL数据库备份详解

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  4. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

  5. MySQL关闭过程详解和安全关闭MySQL的方法

    MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...

  6. 【转】Nginx+php-fpm+MySQL分离部署详解

    转:http://www.linuxidc.com/Linux/2015-07/120580.htm Nginx+php-fpm+MySQL分离部署详解 [日期:2015-07-26] 来源:Linu ...

  7. Linux centos7环境下安装MySQL的步骤详解

    Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...

  8. Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  9. Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

随机推荐

  1. Xapian索引-文档检索过程分析

    本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1  检索语法 面对不同的检索业务,我们会有多种检索 ...

  2. Cassandra事务与关系型数据库事务有何区别

    Cassandra不会使用回滚和锁机制来实现关系型数据的ACID事务,相比较于提供原子性,隔离性和持久化,Cassandra提供最终(可调节的)一致性,让用户决定为每个事务提供强一致性或者最终一致性. ...

  3. android 工具库

    https://github.com/xybCoder/AndroidCommon android工具类集合

  4. ECMAScript5.1的运算符、类型转换总结

    一.运算符优先级 从高到低 运算符 说明 () 圆括号 . [] new(带参数列表) 字段访问.数组索引.new(带参数列表) () new(无参数列表) 函数调用,无参数列表 ++(后置递增) - ...

  5. Python爬虫入门教程 24-100 微医挂号网医生数据抓取

    1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做 ...

  6. Android--MP3播放器MediaPlayer

    前言 Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发人员可以很方便在在应用中播放音频.视频.本篇博客主要讲解在Android平台下如何播放一个音 ...

  7. leetcode — validate-binary-search-tree

    import apple.laf.JRSUIUtils; /** * Source : https://oj.leetcode.com/problems/validate-binary-search- ...

  8. bash shell第一课

    自学shell,又被老师说教,上英语课不好好学习英语四级怎么过,哈哈,那也没有数据对我的吸引力大啊,为了爱与梦想!!! 回忆一下文件格式:   文件名的扩展名为 .sh 文件内容开头必为 #!bin/ ...

  9. python 操作RabbitMq详解

    一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信. ...

  10. 利用Sklearn实现加州房产价格预测,学习运用机器学习的整个流程(包含很多细节注解)

    Chapter1_housing_price_predict .caret, .dropup > .btn > .caret { border-top-color: #000 !impor ...