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

news2024/11/27 21:59:02

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

例题:有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子句中,或选择列表所包含的子查询中,并且对其进行聚合的列是外部引用(就像上面最后一个例子那样)。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构演变过程

单体架构 分布式架构:业务拆分 微服务 分布式架构的一种。独立开发和部署,一个业务多个服务支持 特点: 单一职责:拆分粒度更小,一个服务一个业务,避免重复开发(面向对象角度来说符合最少知道原…

软考A计划-系统架构师-学习笔记-第五弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Swift——如何将某一进制的数字按另一种进制输出(比如十进制输出打印成十六进制,八进制打印输出成二进制)

最近由于需要阅读比较老的文档,老文档里内存地址是用八进制而不是十六进制,所以需要写一个小工具,用来转换进制进制。虽然自带的计算器可以,但是数量一多比较麻烦。 一开始我想费劲吧啦写十二个转换函数,虽然有些函数可…

chatgpt赋能python:Python字符串:如何定义一个空字符串

Python字符串:如何定义一个空字符串 在Python中,字符串是一种常见的数据类型,通常用于存储文本信息。定义一个空字符串在Python中非常简单,本文将介绍如何定义一个空字符串以及在Python中使用字符串的一些常见操作。 定义一个空…

基于Java+SpringBoot+Vue前后端分离摄影分享网站平台系统

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

python课程设计:实现一个飞行训练成绩管理微信息系统,对飞行员的某门飞行课目成绩进行质量评定

一、编程题目 在日常飞行训练中,飞行训练成绩是 飞行员进行综合等级评定的重要依据。 假设飞行训练团在某次飞行训练结束后,要对飞行员的某门飞行课目成绩进行质量评定。 请编程实现一个飞行训练成绩管理系统。要求完成以下功能: 1录入成绩 2计算平均分 3计算最高分 4查…

零入门kubernetes网络实战-35->vxlan简介以及原理介绍(vxlan报文结构介绍)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章开始介绍vxlan虚拟设备。 主要介绍vxlan的协议报文结构, 1、总结 主要涉及到以下方面: overlay跟vxlan的关系如何理解v…

Excel电子表格的PHP类库:PHP_XLSXWriter(大数据量报表、后台运行、浏览器下载)

Excel电子表格的PHP类库:PHP_XLSXWriter 一、PHP_XLSXWriter与PHPExcel的区别二、PHP_XLSXWriter的使用1.使用步骤2.后台下载3.浏览器下载4.封装函数 PHP_XLSXWriter 是一个用于生成 Microsoft Excel 2007 xlsx 文件的 PHP 库。XLSX 是一种用基于 XML 的开放式文件标…

chatgpt赋能python:Python多行缩进——提高代码可读性和效率的关键

Python多行缩进——提高代码可读性和效率的关键 众所周知,Python是一种缩进敏感的编程语言,它鼓励程序员使用缩进来表示代码块,而非传统的大括号或关键字。在Python中,缩进通过使用空格或制表符来实现,而且空格和制表…

深度剖析整形数据在内存中的存储

📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。 c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。 本章来学习数据的存储。 让我们开启c语言学…

Linux命令(31)之watch

Linux命令之watch 1.watch介绍 linux命令watch是周期性的用来执行某命令,并把某命令执行结果输出到屏幕上。使用watch命令,可以周期性的监测并输出某命令的执行结果到屏幕上,省得手动一遍一遍运行某命令,提高工作效率。 2.watc…

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 php://filter 一、访问数据流二、过滤数据流三、多…

[第一章 web入门]SQL注入-2

拿到题目后看提示,要自主访问两个页面 访问login.php后,是一个登录界面,直接测试注入类型 第一件事还是输入常用账户名admin,密码随便输入 回显账号或者密码错误 这种登录界面一般都是字符型注入,所以测试一下闭合符&a…

【力扣刷题 | 第七天】

前言: 今天我们将会进入栈与队列的刷题篇章,二者都是经典的数据结构,熟练的掌握栈与队列实现可以巧妙的解决有些问题。 232. 用栈实现队列 - 力扣(LeetCode) 请你仅使用两个栈实现先入先出队列。队列应当支持一般队…

野火Renesas R4M2 UDS诊断bootloader 升级MCU

基于can总线的UDS软件升级 最近学习UDS诊断协议(ISO14229),是一项国际标准,为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求,并没有设计通信机制。ISO14229仅对应用层和会话层做出了…

从零开始Vue项目中使用MapboxGL开发三维地图教程(一)MapboxGL介绍以及前期vue项目的搭建

MapboxGL介绍以及前期vue项目的搭建 1、Mapbox-gl简介2、搭建vue项目2.1、创建vue项目2.2、注册mapbox官网2.3、mapbox-gl入门案例 3、Mapbox-gl地图主要配置参数说明 1、Mapbox-gl简介 Mapbox-gl是一个开源、基于webgl技术的前端地图类库。 地图数据渲染和可视化这块我们经常用…

chatgpt赋能python:如何培训Python?-从入门到专业化

如何培训Python?- 从入门到专业化 Python是一种高级编程语言,已被广泛应用于各种领域以及各种应用程序的开发中。如果你也想成为一名Python开发人员,有以下几种培训方法帮助你一步步实现你的目标。 1.自学Python 学习Python的最简单方法是…

【前端 - CSS】第 13 课 - CSS 应用案例 - 体育新闻

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 最近学习完了 CSS 的 引入方式、选择器 和 字体修饰属性 的相关知识点,然后运…

redis(一),redis简介,Linux下安装及基本配置

一.redis简介: 1.什么是redis Redis 是完全开源的,遵守BSD协议,是一个高性能的 key-value 数据库。它属于NoSQL数据库。 2.NoSQL简介: NoSQL有两种说法,一般指的是非关系型数据库,另一种说法是说它是“…

xml parser - etree

import xml.etree.ElementTree as ET# https://docs.python.org/3/library/xml.etree.elementtree.html # https://zhuanlan.zhihu.com/p/502584681def main():tree ET.parse(./country_data.xml)# 获取根元素root tree.getroot()print("{} {}".format(type(root),…