0
点赞
收藏
分享

微信扫一扫

SQL 03 对having by 子句和count聚集函数的一些理解

月白色的大狒 2022-05-01 阅读 41

SQL系列文章目录

文章目录

前言

SQL 03 对having by 子句和count聚集函数的一些理解.

一、背景

表: Employee
Id是该表的主键列。
departmentId是Department表中ID的外键。
该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。
在这里插入图片描述
表:department
Id是该表的主键列。
该表的每一行表示部门ID和部门名。
在这里插入图片描述

二、创建“背景”的代码

create database test1;
create table department(
	id int not null,
	name varchar(15) not null,
	primary key(id)
);
create table employee(
	id int not null,
	name varchar(15) not null,
	salary int not null,
	deparmentId int not null,
	primary key(id),
	foreign key(deparmentId) references department(id)
);

insert into department values( 1 ,'IT'),( 2 ,'Sales')

insert into employee values (1  ,'Joe'  ,85000, 1),
							(2,'Henry',80000,2),
							(3 , 'Sam' ,60000  ,2 ),
							(4  ,'Max' ,90000  ,1 ),
							(5 , 'Janet' , 69000 , 1 ),
							(6 , 'Randy' , 85000 ,1  ),
							(7 ,' Will' , 70000 , 1   )
--查询表是否建立正确
select *
from department

select *
from employee


三、解题

我们知道,having by子句一般是与group by子句成套使用,用作条件的一个判断的,那么我们因而也会用到一些聚集函数,比如count,max,min,avg等等。

这里先用sql语句查看一下聚集函数是怎么样操作的!

聚集函数count()

select salary ,deparmentId,count(deparmentId) as nu
from employee
group by deparmentId,salary 
--having count(salary)>=3

我们统计部门相同的有几个,使用count(deparmentId)代码。先看不使用count的结果吧:
在这里插入图片描述
我们发现部门id相同的有,(id,num)–>(1,4)–>(2,3)这样。但实际上真的是嘛?
其实不是的,我们来看看下面这张图:
在这里插入图片描述
根据部门id去统计,发现部门相同的只有第5行数据的nu值是2,这是为什么呢?

原来这里select出来的语句,并不是说根据前面那张图输出的,而是以实际的表(下面这张表)为准。我们翻看所有表行:
在这里插入图片描述
艾,发现这里部门id为1的总共有5呢?但你不要忘了,我们可是group by对齐分组过的,分组之后,要将group by后面的所有字段作为一个新字段,他们相同,去计数,才能算是相同。

这里就是(deparmentId,salary)字段数据完全相同的一行,才在count(deparmentId)的时候,被认为是同一个部门。所以最后发现只有数据(85000,1)的nu值是2,其它都是1.

很好理解,group by子句对于同一组,它的输出会隐藏其它相同的行,而只保留一行,count出来的其实就是输出包含隐藏掉的那些数据,去做统计。

所以:

select salary ,deparmentId,count(deparmentId) as nu
from employee
group by deparmentId,salary 
having count(deparmentId)<=2

执行代码后,所有group by分组后的count数都是小于等于2的,所以这个输出结果等同于不使用having by子句。如下图:
在这里插入图片描述

having by

select salary ,deparmentId,count(deparmentId) as nu
from employee
group by deparmentId,salary 

select salary ,deparmentId,count(deparmentId) as nu
from employee
group by deparmentId,salary 
having salary>60001

可以看到,having by 进一步在group by的基础上(输出上,即不含重复的数据)做出筛选等工作。
在这里插入图片描述

总结

group by做分组,但是输出的只是不重复的数据。

count子句在group by的基础上(含重复的隐藏数据)做出统计。

而having by 进一步在group by的输出的基础上(不含重复),做出筛选等工作。

举报

相关推荐

0 条评论