SQL系列文章目录
前言
SQL 02 对group by的一些理解.
一、背景
来源:力扣
链接:https://leetcode-cn.com/problems/department-top-three-salaries/
表: 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
三、解题
1.按部门分组
我想按部门分组,查看一下,输入如下代码:
select deparmentId
from employee
group by deparmentId
得到结果:
发现确实是分组成功了,那我想要显示表格所有内容呢?
2.按部门分组,显示所有表头
select *
from employee
group by deparmentId
发现效果不如意,他意思就是说,如果要显示所有表头,那么,相关的表头要包含在group by子句内。
那么我们来尝试一下:
select *
from employee
select id,name ,salary ,deparmentId
from employee
group by deparmentId,id,name ,salary
如此,结果跟没分组一样
2.按部门分组,只显示几个列
select salary ,deparmentId
from employee
group by deparmentId,salary
发现没有,少了一列,我们观察原表,少的那一列是薪水85000,和部门id是1的那列,说明分组有效,确实分了,因为那两行数据(85000,1)完全一致。
如果将那行的数据改为(85000,2)呢?
这里使用插入新行去验证:
insert into employee values (8 ,'J' ,85000, 2)
发现了吧,原来group by语句,写了几个 字段,就依据几个字段去分组。以这里为例,除非(deparmentId,salary )字段完全一致,才被认为是同一组。
总结
如此,我便可以认为,group by分组并不能将所有表头展示出来,对单独某个特征分组,倒是没有问题。
原来group by语句,写了几个 字段,就依据几个字段去分组。以这里为例,除非(deparmentId,salary )字段对应的数据完全一致,才被认为是同一组,并划分出来。