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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 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子句中,或选择列表所包含的子查询中,并且对其进行聚合的列是外部引用(就像上面最后一个例子那样)。


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


目录
相关文章
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
334 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
253 5
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
886 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
417 0
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
121 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。

热门文章

最新文章