SQL 02 对group by子句的一些理解

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 )字段对应的数据完全一致,才被认为是同一组,并划分出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值