引言
在本篇博客简单介绍一下分页查询以及聚合查询简单操做。html
分页查询
在MySQL中,分页查询通常都是使用limit子句实现,limit子句声明以下:mysql
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT子句能够被用于指定 SELECT 语句返回的记录数。需注意如下几点:web
一、第一个参数指定第一个返回记录行的偏移量sql
二、第二个参数指定返回记录行的最大数目数据库
三、若是只给定一个参数:它表示返回最大的记录行数目并发
四、第二个参数为 -1 表示检索从某一个偏移量到记录集的结束全部的记录行分布式
五、初始记录行的偏移量是0(而不是 1)svg
下面是一个应用实例:函数
select * from orders where type=8 limit 1000,10;
该条语句将会从表 orders 中查询第1000条数据以后的10条数据,也就是第1001条到第1010条数据。高并发
数据表中的记录默认使用主键(通常为id)排序,上面的结果至关于:
select * from orders where type=8 order by id limit 10000,10;
使用子查询优化
这种方式先定位偏移位置的 id,而后日后查询,这种方式适用于 id 递增的状况。
select * from orders where type=8 limit 100000,1;
select id from orders where type=8 limit 100000,1;
select * from orders where type=8 and
id>=(select id from orders where type=8 limit 100000,1)
limit 100;
select * from orders where type=8 limit 100000,100;
针对上面的查询须要注意:
一、比较第1条语句和第2条语句:使用 select id 代替 select * 速度增长了3倍;
二、比较第2条语句和第3条语句:速度相差几十毫秒;
三、比较第3条语句和第4条语句:得益于 select id 速度增长,第3条语句查询速度增长了3倍,这种方式相较于原始通常的查询方法,将会增快数倍。
使用 id 限定优化
这种方式假设数据表的id是连续递增的,则咱们根据查询的页数和查询的记录数能够算出查询的id的范围,可使用 id between and 来查询:
select * from orders where type=2
and id between 1000000 and 1000100 limit 100;
还能够有另一种写法:
select * from orders where id >= 1000001 limit 100;
固然还可使用 in 的方式来进行查询,这种方式常常用在多表关联的时候进行查询,使用其余表查询的id集合,来进行查询:
select * from orders where id in
(select order_id from trade_2 where goods = 'pen')
limit 100;
这种 in 查询的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit。
关于数据表的id说明
通常状况下,在数据库中创建表的时候,每一张表强制添加 id 递增字段,这样更方便咱们查询数据。
若是数据量很大,好比像订单这类,通常会推荐进行分库分表。这个时候 id 就不建议做为惟一标识了,而应该使用分布式的高并发惟一 id 生成器来生成,并在数据表中使用另外的字段来存储这个惟一标识。
首先使用范围查询定位 id (或者索引),而后再使用索引进行定位数据,即先 select id,而后在 select *;这样查询的速度将会提高好几倍。
聚合查询
也就是组函数,在一个行的集合(一组行)上进行操做,对每一个组给一个结果。
经常使用的组函数:
函数
说明
COUNT
统计行的数量
SUM
计算某一列的合计值,该列必须为数值类型
AVG
计算某一列的平均值,该列必须为数值类型
MAX
计算某一列的最大值
MIN
计算某一列的最小值
一、count函数
count(*):返回表中知足where条件的行的数量
select count(*) from salary_tab where salary='1000';
select count(*) from salary_tab; #没有条件,默认统计表数据行数
count(列):返回列值非空的行的数量
select count(salary) from salary_tab;
count(distinct 列):返回列值非空的、而且列值不重复的行的数量
select count(distinct salary) from salary_tab;
count(expr):根据表达式统计数据
select UNIT as '单位',
COUNT(TO_DAYS(DATE)=TO_DAYS(NOW()) or null) as '今日统计',
COUNT(YEAR(DATE)=YEAR(NOW()) or null) as '今年统计'
from v_jjd
group by JJDW;
二、max和min函数—统计列中的最大最小值
select max(salary) from salary_tab;
select min(salary) from salary_tab;
三、sum和avg函数—求和与求平均
select sum(salary) from salary_tab;
select avg(salary) from salary_tab;
select avg(ifnull(salary,0)) from salary_tab;
注意:要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值作转换。
参考