Msql数据管理5
聚合函数
聚合函数对一组值执行计算,并返回单个值,也被称为组函数。
就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。
聚合函数不能写在where的查询条件里面
min
查询 最小值
语法:
select min(字段) from 表
max
查询 最大值
语法:
select max(字段) from 表
查询成绩最高分的是多少分
select max(score) from sc;
查询成绩最低分的是多少分
select min(score) from sc;
查询学生的最大生日日期
select max(birthday) from student;
查询学生的最小生日日期
select min(birthday) from student;
sum
查询 该字段的 总数
select sum(字段) from 表
avg
查询 该字段的 平均数
select avg(字段) from 表
实战
查询sc表 成绩字段 的 总数是多少
select sum(score) from sc;
查询sc表 成绩字段的 平均分是多少
select avg(score) from sc;
查询 男生 的 成绩总分是 多少
select sum(s.score) from student a inner join sc s on a.sid = s.sid
where a.sex ='男';
查询 女生 的 成绩平均分是 多少
select avg(s.score) from student a inner join sc s on a.sid = s.sid
where a.sex ='女';
count
查询 数据 总条数
count(*) 是查询总共有多少条数据
count(字段) 是查询该字段 不为 null的 总共有多少条数据
select count(*) from 表
或者
select count(字段) from 表
实战
查询学生表 一共有多少学生
select count(*) from student;
查询成绩表 一共有多少条数据
select count(*) from sc;
查询成绩表 sid字段 一共有多少条数据
select count(sid) from sc;
DISTINCT
去重,查询数据时,相同的数据只展示 一条
语法:
select distinct 字段 from 表;
实战
去重查询学生表中的生日字段
select distinct birthday from student;
去重查询 sc 表中的 成绩
select distinct score from sc;
去重查询 sc 表中的 课程号
select distinct cid from sc;
union
UNION操作符用于合并两个或者多个select语句的结果集。
使用 UNION 关联的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条select语句中的列的顺序必须相同。
语法:
select 列名[1,2...] from 表 union select 列名[1,2...] from 表2
默认地,union操作符选取不同的值,即union是去了重的。如果允许重复的值,可以使用union all。
union all
同样是合并结果集,但是union all不会去重
语法:
select 列名[1,2...] from 表 union all select 列名[1,2...] from 表2
实战:
准备测试数据,新建两张订单表
use teach;
create table order_1
(
id int auto_increment
primary key,
order_id varchar(6) null comment '订单id',
create_time datetime null comment '创建时间',
mark varchar(10) null comment '其他字段'
)
comment '订单表1';
INSERT INTO teach.order_1 (order_id, create_time, mark) VALUES ('0001', '2020-05-15 16:35:45', null);
INSERT INTO teach.order_1 (order_id, create_time, mark) VALUES ('0002', '2020-06-04 16:36:03', null);
INSERT INTO teach.order_1 (order_id, create_time, mark) VALUES ('0005', '2020-07-15 16:36:26', null);
INSERT INTO teach.order_1 (order_id, create_time, mark) VALUES ('0006', '2020-07-20 16:36:29', null);
INSERT INTO teach.order_1 (order_id, create_time, mark) VALUES ('0007', '2020-07-01 16:36:29', null);
create table order_2
(
id int auto_increment
primary key,
order_id varchar(6) null comment '订单id',
create_time datetime null comment '创建时间',
mark varchar(10) null comment '其他字段'
)
comment '订单表2';
INSERT INTO teach.order_2 (order_id, create_time, mark) VALUES ('0001', '2020-05-16 16:35:45', null);
INSERT INTO teach.order_2 (order_id, create_time, mark) VALUES ('0002', '2020-06-04 16:36:03', null);
INSERT INTO teach.order_2 (order_id, create_time, mark) VALUES ('0003', '2020-07-15 16:36:26', null);
INSERT INTO teach.order_2 (order_id, create_time, mark) VALUES ('0004', '2020-07-20 16:36:29', null);
查询两张订单表中的orderid,不允许重复
select order_id
from order_1
union
select order_id
from order_2;
查询两张订单表中的所有orderid
select order_id
from order_1
union all
select order_id
from order_2;
查询两张订单表中的orderid,create_time不允许重复
select order_id, create_time
from order_1
union
select order_id, create_time
from order_2;
查询两张订单表中所有的orderid,create_time
select order_id, create_time
from order_1
union all
select order_id, create_time
from order_2;
order by
将查询结果 按照某个字段或多个字段 进行升序或者降序 排列
语法:
select 字段1,字段2... from 表 order by 字段1,字段2... asc/desc;
asc: 代表升序排列,从小到大
desc : 代表降序排列,从大到小
默认是升序排列,asc可以不写
实战:
查询student表,按照生日降序排列
select * from student
order by birthday desc ;
查询student表,按照生日升序排列
select * from student
where birthday is not null
order by birthday ;
查询student表,按照生日降序,学号升序 排列
select * from student
order by birthday desc ,sid asc;
查询student表,年纪最小的前五名
select * from student
order by birthday desc
limit 5;
group by
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上可以使用聚合函数查询。
语法:
SELECT 字段, 聚合函数(字段) FROM 表 WHERE 条件 GROUP BY 字段;
实战
查询每个学生成绩最高的分数是多少?
解析: 每个学生的分数,就是按照学生分组,然后统计每个学生考试科目的最高分
select a.sid,a.sname,max(s.score) from student a inner join sc s on a.sid = s.sid group by a.sid;
查询每门课程参与考试的人数
select cid,count(*) from sc where cid is not null group by cid;
查询每个学生考试成绩的最低分
select a.sid,a.sname,min(s.score) from student a inner join sc s on a.sid = s.sid group by a.sid;
查询每个学生考试成绩的平均分
select a.sid,a.sname,avg(s.score) from student a inner join sc s on a.sid = s.sid group by a.sid;
查询各科目成绩最好的分数是多少,展示科目和成绩
select c.cname,max(s.score) from sc s inner join course c on s.cid = c.cid group by s.cid;