50个查询系列-第二个查询
-2、查询平均成绩大于60分的同学的学号和平均成绩;
Select StuId,Avg(Score) as AvgScore From tblScore
Group By StuId
Having Avg(Score)>60
我们扩展一下:查询平均成绩大于60分的同学的学号和平均成绩和学生的名字:
SELECT tblstudent.StuName,t1.* FROM tblstudent, (Select tblscore.StuId,Avg(tblscore.Score) avgScore From tblScore Group by tblScore.StuId having avgscore>60) T1-- 这里查出来的就是学生的平均成绩,并把查出来的结果集当做一张表T1来处理。WHERE t1.stuid=tblstudent.StuId
我们来学习一下什么是Group By 这个语法。其实就是聚合函数。
看到一个很好的博客,讲的很具体,如下:
----------------------------------------------------------------------------------------------------------------------------------------------
可以这样去理解group by和聚合函数(转http://www.cnblogs.com/wuguanglei/p/4229938.html?utm_source=tuicool)
写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是*,而是某一个列或者某个列的聚合函数,group by 多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,大牛们直接略过吧。
=========正文开始===========
先来看下表1,表名为test:
表1
执行如下SQL语句:
1
2
|
SELECT name FROM test
GROUP BY name
|
你应该很容易知道运行的结果,没错,就是下表2:
表2
可是为了能够更好的理解“group by”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。下面说说如何来思考上面SQL语句执行情况:
1.FROM test:该句执行后,应该结果和表1一样,就是原来的表。
2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。
3.接下来就要针对虚拟表3执行Select语句了:
(1)如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了。
(2)我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。
(3)那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。
(4)例如我们执行select name,sum(number) from test group by name,那么sum就对虚拟表3的number列的每个单元格进行sum操作,例如对name为aa的那一行的number列执行sum操作,即2+3,返回5,最后执行结果如下:
(5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图
(6)接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:
结束!
50个查询系列-第二个查询相关推荐
- 【SQL查询系列】子查询经典案例
文章目录 前言 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary 2. 查询平均工资最低的部门信息 3. 查询平均工资最低的部门信息和该部门的平均工资 4. 查询平 ...
- 深入理解脚本化CSS系列第二篇——查询计算样式
前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade)层叠的含义.访问第一篇中的style属性只能获取行间样式,这通常来说,并不是我们想要的结果.本文将详细介绍 ...
- 数据库之 MySQL—— 50个查询系列
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一个项目涉及到的50个Sql语句 问题及描述: --1.学生表 Student(Sid,Sname,Sa ...
- Hive查询系列之初相识
Hive查询系列之初相识 1 基本查询(select--from) 1.1 全表和特定列查询 0)数据准备 (0)原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1 ...
- 【SqlServer系列】子查询
1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlServer ...
- 最常见的 SQL 查询错误 - 第二章节
第二章节:非 SARGable 查询条件 像大多数编程人员一样,数据库开发人员或多或少倾向于编写直接翻译给定请求的代码.大多数编程语言(包括 SQL)被设计为更易于人们阅读,这也导致了一个问题.为什么 ...
- mysql 获取倒数第二_MySQL查询倒数第二条记录实现方法
有时候会用到查询倒数第二条记录复制代码 代码如下:last=HolderChangeHistory.find_by_sql ([" SELECT * FROM h ...
- iPhone系列设备媒体查询:
这就引出一个问题,我们在对iPhone设备适配时候,又多出几种情况.iPhone系列设备媒体查询: @media only screen and (min-device-width: 320px){/ ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
原文:学习ASP.NET Core Razor 编程系列九--增加查询功能 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.N ...
最新文章
- jmeter实现多并发
- pyinstaller 打包成exe
- 在AFN中使用NSXMLParser解析服务器返回的XML数据
- 适合 Kubernetes 初学者的一些实战练习 (三)
- JAVA格式化当前日期或者取年月日
- C++中输入一组数字 以换行符结束输入
- 课程目标 线程 java 1615387415
- 爬虫爬评书吧_python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书
- C# log4net纯代码设置参数
- CSS 字体风格 font-style属性
- linux界面唤醒,Linux计算机实现自动唤醒和关闭的方法步骤详解
- 运动目标跟踪(十三)--SRDCF/DeepSRDCF
- Android TextView 跑马灯滚动效果
- 索佳电子水准数据传输软件_安徽铜陵磁致伸缩式静力水准仪公司
- java 编写metro风格_纯Javascript实现Windows 8 Metro风格实现
- 15_Elasticsearch 内部原理详细解析(下篇)
- 几万条数据的excel导入到mysql_excel十几万行数据快速导入数据库研究(转,下面那个方法看看还是可以的)...
- File xxx specified for property 'resourceFile' does not exist.解决方法
- 计算机组成原理中阶符是什么,计算机组成原理习手册.doc
- Windows10 如何设置自定义开机音乐
热门文章
- 提高电路板EMC能力PCB设计和布线方法
- 第十六届智能车竞赛浙江赛区比赛胜利结束
- 2021年春季学期-信号与系统-第十五次作业参考答案-第二小题参考答案
- 使用WinSCP在WIndows与树莓派之间传递文件
- 第十五届全国大学生智能车全国总决赛获奖信息-华北赛区
- 如何实现MARKDOWN网页内跳转?
- QN8027性能调试
- pointcloud 转ptr_ROS学习笔记(三)sensor_msgs::LaserScan转pcl::PointCloud
- java 反射 慢在那里_Java 反射到底慢在哪?
- vue 定位所在地_vue系列教程之微商城项目|商品购买