本文共 3514 字,大约阅读时间需要 11 分钟。
--limit 的使用
select 。。。。[LIMIT offerset_start,row_count]其中offerset_start 表上记录的起
limit rowstart,rowcount 类似与分页查询,rowstart是从第几行开始,rowcount是包括此后几行,
在一些情况中,当你使用LIMIT row_count而不使用HAVING时,MySQL将以不同方式处理查询。 始偏移量,默认为0,只需记录数据行就可以了。row_count为显示的行数。 ---显示第一行。 mysql> select * from emp order by birdate desc limit 1; +-------+----------+------------+--------+ | eid | ename | birdate | deptno | +-------+----------+------------+--------+ | 10001 | zhangsan | 1988-09-27 | 1001 | +-------+----------+------------+--------+ 1 row in set (0.00 sec) ---显示前两行。 mysql> select * from emp order by birdate desc limit 2; +-------+----------+------------+--------+ | eid | ename | birdate | deptno | +-------+----------+------------+--------+ | 10001 | zhangsan | 1988-09-27 | 1001 | | 10003 | lily | 1988-09-17 | 1003 | +-------+----------+------------+--------+ 2 rows in set (0.00 sec) --显示从第一行开始以后(不包括第一行)的三行数据。 注意limit显示的时候不包括offerset_start那一行。如下面的offerset_start=1 则不包括第一行。 mysql> select * from emp order by birdate desc limit 1,3; +-------+--------+------------+--------+ | eid | ename | birdate | deptno | +-------+--------+------------+--------+ | 10003 | lily | 1988-09-17 | 1003 | | 10002 | yangql | 1987-12-30 | 1003 | +-------+--------+------------+--------+ 2 rows in set (0.02 sec) --显示从第三行记录开始,以后的三行,如果没有足够的数据,则显示offerset_start以后的所有记录。 mysql> select * from emp order by birdate desc limit 2,3; +-------+--------+------------+--------+ | eid | ename | birdate | deptno | +-------+--------+------------+--------+ | 10002 | yangql | 1987-12-30 | 1003 | +-------+--------+------------+--------+ 1 row in set (0.00 sec)mysql> select * from emp order by birdate desc limit 1,1;
+-------+-------+------------+--------+ | eid | ename | birdate | deptno | +-------+-------+------------+--------+ | 10003 | lily | 1988-09-17 | 1003 | +-------+-------+------------+--------+ 1 row in set (0.00 sec)mysql> select * from emp order by birdate desc limit 1,2;
+-------+--------+------------+--------+ | eid | ename | birdate | deptno | +-------+--------+------------+--------+ | 10003 | lily | 1988-09-17 | 1003 | | 10002 | yangql | 1987-12-30 | 1003 | +-------+--------+------------+--------+ 2 rows in set (0.00 sec)mysql> select * from emp order by birdate desc limit 0,1;
+-------+----------+------------+--------+ | eid | ename | birdate | deptno | +-------+----------+------------+--------+ | 10001 | zhangsan | 1988-09-27 | 1001 | +-------+----------+------------+--------+ 1 row in set (0.00 sec)mysql> select * from emp order by birdate desc limit 0,3;
+-------+----------+------------+--------+ | eid | ename | birdate | deptno | +-------+----------+------------+--------+ | 10001 | zhangsan | 1988-09-27 | 1001 | | 10003 | lily | 1988-09-17 | 1003 | | 10002 | yangql | 1987-12-30 | 1003 | +-------+----------+------------+--------+ 3 rows in set (0.00 sec) MySQL如何优化LIMIT·如果你用LIMIT只选择一些行,当MySQL选择做完整的表扫描时,它将在一些情况下使用索引。 ·如果你使用LIMIT row_count与ORDER BY,MySQL一旦找到了排序结果的第一个row_count行,将结束排序而不是排序整个表。如果使用索引,将很快。如果必须进行文件排序(filesort),必须选择所有匹配查询没有LIMIT子句的行,并且在确定已经找到第1个row_count行前,必须对它们的大部分进行排序。在任何一种情况下,一旦找到了行,则不需要再排序结果的其它部分,并且MySQL不再进行排序。 ·当结合LIMIT row_count和DISTINCT时,MySQL一旦找到row_count个唯一的行,它将停止。 ·在一些情况下,GROUP BY能通过顺序读取键(或在键上做排序)来解决,然后计算摘要直到关键字的值改变。在这种情况下,LIMIT row_count将不计算任何不必要的GROUP BY值。 ·只要MySQL已经发送了需要的行数到客户,它将放弃查询,除非你正使用SQL_CALC_FOUND_ROWS。 ·LIMIT 0将总是快速返回一个空集合。这对检查查询的有效性是有用的。当使用MySQL API时,它也可以用来得到结果列的列类型。 (该技巧在MySQL Monitor中不工作,只显示Empty set;应使用SHOW COLUMNS或DESCRIBE)。 · 当服务器使用临时表来进行查询时,使用LIMIT row_count子句来计算需要多少空间。
转载地址:http://iobcl.baihongyu.com/