SQL group by 及 having 浅析
group by 子句
用来将结果进行分组,gruop by中提到的列(属性),其重复值会压缩为一组,对其可以使用聚集函数,在select子句中,出现的列只能是group by中的列,其余只能使用聚集函数。
聚集函数
SQL中的聚集函数一共有5个,分别为:
min(column...) # 求最小值
max(column...) # 求最大值
sum(column...) # 求和
count(column...) # 求列数
avg(column...) # 求平均值
having 子句
where用来对from子句选择的表经行过滤,having子句用来对聚集函数的结果进行过滤。
例子
# 测试
create database having_clause;
create table having_clause ( name varchar(20) not null, last_name varchar (20) not null, subject varchar(20) not null, result integer not null, primary key (name,last_name, subject));
insert into having_clause values ('Tom', 'Johnson', 'CyberSeurity' , 70);
insert into having_clause values ('Tom', 'Johnson', 'Data Base' , 85);
insert into having_clause values ('Tom', 'Johnson', 'System Intellectual' , 90);
insert into having_clause values ('Tom', 'Johnson', 'System' , 65);
insert into having_clause values ('Tom', 'Devis', 'CyberSeurity' , 69);
insert into having_clause values ('Tom', 'Devis', 'Data Base' , 50);
insert into having_clause values ('Tom', 'Devis', 'System Intellectual' , 80);
insert into having_clause values ('Tom', 'Devis', 'System' , 77);
insert into having_clause values ('Alice', 'Smit', 'Data Base' , 72);
insert into having_clause values ('Alice', 'Smit', 'System Intellectual' , 78);
insert into having_clause values ('Alice', 'Smit', 'System' , 80);
insert into having_clause values ('Bob', 'Jonnio', 'Data Base' , 90);
insert into having_clause values ('Bob', 'Jonnio', 'System Intellectual' , 83);
insert into having_clause values ('Bob', 'Jonnio', 'System' , 67);
group by 子句例子
- 根据名称合并为组,显示成绩的总和
select name, last_name, sum(result)
# name 和 last_name 在 group by 的列的集合中,这个地方选出是用于显示
from having_clause
group by name,last_name;
- 根据名称合并为组,显示成绩的最大值
select name, max(result)
# name 在 group by 的列的集合中,这个地方选出是用于显示,只显示name的列,因为
# 有重复的名称,因此结果中也有重复的名称
from having_clause
group by name,last_name;
- 根据科目合并为组,显示成绩的最大值
select subject, max(result)
# subject 在group by的列的集合中,并且呈现到结果中
from having_clause
group by subject;
having 子句例子
可以对聚集函数使用别名,然后使用having语句过滤结果。
select name, last_name, sum(result) as result_total
# name 和 last_name 在 group by 的列的集合中,这个地方选出是用于显示
from having_clause
group by name,last_name
having result_total >270;