美文网首页
排序和分页 (order by、limit)

排序和分页 (order by、limit)

作者: 爱折腾的傻小子 | 来源:发表于2020-11-06 14:45 被阅读0次
排序查询 order by
  • select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc];
    • 需要排序的字段跟在 order by 之后
    • asc|desc表示排序的规则,asc:升序,desc:降序,默认为asc;
    • 支持多个字段进行排序,多字段排序之间用逗号隔开
/*
mysql> select * from test2;
+------+----------+
| a | b |
+------+----------+
| 10 | jack |
| 8 | tom |
| 5 | ready |
| 100 | javacode |
+------+----------+
4 rows in set (0.00 sec)
*/
select * from test2 order by a asc;
/*
+------+----------+
| a | b |
+------+----------+
| 5 | ready |
| 8 | tom |
| 10 | jack |
| 100 | javacode |
+------+----------+
4 rows in set (0.00 sec)
*/
select * from test2 order by a desc;
/*
+------+----------+
| a | b |
+------+----------+
| 100 | javacode |
| 10 | jack |
| 8 | tom |
| 5 | ready |
+------+----------+
4 rows in set (0.00 sec)
*/
select * from test2 order by a;
/*
+------+----------+
| a | b |
+------+----------+
| 5 | ready |
| 8 | tom |
| 10 | jack |
| 100 | javacode |
+------+----------+
4 rows in set (0.00 sec)
*/
  • 多字段排序
/*
mysql> select * from stu;
+------+-----+---------------+
| id | age | name |
+------+-----+---------------+
| 1001 | 18 | 路人甲Java |
| 1003 | 18 | 张学友 |
| 1004 | 20 | 张国荣 |
| 1005 | 20 | 刘德华 |
| 1010 | 19 | 梁朝伟 |
+------+-----+---------------+
5 rows in set (0.00 sec)
*/
select * from stu order by age desc,id asc;
/*
+------+-----+---------------+
| id | age | name |
+------+-----+---------------+
| 1004 | 20 | 张国荣 |
| 1005 | 20 | 刘德华 |
| 1010 | 19 | 梁朝伟 |
| 1001 | 18 | 路人甲Java |
| 1003 | 18 | 张学友 |
+------+-----+---------------+
5 rows in set (0.00 sec)
*/
  • 按别名排序
/*
mysql> select * from stu;
+------+-----+---------------+
| id | age | name |
+------+-----+---------------+
| 1001 | 18 | 路人甲Java |
| 1003 | 18 | 张学友 |
| 1004 | 20 | 张国荣 |
| 1005 | 20 | 刘德华 |
| 1010 | 19 | 梁朝伟 |
+------+-----+---------------+
5 rows in set (0.00 sec)
*/
select age '年龄',id as '学号' from stu order by 年龄 asc,学号 desc;
/*
+--------+--------+
| 年龄 | 学号 |
+--------+--------+
| 18 | 1003 |
| 18 | 1001 |
| 19 | 1010 |
| 20 | 1005 |
| 20 | 1004 |
+--------+--------+
*/
  • 按函数排序
/*
mysql> SELECT * FROM student;
+------+------------+---------------+
| id | birth | name |
+------+------------+---------------+
| 1001 | 1990-10-10 | 路人甲Java |
| 1003 | 1960-08-16 | 张学友 |
| 1004 | 1968-07-01 | 张国荣 |
| 1005 | 1960-03-01 | 刘德华 |
| 1010 | 1962-05-16 | 梁朝伟 |
+------+------------+---------------+
5 rows in set (0.00 sec)
*/
SELECT id 编号,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY year(birth) asc,id asc;
/*
+--------+--------------+--------------+---------------+
| 编号 | 出生日期 | 出生年份 | 姓名 |
+--------+--------------+--------------+---------------+
| 1003 | 1960-08-16 | 1960 | 张学友 |
| 1005 | 1960-03-01 | 1960 | 刘德华 |
| 1010 | 1962-05-16 | 1962 | 梁朝伟 |
| 1004 | 1968-07-01 | 1968 | 张国荣 |
| 1001 | 1990-10-10 | 1990 | 路人甲Java |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)
*/
SELECT id 编号,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY 出生年份 asc,id asc;
/*
+--------+--------------+--------------+---------------+
| 编号 | 出生日期 | 出生年份 | 姓名 |
+--------+--------------+--------------+---------------+
| 1003 | 1960-08-16 | 1960 | 张学友 |
| 1005 | 1960-03-01 | 1960 | 刘德华 |
| 1010 | 1962-05-16 | 1962 | 梁朝伟 |
| 1004 | 1968-07-01 | 1968 | 张国荣 |
| 1001 | 1990-10-10 | 1990 | 路人甲Java |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)
*/
-- year函数:属于日期函数,可以获取对应日期中的年份
  • where 之后排序
/*
mysql> select * from t_order;
+----+--------+
| id | price |
+----+--------+
| 1 | 88.95 |
| 2 | 100.68 |
| 3 | 500.00 |
| 4 | 300.00 |
| 5 | 20.88 |
| 6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a where
a.price>=100 order by a.price desc;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 3 | 500.00 |
| 4 | 300.00 |
| 6 | 200.50 |
| 2 | 100.68 |
+--------------+--------------+
4 rows in set (0.00 sec)
*/

Limit
  • limit 用来限制select查询返回的行数,常用于分页等操作
  • select 列 from 表 limit [offset,] count;
    • offset:表示偏移量,通俗点讲就是跳过多少行,offset可以省略,默认为0,表示跳过0行;范围:[0,+∞)
    • count:跳过offset行之后开始取数据,取count行记录;范围:[0,+∞)。limit中offset和count的值不能用表达式
/*
mysql> select * from t_order;
+----+--------+
| id | price |
+----+--------+
| 1 | 88.95 |
| 2 | 100.68 |
| 3 | 500.00 |
| 4 | 300.00 |
| 5 | 20.88 |
| 6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a limit 2;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 1 | 88.95 |
| 2 | 100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a limit 0,2;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 1 | 88.95 |
| 2 | 100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)
*/
  • 获取最大一条记录
/*
mysql> select a.id 订单编号,a.price 订单⾦额 from t_order a order by
a.price desc;
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 3 | 500.00 |
| 4 | 300.00 |
| 6 | 200.50 |
| 2 | 100.68 |
| 1 | 88.95 |
| 5 | 20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 1;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 3 | 500.00 |
+--------------+--------------+
1 row in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 0,1;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 3 | 500.00 |
+--------------+--------------+
1 row in set (0.00 sec)
*/
  • 获取排名第n到m的记录
-- 我们需要先跳过n-1条记录,然后取m-n+1条记录
-- select 列 from 表 limit n-1,m-n+1;
select a.id 订单编号,a.price 订单金额 from t_order a order by
a.price desc;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 3 | 500.00 |
| 4 | 300.00 |
| 6 | 200.50 |
| 2 | 100.68 |
| 1 | 88.95 |
| 5 | 20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)
*/
select a.id 订单编号,a.price 订单金额 from t_order a order by
a.price desc limit 2,3;
/*
+--------------+--------------+
| 订单编号 | 订单金额 |
+--------------+--------------+
| 6 | 200.50 |
| 2 | 100.68 |
| 1 | 88.95 |
+--------------+--------------+
3 rows in set (0.00 sec)
*/
  • 分页查询
    • 开发过程中,分页我们经常使用,分页一般有2个参数
    • page:表示第几页,从1开始,范围[1,+∞)
    • pageSize:每页显示多少条记录,范围[1,+∞)
    • select 列 from 表名 limit (page - 1) * pageSize,pageSize;
避免踩坑
  • limit中不能使用表达式,limit后面只能够跟明确的数字
  • limit后面的两个数字不能为负数
  • 排序中存在相同的值时,需要再指定一个排序规则
总结
  • order by ... [asc|desc] 用于对查询结果排序,asc:升序,desc:降序,asc|desc可以省略,默认为asc
  • limit 用来限制查询结果返回的行数,有2个参数(offset,count),offset:表示跳过多少行,count:表示跳过offset行之后取count行
  • limit中offset可以省略,默认值为0
  • limit中offset 和 count都必须大于等于0
  • limit中offset和count的值不能用表达式
  • 分页排序时,排序不要有二义性,二义性情况下可能会导致分页结果乱序,可以在后面追加一个主键排序

相关文章

网友评论

      本文标题:排序和分页 (order by、limit)

      本文链接:https://www.haomeiwen.com/subject/gqnkvktx.html