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的输出的基础上(不含重复),做出筛选等工作。