下面通过一个例子,来简单解释group by的原理。 1. GROUP BY 假设我们有表1,表名为test: 如果我们执行如下sql语句: SELECT name FROM test GROUP BY name 我们很容易可以
下面通过一个例子,来简单解释group by的原理。
假设我们有表1,表名为test:
如果我们执行如下sql语句:
SELECT name FROM test GROUP BY name
我们很容易可以得到运行的结果:
为了能够更好的理解“group by”多个列“和”聚合函数“的应用,这里可以在表1到表2的过程中,引入一个虚构的中间表:虚拟表3。
FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示:
生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。
接下来再针对虚拟表3执行Select语句:
如果执行select *
的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以,执行select *
语句是不允许的。
我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。
那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。
group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图
首先,不要错误的认为having必须和group by 配合使用。其实having可以单独使用
having关键字在我们的印象中,貌似和where关键字十分相似,那二者有什么区别呢?
select id , name from student having score >90;
这句话就是错误的。where和having,一个是起作用在结果返回前,用来过滤记录;一个是起作用在结果返回后,用来过滤结果。这种场景的典型应用如这句:
SELECT region,count(school) FROM T02_Bejing_school WHERE region IN ("海淀" , "西城" , "东城") GROUP BY region HAVING count(school) > 10;
该句sql可以筛选出北京西城、东城、海淀三个区中学校数量超过10所的区及各区学校数量。即先用where把这三个区的中学过滤出来,然后对结果集做group by,得到一张组合后的虚拟表,最后通过having对虚拟表做二次过滤。
select id , name from student having score >90;
select id , avg(price) as ag from goods group by category having ag > 1000
select id , avg(price) as ag from goods where ag group by category > 1000
select price , name from goods where price > 100
select price , name from goods having price > 100
--结束END--
本文标题: 理解sql中的group by和having
本文链接: https://lsjlt.com/news/5928.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0