数据库优化 学习笔记

一、分组查找



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、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;
  • 看结果发现,原来 group_concat(name, age) 显示出来的就是一个拼接的字符串,所以输出结果也可以拼接的稍稍美观一点
-- 查询同种性别中的姓名 和 年龄
	select gender as 性别,group_concat(' 姓名:',name,' 年龄:',age) from students group by gender;



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)





二、排序



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;



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;





三、分页



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;



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;
  • 可以得到一个制作页面的 “公式” limit (第N页-1)*每页显示的个数,每页显示的个数
-- 如查看第三页, 每页显示的个数 2
	select * from students limit 6,2;
	
	-- 注意, 不能写成下面这样, mysql 不回给你计算式子
	select * from students limit (3-1)*2, 2;
  • 注意: 分页只能写在 sql 语句最后
select gender from students limit 0,2 group by gender;				-- 报错
	select gender from students group by gender limit 0,2;				-- ok