sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名

2023-05-16

 前段时间面试的时候碰到这样一个面试题,因为很久没接触sql竟然没写出来。

如图有这样一张成绩表:

首先要理解group by 含义:“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

先来看这样一条sql语句:select  subject,max(score) from grade GROUP BY subject

结果是:

这样正确的得出了每一科的最高分以及科目的名称。那是不是再在后面加个name就可以得出对应的学生的名字呢?我们可以试试:select  subject,max(score),name from grade GROUP BY subject

一看有结果以为成功了,但是对比数据后发现是错的,学生姓名和分数没对应上。如果你认为是成功的是因为对group by理解的不够,我也不知道这样查询为什么能出来结果,我使用的mysql数据库,如果是oracle的话就会报错。

注意:因为在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。

所以这样是错误的。


group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中,常见的聚合函数如下表:

函数作用支持性
sum(列名)求和 
max(列名)最大值 
min(列名)最小值 
avg(列名)平均值 
first(列名)第一条记录仅Access支持
last(列名)最后一条记录仅Access支持
count(列名)统计记录数注意和count(*)的区别

我们还是分析要求,通过要求来写sql语句。

这里提供几种方法:

我们已经通过group by分组来获得每一科的最高分以及科目名称,把它作为第一句sql,,然后再查询一下score表,找到学科和分数都相同的记录:(子sql语句作为主sql语句的一部分)

#a.* 表示a表中所有的字段,b.*表示b表中所有的字段

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

结果如下:

对比发现数据是对的。

拓展问法:用一句SQL查出所有课程成绩最高和最低的学生及其分数。

首先,通过分组获得每个学科的最高分以及最低分:

select  subject,max(score),MIN(score) from grade GROUP BY subject

结果如下:

那我们如何把最高分对应的学生名字和最低分对应的名字放入呢,而且要求的数据展示是最高分一行,最低分一行。所以这样行不通。

通过上面的第一个问题得出的思路:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

这样既然能得到每个学科的最高分,学生名字,学科名,那同样把max(score)改成min(score)不就可以获得最低分,学生名字,学科名字了吗?现在重点是如何把两条sql语句查询出来的结果整合到一起。

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

此时想到了sql的关键字 :    UNION的定义


UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

所以得出的sql是这样的:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score UNION

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

得出的结果是:

这样就ok了。如果还想添加一些东西。例如添加一列说明这个分数是最低分或者最高分。
select b.*,"最高分" from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score 
UNION

select b.*,"最低分" from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score


————————————————
版权声明:本文为CSDN博主「爱java的训」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010827070/article/details/79712303

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名 的相关文章

  • Bootloader和BIOS、uboot和grub和bootmgr的区别

    版权声明 xff1a 本文章参考了 Bootloader和BIOS Grub uboot概念 未经作者允许 xff0c 严禁用于商业出版 xff0c 否则追究法律责任 网络转载请注明出处 xff0c 这是对原创者的起码的尊重 xff01 x
  • 医学影像常用名词:

    医学影像处理 xff1a MPR xff1a Multiplanarreconstruction allows images to be created from the original axial plane ineither the
  • MsOS——概述

    自己接触的操作系统也有不少了 xff0c 如RT Thread Cos等 xff0c 这些实时操作系统基本的思想就是围绕任务的调度 更像是一个软件平台 xff0c 提供使用者丰富的软件资源 RT Thread是比较成功的应用于消费类产品的国
  • Pixhawk室内自动控制:参数设置

    Pixhawk室内自动控制 xff1a 参数设置 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 的Pixhawk用户 ArduCopter目前 xff08 3 52 xff09 已经能够使用光流传感器提供的位置信
  • python函数--capitalize()方法

    capitalize 方法 描述 Python capitalize 将字符串的第一个字母变成大写 其他字母变小写 语法 capitalize 方法语法 xff1a str capitalize 参数 无 返回值 该方法返回一个首字母大写的
  • c# 接口

    1 接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型 xff0c 其它类型和接口可以继承接口 定义还是很好理解的 xff0c 但是没有反映特点 xff0c 接口主要有以下特点 xff1a span class token pu
  • 在linux上增加swap交换空间

    在虚拟机里面安装oracle11g grid时 发现之前分配的swap交换空间不满足oracke gi安装的最低要求 xff0c 因为我分配的物理内存是8G xff0c 那么就按照要求需要8 12G的swap交换空间 xff0c 而我分配的
  • Elasticsearch7.6.1安装报错及解决过程

    Windows环境Elasticsearch7 6 1安装报错及解决过程 Elasticsearch是一个基于Lucene的搜索服务器 第一次安装ES7 6 1 xff0c 过程中遇到了一些报错 xff0c 把解决方法列出来 xff0c 总
  • 我的 Ubuntu 装机必备软件

    文章目录 我的 Ubuntu 装机必备软件Ubuntu的安装u盘制作添加中科大镜像源NVIDIA显卡驱动的安装卸载旧显卡驱动 安装sogou输入法下载安装配置 安装gitROS kinetic installationgoogle chro
  • GCC源码分析(十三) — 机器描述文件

    版权声明 xff1a 本文为CSDN博主 ashimida 64 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net lid
  • VNC登录报错too many security failures解决方法

    桌面进程编号为1 xff0c 可以通过使用 sudo vncserver kill 1 sudo vncserver 1 杀掉并重启解决
  • tensorflow模型保存、读取与可训练参数提取

    一 保存 读取说明 我们创建好模型之后需要保存模型 xff0c 以方便后续对模型的读取与调用 xff0c 保存模型我们可能有下面三种需求 xff1a 1 只保存模型权重参数 xff1b 2 同时保存模型图结构与权重参数 xff1b 3 在训
  • pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时 xff0c 遇到一个报错 xff1a RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available
  • 优化OpenCV视频的读取速度

    我们使用Opencv读取视频时 xff0c 常规的做法是使用read 函数逐帧读取 xff0c 如 code import cv2 cap 61 cv2 VideoCapture 34 test mp4 34 while True read
  • 图像信噪比SNR求解

    xff08 xff08 通常也采用图像信号与噪声的方差之比来近似估计图像的信噪比 xff09 xff09 利用OpenCV计算灰度图像的峰值信噪比 xff08 PSNR xff09 计算两灰度图像之间的峰值信噪比 cpp view plai
  • Jetson TX1启动自带的摄像头

    最近在使用NVIDIA的Jetson TX1开发板 xff0c 并对开发板上自带的摄像头进行了测试 xff0c 下面将测试过程中所使用的一些指令做一些记录 xff0c 在终端上输入 xff1a nvgstcapture 1 0即可打开板子上
  • 判断用new申请内存是否成功

    c 43 43 申请大的内存空间 xff08 如何判断失败 xff09 我想用new申请一个特别大的空间 xff08 多大都可以 xff09 xff0c 主要是我不能判断到底是成功还是失败 假如我这样写 int p i 61 new int
  • 图像对比度计算

    matlab中求解方式 xff1a 计算图像对比度 方法一 xff1a 中心像素灰度值与周围4近邻像素灰度值之差的平方之和 xff0c 除以以上平方项的个数 functioncg 61 duibidu4 f f为输入图像 xff0c cg为
  • 图片占内存容量计算公式

    1 图片占内存容量计算公式为 xff1a 图片所占内存大小 61 图片长度 xff08 像素 xff09 图片宽度 xff08 像素 xff09 一个像素所占内存空间 xff08 单位 xff1a 字节 xff09 一般地 xff0c 一个
  • OpenCV学习:fastAtan2函数解密

    OpenCV学习 xff1a fastAtan2函数解密 高中数学中各种正弦函数 xff0c 余弦函数总是把人搞得头大 xff0c 但是具体应用时你会发现 xff0c 其实你只需要搞清楚一个2 空间内函数分布即可 下面分析OpenCV中fa

随机推荐