排序查询语法
语法
select * from 表名 order by 列1 asc|desc [, 列2 asc|desc,...]
语法说明
示例
1、查询未删除的男生,按学号降序
select * from students where is_del = 0 and gender = "男" order by id desc;
2、查询所有信息,先按照年龄从大到小排序,当年龄相同时,按照身高从高到低排序
select * from students order by age desc, height desc;
分页查询
介绍
数据特别多,一页显示不完,一页一页的进行显示,就是分页查询
语法
select * from 表名 limlit start,count
说明
- limit是分页查询关键字
- start表示开始行索引,默认是0
- count表示查询条数
1、查询前3行的男生信息
limit后第一个参数是开始行索引,可以不指定默认为0,第二个参数是查询条数
select * from students where gender="男" limit 0,3;
select * from students where gender="男" limit 3;
2、查询学生表,获取第n页数据的sql语句
select * from students limit (n-1) * m, m;
聚合函数
介绍
聚合函数又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by)来使用,用于统计和计算分组数据
常用的聚合函数
- 1、count(col):表示求指定列的总行数
- 2、max(col):表示求指定列的最大值
- 3、min(col):表示求指定列的最小值
- 4、sum(col):表示求指定列的和
- 5、avg(col):表示求指定列的平均值
求总行数
1、查询学生的个数
select count(*) from students;
注意:聚合函数不会对空值进行统计
2、查询男生编号最大值
select max(id) from students where gender="男";
3、查询男生编号最小值
select min(id) from students where gender="男";
4、查询男生总身高
select sum(height) from students where gender="男";
5、查询平均年龄
5.1 聚合函数不统计null值,统计有误
select avg(age) from students;
5.2 包含身高是null的(如果是空值,按照“0“进行统计)
select avg(ifnull(age, 0)) from students;
特点
聚合函数默认忽略字段为null的记录,要想列值为null的记录也参与计算,必须使用ifnull函数对null值做替换
分组查询
介绍
分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组
语法
GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP]
参数说明
- 列名:指按照指定字段的值进行分组
- HAVING 条件表达式:用来过滤分组后的数据
- WITH ROLLUP:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果
group by的使用
group by可用于单个字段分组,也可用于多个字段分组
示例
查询性别的种类
select gender from students group by gender;
注意:如果指定了分组字段,那么查询的时候只能使用指定分组字段
select name, gender from students group by name ,gender;
group by + group_concat()的使用
group_concat(字段名):统计每个分组指定字段的信息集合,每个信息之间使用逗号进行分隔
示例
根据gender字段进行分组,查询每个分组的姓名信息
select gender, group_concat(name) from students group by gender;
统计不同性别的平均年龄
select gender,avg(age) from students group by gender;
统计不同性别的人的个数
select gender,count(*) from students group by gender;
根据gender字段进行分组,统计分组条数大于4的
select gender,count() from students group by gender having count() > 4;
group by + with rollup的使用
with rollup的作用是:在最后记录后面新增一行,显示select查询时聚合函数的统计和计算结果
示例
根据gender字段进行分组,汇总总人数
select gender,count(*) from students group by gender with rollup;
根据gender字段进行分组,汇总所有人的年龄
select gender, group_concat(age) from students group by gender with rollup;
连接查询
介绍
连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成
分类
- 1、内连接查询
- 2、左连接查询
- 3、右连接查询
- 4、自连接查询
准备工作
1、准备班级表,插入数据
create table classes(id int unsigned not null primary key auto_increment, name varchar(20) not null);
insert into classes(name) values("python"), ("go");
2、学生表添加班级字段c_id(班级id)
alter table students add c_id int unsigned;
3、分配班级(不全分配,留一些空值)
update students set c_id = 2 where id in(1, 3, 5, 6);
update students set c_id = 1 where id in(2, 8);
内连接查询
查询两个表中符合条件的共有记录
语法
select 字段 from 表1 inner join 表2 on 表1,字段1 = 表2,字段2
说明
- inner join 就是内连接查询关键字
- on就是连接查询条件
示例
使用内连接查询学生表和班级表
select s.name, c.name from students s inner join classes c on s.c_id = c.id;
左连接查询
以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用null值填充
语法
select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2
说明
- left join 就是左连接查询关键字
- on就是连接查询条件
- 表1是左表
- 表2是右表
示例
使用左连接查询学生表和班级表
select * from students s left join classes c on s.c_id = c.id;
右连接查询
以右表为主根据条件查询左表数据,如果根据条件查询左表数据不存在使用null值填充
语法
select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2
- right join 就是左连接查询关键字
- on就是连接查询条件
- 表1是左表
- 表2是右表
示例
使用右连接查询学生表和班级表
select * from students s right join classes c on s.c_id = c.id;
自连接
左表和右表是同一张表,根据连接查询条件查询两个表中的数据
示例
select * from areas c inner join areas p on c.pid = p.id;
子查询
在一个select语句中,嵌入了另外一个select语句,那么被嵌入的select语句称之为子查询语句,外部那个select语句则成为主查询
主查询和子查询关系
- 子查询是嵌入到主查询中
- 子查询是辅助主查询的,要么充当条件,要么充当数据源
- 子查询是可以独立存在的语句,是一条完整的select语句
示例
查询大于平均年龄的
select * from students where age > (select avg(age) from students);
查询有班级的
select * from classes where id in (select c_id from students where c_id is not null);
查找年龄最大,身高最高的,班级id是2的
select * from students where age = (select max(age) from students) and height = (select max(height) from students) and c_id = 2;
简写
select * from students where (age, height, c_id) = (select max(age), max(height), 2 from students);