引言

在本篇博客简单介绍一下分页查询以及聚合查询简单操作。

分页查询

在MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT子句可以被用于指定 SELECT 语句返回的记录数。需注意以下几点:

1、第一个参数指定第一个返回记录行的偏移量

2、第二个参数指定返回记录行的最大数目

3、如果只给定一个参数:它表示返回最大的记录行数目

4、第二个参数为 -1 表示检索从某一个偏移量到记录集的结束所有的记录行

5、初始记录行的偏移量是0(而不是 1)

下面是一个应用实例:

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、比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍;
2、比较第2条语句和第3条语句:速度相差几十毫秒;
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 计算某一列的最小值

1、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_jjdgroup by JJDW;

2、max和min函数—统计列中的最大最小值

select max(salary) from salary_tab;
select min(salary) from salary_tab;

3、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值做转换。

参考

https://m.w3cschool.cn/mysql/mysql-xilz2oy6.html

MySQL 数据库 分页查询/聚合查询相关推荐

  1. MySQL 数据库约束、聚合查询、多表查询

    一.数据库约束 约束就是数据库在使用的时候,对于里面能够存的数据提出的要求和限制,程序猿就可以借助约束来完成更好的校验 1.约束类型 ① NULL约束 NOT NULL - 指示某列不能存储 NULL ...

  2. Mysql数据库分页查询及优化

    最近遇到个数据库分页查询问题,mysql数据库分页查询默认是升序查询,就是第一页查询的是最先插入的数据,最后一页才是最新插入的数据,弄了个小的数据库表单,记录下我的操作过程,还有优化查询速度的方法. ...

  3. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  4. 基于SpringDataJpa的mysql动态分页多表查询

    基于SpringDataJpa的mysql动态分页多表查询 由于这篇文章预计篇幅会很长,关于Spring Data JPA的知识就简短的分享,更多的请自行度娘,JPA 封装了很多查询的接口,但今天要讲 ...

  5. kettle 查询数据库写入文件_怎么连接数据库-详解如何用kettle连接mysql数据库并导出sql查询结果...

    概述 今天主要介绍下kettle怎么去连接mysql数据库及导出sql查询结果. 1.数据库链接驱动 如果没有安装对应的数据库驱动,在数据库连接的过程中,可能会报某个数据库连接找不到的异常,因此需要下 ...

  6. python查询mysql数据库_python针对mysql数据库的连接、查询、更新、删除操作示例...

    本文实例讲述了python针对mysql数据库的连接.查询.更新.删除操作.分享给大家供大家参考,具体如下: 连接 一 代码 import pymysql # 打开数据库连接 db = pymysql ...

  7. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  8. mysql数据库中查询第几条到第几条数据_在 mysql 数据库中,从查询结果的第四条记录开始选取5条记录,下面 sql 语句正确的是( )...

    [单选题]同一种货物,在同一线路上或平行线路上作相对方向的运送,而与对方运程的全部或一部分发生重迭交错的运输被称为( ). [多选题]水闸一般由()三部分组成 [单选题]在一个常规的统计表内,非必需包 ...

  9. mysql数据库的xml模糊查询

    mysql数据库的xml模糊查询 mybatis框架的xml中<= , >=解析会出现问题,编译报错,所以需要转译 正常的是使用%xxxx% ,现在需要使用 concat('%',#{xx ...

  10. 使用mysql数据库时出现汉字查询条件时无法查出对应数据

    使用mysql数据库时出现汉字查询条件时无法查出对应数据 原因: 在mysql数据库中编码默认不是utf-8,而后端一般使用utf-8的编码进行查询,所以编码不同无法查询到对应的数据 解决方法: 1. ...

最新文章

  1. 好多Javascript日期选择器呀-4
  2. SAP Business One 产品功能综述
  3. 苹果7支持快充吗_支持苹果20W+华为22.5W快充,倍思发布迷你数显快充移动电源...
  4. 【LeetCode】回文数
  5. 《Python程序设计》在亚马逊京东当当互动出版网淘宝全面上架
  6. 过滤关键字防止XSS攻击
  7. golang协程池设计
  8. Ubuntu解决包依赖关系
  9. 第九届河南理工大学算法程序设计大赛 正式赛(部分题解)
  10. 全球卡巴斯基升级服务器列表
  11. 3dmax2018卸载/安装失败/如何彻底卸载清除干净3dmax2018注册表和文件的方法
  12. 贪心算法——皇后游戏(洛谷P2123)
  13. 借《鱿鱼游戏》带动Q3财报走出水逆,奈飞的王者回归并非意外
  14. 软考高级 真题 2015年下半年 信息系统项目管理师 综合知识
  15. unity实现图片轮播效果_Unity 制作图片轮播功能
  16. 部分软件安装界面出现乱码(奇形怪状的问号等)/文件打开异常/文件无法正常打开
  17. 前缀和与差分——最大加权矩形
  18. Bonobo.Git.Server 401 Error
  19. 国内电子计算机最牛的三所大学,我国理工类大学排名:为大家讲解我国最牛的三所理工类大学...
  20. JMeter接口测试文档

热门文章

  1. 数据不够,Waymo用GAN来凑:生成逼真相机图像,在仿真环境中训练无人车模型...
  2. 脑机接口创造“第六感”:激活特定神经元,大鼠训练出新感官,逃出水迷宫,像用视觉一样轻松...
  3. 不好好学习会被AI开除的!俄罗斯校园将启用AI,识别差生,建议开除
  4. 从音乐分享平台到泛音乐视频社交平台,菠萝 BOLO完成过亿元 B 轮融资
  5. 给批量用户设磁盘配额
  6. 海思全力部署智能城市NB-IoT应用
  7. windows下常查看端口占用方法总结
  8. iphone 使用popViewController如何避免内存泄露
  9. 华为H3C ER3100由器限速方法合集
  10. AB(apache benchmark)压力测试