MySQL LIMIT子句

语法:

SELECT   select_expr [, select_expr ...] 
   FROM  table_name 
   [WHERE where_condition] 
   [GROUP BY {col_name | expr} [ASC | DESC], ... [WITH ROLLUP]]
  [HAVING where_condition]
  [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
  [LIMIT {[offset,] row_count | row_count OFFSET offset}]

MySQL特有的子句。它是SELECT语句中的最后一个子句(在order by后面)。它用来表示从结果集中选取最前面或最后面的几行。偏移量offset的最小值为0。
语法:limit  <获取的行数> [OFFSET <跳过的行数>]
或者  limit [<跳过的行数>,] <获取的行数>  

例: 得到编号最大的前4个球员的编号和名字

root@TENNIS 16:07  mysql>SELECT  playerno, name
    ->   FROM  PLAYERS
    ->   ORDER BY  playerno DESC
    ->   LIMIT  4;
+----------+-----------+
| playerno | name      |
+----------+-----------+
|      100 | Parmenter |
|       95 | Miller    |
|       83 | Hope      |
|       44 | Baker     |
+----------+-----------+
4 rows in set (0.00 sec)

行先按照球员编号进行降序排序,然后使用limit从中挑出最前面的4行。如果没有order by子句,返回的4行就是不可预料的。

当有几个相等的值在最前面时,返回什么?
例: 得到最优秀的前3个球员的编号。赢得比赛数目最多的球员是最优秀的

root@TENNIS 16:09  mysql>SELECT  playerno ,count(*) AS number
    ->   FROM  MATCHES
    ->   WHERE  won > lost
    ->   GROUP BY  playerno
    ->   ORDER BY  number DESC
    ->   LIMIT  3;
+----------+--------+
| playerno | number |
+----------+--------+
|        6 |      2 |
|       44 |      1 |
|       57 |      1 |
+----------+--------+
3 rows in set (0.00 sec)

语句中没有指明当出现相等值时应该怎么办,因此mysql随机返回57和44球员。

例: 得到最优秀的前3个球员的编号

root@TENNIS 16:15  mysql>SELECT playerno ,count(*) AS number
    ->   FROM MATCHES
    ->   WHERE won > lost
    ->   GROUP BY playerno
    ->   ORDER BY number DESC, playerno DESC
    ->   LIMIT 3;
+----------+--------+
| playerno | number |
+----------+--------+
|        6 |      2 |
|      104 |      1 |
|       57 |      1 |
+----------+--------+
3 rows in set (0.01 sec)

如果球员具有相同的获胜次数,那么只显示编号最大的球员。

带偏移量的limit

用来跳过前面的几行后再取
例:得到球员编号最低的5个球员的编号和名字,从第4个球员开始

root@TENNIS 16:10  mysql>SELECT playerno,  name
    ->   FROM PLAYERS
    ->   ORDER BY playerno ASC
    ->   LIMIT  3, 5;  -- 或者limit 5 offset 3;
+----------+-----------+
| playerno | name      |
+----------+-----------+
|        8 | Newcastle |
|       39 | Bishop    |
|       44 | Baker     |
|       83 | Hope      |
|       95 | Miller    |
+----------+-----------+
5 rows in set (0.00 sec)

练习

1. 4个最低的罚款额的平均值是多少?

root@TENNIS 16:12  mysql>SELECT avg(amount)
    ->   FROM (SELECT amount
    ->           FROM PENALTIES
    ->       ORDER BY amount
    ->          LIMIT 4 ) a;
+-------------+
| avg(amount) |
+-------------+
|   32.500000 |
+-------------+
1 row in set (0.00 sec)

子查询得到最低的4个罚款额。外查询对其求平均值

2. 第3高的罚款额是多少?

root@TENNIS 16:13  mysql>SELECT min(amount)
    ->   FROM (SELECT  DISTINCT  amount
    ->           FROM PENALTIES
    ->       ORDER BY amount DESC
    ->        LIMIT 3 ) a;
+-------------+
| min(amount) |
+-------------+
|       50.00 |
+-------------+
1 row in set (0.00 sec)

root@TENNIS 16:15  mysql>SELECT  DISTINCT  amount           FROM PENALTIES       ORDER BY amount DESC        LIMIT 2,1;
+--------+
| amount |
+--------+
|  50.00 |
+--------+
1 row in set (0.00 sec)

子查询得到最高的3个罚款额。外查询从中选一个最小的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩未零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值