0.目录

1.问题描述

2.第一种方法

  • 通过GROUP BY子句解决

3.第二种方法

  • 通过聚合函数解决

4.第三种方法

  • 在select...from...中的from后面嵌套一个表

5.第四种方法

  • 在select...from...中的select后面嵌套一个列

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,这样就会乱套,并且这样是会报错的。

最新文章

  1. dereverberation
  2. NOIP2001统计单词个数[序列DP]
  3. Python 过算符和数据类型
  4. 运动曲线提升CSS动画效果
  5. 转:不应该不知道C++的常用库
  6. Android ImageView的scaleType属性与adjustViewBounds属性(转载)
  7. C与C++在const用法上的区别
  8. java基本类型作为成员变量时的初始值
  9. 窗口!窗口!- Windows程序设计(SDK)003
  10. Lua中强大的元方法__index详解
  11. 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期
  12. 1572: [Usaco2009 Open]工作安排Job
  13. jquery、js获取页面高度宽度等
  14. mongo - 升级步骤
  15. 使用Fiddle抓取IOS手机
  16. java语句中的重定向函数
  17. Windows两个网卡配置路由规则 同时访问内网和外网
  18. Python 总结一
  19. MYSQL Statement violates GTID consistency: CREATE TABLE ... SELECT. 错误代码: 1786 问题
  20. Eclipse中 *.properties 文件编码设置

热门文章

  1. NTP时间服务器 搭建
  2. scanf和cin性能的比较
  3. cookie 子域名可以读父域名中的cookie
  4. 数组删除操作 splice
  5. Intellij导入子项目时,maven列表子项目灰色不可用---解决方法
  6. 粗略整理的java面试题
  7. JavaScript系列-----对象基于哈希存储(<Key,Value>之Value篇) (3)
  8. HTTP响应头信息(Response Headers)与请求头信息(Request Headers)
  9. centos6.5安装rabbitmq3.6.14
  10. bzoj1003