mysql 查询语句select-limit 使⽤详解
limit ⼦句是⼀个选择语句块的最后⼀个⼦句,它选取了⾏的⼀个⼦集,来限定中间结果的输出⾏数。limit ⼦句表⽰了最前⾯和最后⾯被提取的⾏数。    通常情况下,Limit 关键字可以接受⼀个或者两个数字参数。需要注意的是,这个参数必须是⼀个整数常量。如果⽤户给定两个参数,则第⼀个参数表⽰第⼀个返回记录⾏的偏移量,第⼆个参数则表⽰返回记录⾏的最⼤数据。另外需要提醒的是,初始记录⾏的偏移量是0,⽽不是1。
虽然使⽤了Limit 语句来限制返回的记录数,从⽽可以提⾼应⽤程序的⼯作效率。但是其也会给系统的性能带来⼀些负⾯影响。如可能会导致全表扫描等等。如果数据库管理员决定使⽤Limit ⼦句来指定需要显⽰的记录数,那么最好能够最⼤限度的使⽤索引,以避免全表扫描,提⾼⼯作效率。
LIMIT ⼦句可以被⽤于强制 SELECT 语句返回指定的记录数。LIMIT 接受⼀个或两个数字参数。参数必须是⼀个整数常量。如果给定两个参数,第⼀个参数指定第⼀个返回记录⾏的偏移量,第⼆个参数指定返回记录⾏的最⼤数⽬。初始记录⾏的偏移量是 0(⽽不是 1): 为了与 PostgreSQL 兼容,MySQL 也⽀持句法: LIMIT # OFFSET #。
3.1 创建表
注:测试表为球员信息。
3.2 插⼊测试数据
4.1 实例1
获取前四个最⼤球员的号码和名字。
[sql]
01. SELECT  * FROM  table  LIMIT [offset,] rows  | rows  OFFSET offset  [sql]
01. CREATE    TABLE  PLAYERS  02.        (PLAYERNO      INTEGER      NOT  NULL ,  03.          NAME            CHAR (15)    NOT  NULL ,  04.          INITIALS      CHAR (3)      NOT  NULL ,  05.          BIRTH_DATE    DATE                  ,  06.          SEX            CHAR (1)      NOT  NULL ,  07.          JOINED        SMALLINT      NOT  NULL ,  08.          STREET        VARCHAR (30)  NOT  NULL ,  09.          HOUSENO        CHAR (4)              ,  10.          POSTCODE      CHAR (6)              ,  11.          TOWN          VARCHAR (30)  NOT  NULL ,  12.          PHONENO        CHAR (13)            ,  13.          LEAGUENO      CHAR (4)              ,  14.          PRIMARY  KEY    (PLAYERNO)          );  [sql]
01.
INSERT  INTO  PLAYERS VALUES  (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411');  02.
INSERT  INTO  PLAYERS VALUES  (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467');  03.
INSERT  INTO  PLAYERS VALUES  (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL );  04.
INSERT  INTO  PLAYERS VALUES  (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983');  05.
INSERT  INTO  PLAYERS VALUES  (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513');  06.
INSERT  INTO  PLAYERS VALUES  (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL );  07.
INSERT  INTO  PLAYERS VALUES  (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL );  08.
INSERT  INTO  PLAYERS VALUES  (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124');  09.
INSERT  INTO  PLAYERS VALUES  (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409');  10.
java 线程INSERT  INTO  PLAYERS VALUES  (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608');  11.
INSERT  INTO  PLAYERS VALUES  (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL );  12.
INSERT  INTO  PLAYERS VALUES  (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524');  13.
INSERT  INTO  PLAYERS VALUES  (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060');  14. INSERT  INTO  PLAYERS VALUES  (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319');
4.2 实例2
python软件包在哪
获取加⼊球队最早的2
个球员的号码和名字。
注:112号球员和104号球员都是1984年加⼊⾜球俱乐部的,因为最终输出为两个球员,57号球员是1985年加⼊的,肯定会输出,对于年份重复的112和104号球员会随机选取⼀个。
4.3 实例3
获取加⼊球队最早的2
个球员的号码和名字,如果有年份重复的,只显⽰球员号最⼩的球员。
mysql语句分类
注:如果不指定重复年份加⼊俱乐部队员的选取规则的话,mysql 会按照默认规则选取,指定的话如playerno asc ,则按球员号从⼩到⼤选取。
limit编程语言scratch介绍
也可⽤在出现在⼦查询中的语句块块⼉中。
[sql]
01. select  playerno, name    02. from  players  03. order  by  playerno desc  04. limit 4;  [sql]
01. select  playerno, name    02. from  players  03. order  by  joined desc    04. limit 2;  [sql]
01. select  playerno, name    02. from  players  03. order  by  joined desc , playerno asc  04. limit 2;  [sql]
01. select  * from    02. (select  playerno, name    03. from  players  04. order  by  joined desc , playerno asc  05. limit 2) as  T  06. order  by  playerno desc ;
通常limit ⼦句⽤来选择列表头部或尾部,添加⼀个偏移量则可跳过⼏⾏。添加偏移量有两种⽅式,分别是LIMIT [offset,] rows 或LIMIT rows OFFSET offset ,推荐使⽤第⼆种,它更明确地表⽰了要显⽰的⾏数和偏移的⾏数。excel中dispimg是什么意思
或者
我们可以通过limit 指定我们需要输出的⾏,加上选项sql_calc_found_rows 的话,可以在后台统计出来总的⾏数,如我们只需要显⽰4⾏,并统计下总的⾏数,可通过select  found_rows()获得。
8.1 limit 0⼦句
根据Limit 关键字的定义,如果参数为0的话,则其返回的是空记录。在实际⼯作中,灵活使⽤这个0参数,能够给我们带来很⼤的收获。    如现在⼯程师想要确认⼀下某个查询语句的有效性,如果直接运⾏这个查询语句,需要等待其返回的记录。如果涉及的纪录数量⽐较多,或者运算逻辑⽐较复杂,那么需要等到⽐较长的时间。此时就可以在Select 查询语句中,使⽤Limit 0⼦句。只要查询语句没有语法上的错误,这就可以让数据库快速的返回⼀个空集合。从⽽帮助数据库设计⼈员迅速的判断查询语句的有效性。另外这个空集和中还会返回某个表的各个字段的字段名称。即通过这个Limit 0⼦句还可以查询某个表的表结构。[sql]
01. select  playerno, name    02. from  players  03. order  by  playerno asc  04.
limit 3, 4;  [sql]
01. select  playerno, name    02. from  players  03. order  by  playerno asc  04. limit 4 offset 3;  [sql]
01. mysql> select  sql_calc_found_rows playerno, name    02.    -> from  players  03.    -> order  by  playerno desc  04.    -> limit 4;  05. +----------+-----------+  06. | playerno | name      |  07. +----------+-----------+  08. |      112 | Bailey    |  09. |      104 | Moorman  |  10. |      100 | Parmenter |  11. |      95 | Miller    |  12. +----------+-----------+  13. mysql> select  found_rows();  14. +--------------+  15. | found_rows() |  16. +--------------+  17. |          14 |  18. +--------------+
可见灵活应⽤limit 0⼦句,确实能够给我们带来不⼩的收益。不过需要注意的是,在某些特定的场合下,这个⼦句可能不会奏效。如通常情况下,在Monitor ⼯作环境中不⽀持这个Limit 0⼦句。此时结果只会显⽰Empty Set
,⽽不是我们所需要的结果。
8.2 limit 与distinct
Distinct 关键字主要⽤来过滤重复的记录。⽽Limit 关键字则主要⽤来指定记录所返回的⾏数。如果这两个关键字共同使⽤时,如Limit 的参数为50,则数据库返回50条不重复的记录数。然后后续的查询就会停⽌。如果查询的记录中有重复记录,则数据库查询的实际数量往往要⽐Limit 关键字所指定的数量要多。
注:全部查询⾏数为14
注:查询⾏数为6 [sql]
01. mysql> select  joined from  players;          02. +--------+  03. | joined |  04. +--------+  05. |  1975 |  06. |  1977 |  07. |  1981 |  08. |  1980 |  09. |  1983 |  10. |  1983 |  11. |  1980 |  12. |  1980 |  13. |  1985 |  14. |  1982 |  15. |  1972 |  16. |  1979 |  17. |  1984 |  18. |  1984 |  19. +--------+
[sql]
01. mysql> select  joined from  players limit 6;          02. +--------+  03. | joined |  04. +--------+  05. |  1975 |  06. |  1977 |  07. |  1981 |  08. |  1980 |  09. |  1983 |  10. |  1983 |  11. +--------+
注:查询⾏数为9
8.3 limit 分页查询优化
MySQL 的limit 给分页带来了极⼤的⽅便,但数据量⼀⼤的时候,limit 的性能就急剧下降。
8.3.1 offset ⽐较⼩的时候,直接使⽤limit 。
8.3.2 offset ⽐较⼤的时候,使⽤⼦查询优化。
注:⾸先获取到offset 的id 然后直接使⽤limit size 来获取数据。
8.4 limit 与索引
telnet命令测试网络
如果数据库管理员决定使⽤Limit ⼦句来指定需要显⽰的记录数,那么最好能够最⼤限度的使⽤索引,以避免全表扫描,提⾼⼯作效率。即当数据库选择做完整的表扫描时,可以在某些情况下使⽤索引。
如现在数据库管理员决定将Limit ⼦句与Order BY ⼦句⼀起使⽤。数据库⼀旦到了排序结果的第⼀个RowCount ⾏,则系统将会结束排序,⽽并不会对整个表进⾏排序。如果单独使⽤Order By ⼦句的话,则会对整个表进⾏排序。虽然如此,但是排序必定要浪费⼀定的时间。此时数据库管理员如果决定使⽤索引,则可以在很⼤程度上提⾼这个查询的效率。
8.5 limit 与group by [sql]
01. mysql> select  distinct  joined from  players limit 6;  02. +--------+  03. | joined |  04. +--------+  05. |  1975 |  06. |  1977 |  07. |  1981 |  08. |  1980 |  09. |  1983 |  10. |  1985 |  11. +--------+
[sql]
01. select  name    02. from  players  03. order  by  playerno  04. limit 5, 6;  [sql]
01. select  name    02. from  players  03. where  playerno >=  04.    (select  playerno  05.      from  players  06.      order  by  playerno  07.      limit 5, 1)  08. limit 6;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。