过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))

目录

第八篇:排序和分页(order by,limit)

排序查询(order by)

单字段排序:略

多字段排序:

按别名排序

按函数排序:

where之后进行排序

​编辑

limit介绍

获取前n行记录

 获取前n行记录

获取最大的一条记录

获取排名第n到m的记录

分页查询

避免踩坑

limit中不能使用表达式

limit后面的两个数字不能为负数

 排序分页存在的坑

总结:

第九篇:分组查询(group by、having)

分组查询

聚合函数:

准备数据:

单字段分组

多字段分组

分组前筛选数据:

分组后筛选数据

 where和having的区别

分组后排序

where&group by &order by&limit一起协作

mysql分组中的坑:

示例:

总结:


第八篇:排序和分页(order by,limit)

本章内容
1. 详解排序查询
2. 详解 limit
3.
limit 存在的坑
4. 分页查询中的坑

排序查询(order by)

电商中:我们想查看今天所有成交的订单,按照交易额从⾼到低排序,此时我们可以使⽤
数据库中的排序功能来完成。
排序语法:
select 字段名 from 表名 order by 字段1【asc|desc】,字段2【asc|desc】;
需要排序的字段跟在order by之后;
asc|desc表示排序的规则,asc:升序,desc:降序,默认为asc;
支持多个字段进行排序,多字段排序之间用逗号隔开

单字段排序:略

多字段排序:

⽐如学⽣表, 先按学⽣年龄降序,年龄相同时,再按学号升序 ,如下:

按别名排序

select age ' 年龄 ',id as ' 学号 ' from stu order by 年龄 asc, 学号 desc;

按函数排序:

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第1张图片

 说明:

year 函数:属于⽇期函数,可以获取对应⽇期中的年份。
上⾯使⽤了 2 种⽅式排序,第⼀种是在 order by 中使⽤了函数,第⼆种是使⽤了
别名排序

where之后进行排序

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第2张图片
 

limit介绍

limit用来限制select查询返回的行数,常用于分页等操作

语法:

select 列 from 表 limit 【offset,】count;

说明:

offset :表⽰偏移量,通俗点讲就是跳过多少⾏, offset 可以省略,默认为 0 ,表
⽰跳过 0 ⾏;范围: [0,+∞)
count :跳过 offset ⾏之后开始取数据,取 count ⾏记录;范围: [0,+∞)
limit offset count 的值不能⽤表达式。
下⾯我们列⼀些常⽤的⽰例来加深理解。

获取前n行记录

select 列 from 表 limit 0,n;

或者

select 列 from 表 limit n;

示例:获取订单的前2条记录,如下:

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第3张图片

 获取前n行记录

select 列 from 表 limit 0,n;

或者

select 列 from 表 limit n;

获取最大的一条记录

我们需要获取订单⾦额最⼤的⼀条记录,可以这么做:先按照⾦额降序,然后取第⼀条记 录

获取排名第n到m的记录

我们需要先跳过n-1条记录,然后取m-n+1条记录,如下:

select 列 from 表 limit n-1,m-n+1;

分页查询

开发过程中,分页我们经常使⽤,分页⼀般有 2 个参数:
page :表⽰第⼏页,从 1 开始,范围 [1,+∞)
pageSize :每页显⽰多少条记录,范围 [1,+∞)
如: page = 2 pageSize = 10 ,表⽰获取第 2 10 条数据。
我们使⽤ limit 实现分页,语法如下:
select from 表名 limit (page - 1) * pageSize,pageSize;
需求:我们按照订单⾦额降序,每页显⽰ 2 条,依次获取所有订单数据、第 1 页、第 2 页、
3 页数据,如下:

避免踩坑

limit中不能使用表达式

mysql> select * from t_order where limit 1 , 4 + 1 ;
ERROR 1064 ( 42000 ): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'limit 1 , 4 + 1 ' at line 1
mysql> select * from t_order where limit 1 + 0 ;
ERROR 1064 ( 42000 ): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'limit 1 + 0 ' at line 1
mysql>
结论: limit 后⾯只能够跟明确的数字

limit后面的两个数字不能为负数

ERROR 1064 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'limit -1' at line 1
mysql> select * from t_order where limit 0,-1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'limit 0,-1' at line 1
mysql> select * from t_order where limit -1,-1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near 'limit -1,-1' at line 1

 排序分页存在的坑

上⾯有 2 个问题:
问题 1 :看⼀下第 2 sql 和第 3 sql ,分别是第 2 页和第 3 页的数据,结果出现了相同的数
据,是不是懵逼了。
问题 2 :整个表只有 8 条记录,怎么会出现第 5 页的数据呢,又懵逼了。
我们来分析⼀下上⾯的原因: 主要是 b 字段存在相同的值,当排序过程中存在相同的值
时,没有其他排序规则时, mysql 懵逼了,不知道怎么排序了。
就像我们上学站队⼀样,按照⾝⾼排序,那⾝⾼⼀样的时候如何排序呢?⾝⾼⼀样的就乱
排了。
建议:
建议:排序中存在相同的值时,需要再指定⼀个排序规则,通过这种排序规则不存在⼆义
性,⽐如上⾯可以再加上 a 降序

总结:

  • 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的值不能用表达式
  • 分页排序时,排序不要有⼆义性,⼆义性情况下可能会导致分页结果乱序,可以在后
    ⾯追加⼀个主键排序

第九篇:分组查询(group by、having)

本篇内容
1. 分组查询语法
2. 聚合函数
3. 单字段分组
4. 多字段分组
5. 分组前筛选数据
6. 分组后筛选数据
7. where having 的区别
8. 分组后排序
9.where & group by & having & order by & limit ⼀起协作
10. mysql 分组中的坑
11. in 多列查询的使⽤

分组查询

语法:
SELECT column, group_function, ... FROM table
[WHERE condition]
GROUP BY group_by_expression
[HAVING group_condition];
说明:
group_function :聚合函数。
group by expression :分组表达式,多个之间⽤逗号隔开。
group_condition :分组之后对数据进⾏过滤。
分组中, select 后⾯只能有两种类型的列:
1. 出现在 group by 后的列
2. 或者使⽤聚合函数的列
分组查询主要涉及到两个子句,分别是: group by having

聚合函数:

常见的聚合函数有哪些?

    1、求个数/记录数/项目数等:count()

例如: 统计员工个数?

select count( ) from Company --包括空值
select count(*) from Company --不包括空值

    2、求某一列平均数 :avg()

例如:求某个班平均成绩 ?求某个公司员工的平均工资?

select avg(score) from Scores ---平均成绩
select avg(salary) from Company --平均工资

注意:

若某行的score值为null时,计算平均值时会忽略带有null值得那一行。

如果想要把null当做0,那么可以使用IsNull函数把null转换成0,语法如下:

 avg(IsNull(score,0)) as ’Average Score‘

    3、求总和,总分等:sum() --必须为数字列

例如:求某个班的总成绩?求公司总薪资支出?

select sum(score) from Scores
select sum(salary) from Company

    4、求最大值,最高分,最高工资等:max()

例如:求班里最高分,公司员工最高工资?

select max(Score) from Scores
select max(salary) from Company

    5、求最小值,最低分,最低工资等:max()

例如:求班里最低分,公司员工最低工资?

select min(Score) from Scores
select min(salary) from Company

SQL中的聚合函数介绍

 
聚合函数怎么正确的使用?

    1、 select 语句的选择列表(子查询或外部查询);
    2、having 子句;
    3、compute 或 compute by 子句中等;

注意: 在实际应用中,聚合函数常和分组函数group by结合使用,用来查询.where 子句的作用对象一般只是行,用来作为过滤数据的条件。

SQL中的聚合函数介绍

 
其他聚合函数(aggregate function)

    6、 count_big()返回指定组中的项目数量。

    与count()函数区别:count_big()返回bigint值,而count()返回的是int值。

    数据类型详见:

    SQL Server 数据类型的详细介绍及应用实例1

    SQL Server 数据类型的详细介绍及应用实例2

    SQL Server 数据类型的详细介绍及应用实例3

例如:

select count_big(prd_no) from sales

    7、 grouping()产生一个附加的列。

    当用cube或rollup运算符添加行时,输出值为1;

    当所添加的行不是由cube或rollup产生时,输出值为0.

例如:

select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

    8、binary_checksum() 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。

例如:

select prd_no,binary_checksum(qty) from sales group by prd_no

    9、checksum_agg() 返回指定数据的校验值,空值被忽略。

例如:

select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no

    10、checksum() 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

    11、stdev()返回给定表达式中所有值的统计标准偏差。

例如:

select stdev(prd_no) from sales

    12、stdevp() 返回给定表达式中的所有值的填充统计标准偏差。

例如:

select stdevp(prd_no) from sales

    13、 var() 返回给定表达式中所有值的统计方差。

例如:

select var(prd_no) from sales

    14、 varp()返回给定表达式中所有值的填充的统计方差。

例如:

select varp(prd_no) from sales
————————————————
版权声明:本文为CSDN博主「剑云锋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40456829/article/details/83657396

  • group by
取得每个工作岗位的工资合计,要求显示岗位名称和工资合计
select job, sum(sal) from emp group by job;
如果使用了 order by order by 必须放到 group by 后面
select job, sum(sal) from emp group by job;
如果使用了 order by order by 必须放到 group by 后面
按照工作岗位和部门编码分组,取得的工资合计
select job,deptno,sum(sal) from emp group by job,deptno;
以上 SQL 语句在 Oracle 数据库中无法执行,执行报错。
以上 SQL 语句在 Mysql 数据库中可以执行,但是执行结果矛盾。
SQL 语句中若有 group by 语句,那么在 select 语句后面只能跟 分组函数 + 参与分组的字段
  • having
如果想对分组数据再进行过滤需要使用 having 子句
取得每个岗位的平均工资大于 2000
select job, avg(sal) from emp group by job having avg(sal) >2000;
过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第4张图片
分组函数的执行顺序:
根据条件查询数据

分组
采用 having 过滤,取得正确的数据

准备数据:

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第5张图片

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第6张图片

单字段分组

需求:查询每个用户下单数量,输出:用户id、下单数量,如下:

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第7张图片

多字段分组

需求: 查询每个⽤户每年下单数量,输出字段:⽤户 id 、年份、下单数量,如下:
过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第8张图片

分组前筛选数据:

分组前对数据进⾏筛选,使⽤ where 关键字(在group by之前)
需求: 需要查询 2018 年每个⽤户下单数量,输出:⽤户 id 、下单数量,如下:
过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第9张图片

分组后筛选数据

分组后对数据筛选,使⽤ having 关键字(在group by之后)
需求: 查询 2018 年订单数量⼤于 1 的⽤户,输出:⽤户 id ,下单数量,如下:
⽅式1 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第10张图片

方式2:

 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第11张图片

 where和having的区别

where是在分组(聚合)前对记录进行筛选,而having是在分组结束后的结果里筛选,最后返回整个sql的查询结果。

可以把 having 理解为两级查询,即含 having 的查询操作先获得不含 having ⼦句时的 sql 查询
结果表,然后在这个结果表上使⽤ having 条件筛选出符合的记录,最后返回这些记录,因
此, having 后是可以跟聚合函数的,并且这个聚集函数不必与 select 后⾯的聚集函数相

分组后排序

需求 :获取每个⽤户最⼤⾦额,然后按照最⼤⾦额倒序,输出:⽤户 id ,最⼤⾦额,如
下: 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第12张图片

where&group by &order by&limit一起协作

where group by having order by limit 这些关键字⼀起使⽤时,先后顺序有明确的限
制,语法如下:
select from
表名
where [ 查询条件 ]
group by [ 分组表达式 ]
having [ 分组过滤条件 ]
order by [ 排序条件 ]
limit [offset,] count;
注意:
写法上⾯必须按照上⾯的顺序来写。
⽰例:
需求: 查询出 2018 年,下单数量⼤于等于 2 的,按照下单数量降序排序,最后只输出第 1
条记录,显⽰:⽤户id,下单数量,如下: 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第13张图片

mysql分组中的坑:

本⽂开头有介绍,分组中 select 后⾯的列只能有 2 种:
1. 出现在 group by 后⾯的列
2. 使⽤聚合函数的列
oracle sqlserver db2 中也是按照这种规范来的。 ⽂中使⽤的是 5.7 版本,默认是按照这种规范来的。
mysql 早期的⼀些版本,没有上⾯这些要求, select 后⾯可以跟任何合法的列。

示例:

需求:获取每个⽤户下单的最⼤⾦额及下单的年份,输出:⽤户 id ,最⼤⾦额,年份,写
法如下: 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第14张图片

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第15张图片 看⼀下上⾯的数据,第⼀条88.88的年份是2017年,我们再来看⼀下原始数据:过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第16张图片

对⽐⼀下,userid=1001price=88.88是第3条数据,即theyear2018年,但是上⾯的分

组结果是 2017 年,结果和我们预期的不⼀致,此时 mysql 对这种未按照规范来的列,乱序
了, mysql 取的是第⼀条。
正确的写法,提供两种,如下: 过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第17张图片

过一遍mysql(5)(第八篇:排序和分页(order by,limit);第九篇:分组查询(group by、having))_第18张图片

上⾯第 1 种写法,⽐较少见, in 中使⽤了多字段查询。
建议:在写分组查询的时候,最好按照标准的规范来写, select 后⾯出现的列必须在
group by 中或者必须使⽤聚合函数

总结:

1.在写分组查询的时候,最好按照标准的规范来写,select后⾯出现的列必须在group

by 中或者必须使⽤聚合函数
2. 在写分组查询的时候,最好按照标准的规范来写, select 后⾯出现的列必须在 group
by 中或者必须使⽤聚合函数
3.in 多列查询的使⽤,下去可以试试

你可能感兴趣的:(mysql,排序算法,算法)