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小时内删除。
发表评论