1.问题描述

现在有一张course表(含课程编号和名称)和一张sc表(含学生学号,选修课程的编号以及考试成绩),如下:

现在想要查询所有课程编号、对应的课程名称以及选修该课程的所有学生的平均成绩。
一开始我的想法就是用以下的查询语句:

select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno

但是显然会报错:

于是开始想其他的办法。

2.第一种方法

首先想到的当然是按照报错信息来了,既然cname不在GROUP BY子句中,那就放到GROUP BY子句中呗,如下:

select sc.cno as 课程编号, cname as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno, cname


但是这种方法是不严谨的,因为这里是知道每个课程号只对应一个课程名称,所以这种办法才行。但是在其他的情况中,一旦每个课程号不是只对应一个课程名称,那就很乱了。所以还得想其他办法。

3.第二种方法

第二个想到的方法也是按照报错信息来,将cname变成聚合函数就行了,如下:

select sc.cno as 课程编号, Max(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno
-- 或者
select sc.cno as 课程编号, Min(cname) as 课程名称, Avg(grade) as 平均成绩
from course, sc
where course.cno = sc.cno
group by sc.cno


但是这种方法是比第一种方法还不如的。因为课程名称是字符串,取最大最小值毫无意义。

4.第三种方法

接下来就是正确的方法了,也就是标题提到的扩展SQL语句,也算是嵌套SQL语句。
因为select...from...中,from后面接的是,所以这个表可以是另一个select语句查询出来的结果,如下:

select course.cno as 课程编号, cname as 课程名称, tmp.平均成绩
from course, (select cno, Avg(grade) as 平均成绩 from sc group by cno) as tmp
where course.cno = tmp.cno


在select...from...中的from后面嵌套一个select...from...,并且将嵌套的select...from...查询出来的表起个别名tmp,这样就能用tmp来操作这张表了。

5.第四种方法

既然select...from...中的from后面可以嵌套一个表,那么select...from...中的select后面可以嵌套一个列吗?
答案是可以的。如下:

select cno as 课程编号,
(select cname from course where sc.cno=course.cno) as 课程名称,
Avg(grade) as 平均成绩
from sc
group by sc.cno


要注意的是在(select cname from course where sc.cno=course.cno)中必须要有where sc.cno=course.cno,只有这样查询出来的结果才是一一对应的,否则查询出来的结果是很多的,然后每个cno会对应很多个cname,这样就会乱套,并且这样是会报错的。

T-sql GroupBy语句常见问题处理的更多相关文章

  1. Linq Mysql GroupBy语句的问题处理

    语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => n ...

  2. SQL 查询语句总是先执行 SELECT?你们都错了

    很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...

  3. [转]MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下.   DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...

  4. SQL入门语句之ORDER BY 和GROUP BY

    一.SQL入门语句之ORDER BY ORDER BY 是用来基于一个或多个列按升序或降序顺序排列数据 1.从数据库表获取全部数据按字段A的升序排列 select *from table_name o ...

  5. SQL入门语句之LIKE、GLOB和LIMIT

    一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...

  6. SQL入门语句之SELECT和WHERE

    一.SQL入门语句之SELECT SELECT语句用于从数据库表中获取数据,结果表的形式返回数据.这些结果表也被称为结果集 1.从数据库表中取部分字段 select 字段A,字段B from tabl ...

  7. SQL入门语句之INSERT、UPDATE和DELETE

    一.SQL入门语句之INSERT insert语句的功能是向数据库的某个表中插入一个新的数据行 1.根据对应的字段插入相对应的值 insert into table_name(字段A, 字段B, 字段 ...

  8. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  9. sql查询语句如何解析成分页查询?

    我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...

随机推荐

  1. angular的路由跳转,的监听$rootScope.$on

    使用angular来做项目时,习惯性的使用第三方路由插件ui-router配置路由.每一个状态都对应着一个页面, 因此对路由状态改变的监听也变的十分重要. 可以使用:$rootScope.$on(…… ...

  2. ZooKeeper+Kafka+Storm

    http://www.cnblogs.com/panfeng412/archive/2012/11/30/how-to-install-and-deploy-storm-cluster.html

  3. oracle的时间

    今天发现之前从oracle导出的数据时间格式很奇怪: "ACTIVETIME","ACTIVITYID" "2018-08-10 06:08:43&q ...

  4. 轻量级封装DbUtils&Mybatis之四MyBatis主键

    MyBatis主键 不支持对象列表存储时对自增id字段的赋值(至少包括3.2.6和3.3.0版本),如果id不是采用底层DB自增主键赋值,不必考虑此问题 温馨提示:分布式DB环境下,DB主键一般会采用 ...

  5. 数组游标实现对数组的各种操作(PHP学习)

    如何不用foreach实现对数组实现循环? 答:我们只需要模拟foreach就行了,数组在执行foreach循环的时候,是有一个游标指向当前数组循环到的值, 那如果我们能拿到这个游标,并且操作游标,使 ...

  6. RTMP(实时信息传输协议)详解

    RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing) ...

  7. Java 成员变量和局部变量

    1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 成员变量和局部变量的区别 作用域不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域 ...

  8. Java-Runoob:Java Scanner 类

    ylbtech-Java-Runoob:Java Scanner 类 1.返回顶部 1. Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Sc ...

  9. Linux上面缺少rz和sz命令

    一.centos系统没有自带rz/sz命令 yum install lrzsz 搞定! 二.对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / ...

  10. node+express+socket.io制作一个聊天室功能

    首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...