当前位置:   article > 正文

MySQL 分组 、排序 & 分页_分组后分页还需要排序吗

分组后分页还需要排序吗

数据库优化 学习笔记

一、分组查找


1.1、group by

  • 语法: select ...(显示的字段) from 表名 group by ...(用来进行分组的字段);
  • 注意: 显示的字段,和用来进行分组的字段一般是相同的;若是不同(如 name),则当组内不止一条记录时,只会显示第一条记录的数据(只显示组内第一条记录的 name)
	select name from students group by gender; 							-- 只显示组内第一条数据的 name
	select gender from students group by gender;
	select gender, high from user group by usergroupid, high;			-- 性别和身高都相同的形成一组
	
	-- 计算男生和女生中的人数
	select count(*) from students group by gender;
	select gender as 性别,count(*) from students group by gender;

	-- 男女同学最大年龄
	select gender as 性别,max(age) from students group by gender;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.2、group_concat() 查看组内成员的属性

  • 语法: select 字段名 , group_concat(字段1, [字段2...]) from 表名 group by 字段名
	-- 查询同种性别中的姓名
	select gender as 性别,group_concat(name) from students group by gender;
	
	-- 查询同种性别中的姓名 和 年龄
	select gender as 性别,group_concat(name,age) from students group by gender;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 看结果发现,原来 group_concat(name, age) 显示出来的就是一个拼接的字符串,所以输出结果也可以拼接的稍稍美观一点
	-- 查询同种性别中的姓名 和 年龄
	select gender as 性别,group_concat(' 姓名:',name,' 年龄:',age) from students group by gender;
  • 1
  • 2

1.3、having 分组之后的筛选

	-- 查询总记录数大于 2 的组
	select gender,count(*) from students group by gender having count(*)>2;
	
	-- 查询总记录数大于 2 的组及其成员
	select gender,count(*),group_concat(name) from students group by gender having count(*)>2;
	
	-- 查询组内成员平均年龄超过18岁的组,及其成员
	select gender,group_concat(name),avg(age) from students group by gender having avg(age)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8



二、排序


2.1、order by 字段

  • asc: 从小到大排列,即升序,默认
  • desc: 从大到小排序,即降序
	-- 查询年龄在18到26岁之间的男同学,按照年龄从小到到排序
	select * from students where (age between 18 and 26) and gender=1;
	select * from students where (age between 18 and 26) and gender=1 order by age;
	select * from students where (age between 18 and 26) and gender=1 order by age asc;

	-- 查询年龄在18到26岁之间的女同学,身高从高到矮排序
	select * from students where (age between 18 and 26) and gender=2 order by id desc;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2、order by 多个字段

  • order by 字段1, 字段2
  • 先按照第一字段排序,排完后再按照第二字段排序
	-- 查询年龄在18到28岁之间的男性,年龄从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序
	select * from students where (age between 18 and 28) and gender=1 order by age desc,hiht asc;
  • 1
  • 2



三、分页


3.1、limit 限制查询出来的数据个数

  • 语法: select * from 表名 limit start,count
  • start: 每页的起始的位置(从0开始)
  • count: 每页显示的记录个数
	-- 若不指定 start , 则默认是 0
	select * from students limit 2;

	-- 查询前5个数据
	select * from students limit 5;

	-- 查询id 6-10(包含)的数据
	select * from students limit 5,5;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.2、制作分页

	-- 每页显示2个,第1个页面
	select * from students limit 0,2;

	-- 每页显示2个,第2个页面
	select * from students limit 2,2;

	-- 每页显示2个,第3个页面
	select * from students limit 4,2;

	-- 每页显示2个,第4个页面
	select * from students limit 6,2;   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 可以得到一个制作页面的 “公式” limit (第N页-1)*每页显示的个数,每页显示的个数
	-- 如查看第三页, 每页显示的个数 2
	select * from students limit 6,2;
	
	-- 注意, 不能写成下面这样, mysql 不回给你计算式子
	select * from students limit (3-1)*2, 2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 注意: 分页只能写在 sql 语句最后
	select gender from students limit 0,2 group by gender;				-- 报错
	select gender from students group by gender limit 0,2;				-- ok
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49362?site
推荐阅读
相关标签
  

闽ICP备14008679号