数据库优化 学习笔记
一、分组查找
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