sqlserver数据库学习感悟(1)----关于group by

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: sqlserver数据库学习感悟(1)----关于group by

以下含编写过程,如果嫌啰嗦,最后有总结哒!


例题:有heat表和eatables两张表,分别为:


eatables



heat:protein(蛋白质),fat(脂肪),sugar(含糖量),kj(热量)



平均热量最高的食物是哪一类:


当我们这样写时:


select type,avg(kj)
from heat,eatables
group by type

结果为:



这个结果计算的是所有食物的平均热量,没有将两张表联系起来

select avg(kj) from heat

所以改进为:


select avg(kj)
from heat,eatables
group by type
having heat.id=eatables.id

这样写也是不对的,会报:


HAVING 子句中的列 'heat.id’无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。


所以having中的列名,必须包含在group by中


如果我们将heat.id和eatables.id放到group by中


select avg(kj),type
from heat,eatables
group by type,heat.id,eatables.id
having heat.id=eatables.id

就相当于按照每个食品的id分,即相当于没有分,得到结果为:



所以最后应该写为:where .....group by


select avg(kj),type
from eatables,heat
where eatables.id=heat.id
group by type

结果为:



平均热量最高的食物:


select top 1 type, avg(kj) 平均热量
from eatables,heat
where eatables.id=heat.id
group by type
order by avg(kj) desc

最后结果得:



再来看一个例子:

检索每个食品类别中,蛋白质含量最高的食物:


select type,name,max(protein)
  from heat,eatables
  where heat.id=eatables.id
  group by type

这样写是错误的:选择列表中的列 'eatables.name’无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。


接下来就是处理name的问题了:


同理,如果将name写入group by,得到的结果是每个食品的蛋白质含量



select name
from heat,eatables
where heat.id=eatables.id
and protein = max(protein) 
group by type

这样写也是错的:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。


就算把protein移动到group by也是报错


select name
from heat,eatables
where heat.id=eatables.id 
group by type
having protein = max(protein)

错误1:name不在聚合函数或group by中


错误2:protein不在聚合函数或group by中


如果我们将name或者protein加入group by则会出现所有食品,一切都是徒劳!


所以正确的写法应为


select name,a.type,max
from(select type,max(protein) max 
from eatables,heat
where heat.id = eatables.id
group by type)p,eatables as a,heat as b
where b.protein=p.max and a.id=b.id

新建一个表,包含type和其最高蛋白质含量,最后加入name


所以总结下来:


错误:HAVING 子句中的列 'heat.id’无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。


解决措施:select 和group by中的列名应该出现在group by中,如果有其他列名可以写在where中,实在不行,考虑在查询中再建立一个表进行查询


错误:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。


解决措施:where中不能sum(),avg(),max(),min()等聚合函数,但是聚合函数可以位于having子句中,或选择列表所包含的子查询中,并且对其进行聚合的列是外部引用(就像上面最后一个例子那样)。


刚学数据库,不要向我这样犯低级错误啦,最后最后如果这篇文章对你有帮助,能给我个赞吗!!


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
7天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
19 11
|
25天前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
32 3
|
14天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
29 0
|
17天前
|
SQL 存储 调度
|
17天前
|
SQL 安全 数据库
|
17天前
|
SQL 存储 监控
|
18天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
84 0
|
24天前
|
SQL 存储 关系型数据库
如何系统地学习数据库?
如何系统地学习数据库?【8月更文挑战第25天】
29 0
|
3天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
45 11
|
22天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~