SQL Server学习之路(八):扩展SQL语句
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,这样就会乱套,并且这样是会报错的。
SQL Server学习之路(八):扩展SQL语句的更多相关文章
- SQL Server学习之路(七):Python3操作SQL Server数据库
0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...
- SQL Server学习之路(一):建立数据库、建立表
0.目录 1.前言 2.建立数据库 2.1 通过SSMS建立数据库 2.2 通过SQL语句建立数据库 3.建立表 3.1 通过SSMS建立表 3.2 通过SQL语句建立表 1.前言 配置是win10+ ...
- SQL Server学习之路:建立数据库、建立表
1.前言 配置是win10+SQL Server 2012,使用的GUI管理工具是SQL Server 2012自带的SQL Server Management Studio(以下简称SSMS).本系 ...
- SQL Server学习之路(六):“增删改查”之“查”
0.目录 1.前言 2.最基本的SQL查询语句 3.select...from... 3.1 "*"与"Top num *" 3.2 查询指定列 3.3 Isn ...
- SQL Server学习之路(三):“增删改查”之“增”
0.目录 1.前言 2.通过SSMS添加数据 3.通过SQL语句添加数据 3.1 添加单条数据 3.2 添加多条数据 4.通过其他表导入数据 4.1 通过数据库中的其他表导入数据 4.2 通过exce ...
- SQL Server学习之路(五):“增删改查”之“改”
0.目录 1.前言 2.通过SSMS修改数据 3.通过SQL语句修改数据 3.1 修改单列数据 3.2 修改多列数据 1.前言 增删改查都是对数据的操作,其中"改"对应的SQL语句 ...
- SQL Server学习之路(四):“增删改查”之“删”
0.目录 1.前言 2.通过SSMS删除 3.通过SQL语句删除 3.1 删除单行数据 3.2 删除所有行数据 3.3 删除表和数据库 1.前言 增删改查都是对数据的操作,其中"删" ...
- SQL Server学习之路(二):主键和外键
0.目录 1.定义 1.1 什么是主键和外键 1.2 主键和外键的作用 1.3 主键.外键和索引的区别 2.主键(primary key) 2.1 通过SSMS设置主键 2.2 通过SQL语句设置主键 ...
- SQL Server学习路径(文章目录)
SQL Server文章目录 SQL Server文章目录(学习路径) 转自:http://www.cnblogs.com/CareySon/archive/2012/05/08/2489748.h ...
随机推荐
- AJAX,PHP,前端简单交互制作输入框效果
PHP数据 <?php // 数据 $arr = array( array("百度", "http://www.baidu.com/"), array(& ...
- code force 403C.C. Andryusha and Colored Balloons
C. Andryusha and Colored Balloons time limit per test 2 seconds memory limit per test 256 megabytes ...
- django 实现同一个ip十分钟内只能注册一次(redis版本)
上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...
- css响应式布局
以设计稿为准,假设设计稿竖屏宽度为750px,取根元素的font-size为50px 在iphone6(375px)下,deviceWidth=7.5rem, 这个就是viewPort中的device ...
- javascript中toString和valueOf方法的区别
toString():将对象转为字符串 valueOf():获取对象的原始值, 1.针对基本类型的变量:如在string,number,boolean类型的变量上调用这两个方法时,直接返回原始值,即变 ...
- 乐视(LeTV)占用8080端口
- T-SQL 删除重复数据SQL
WITH cte AS ( SELECT roleid,permissionid, row_number() OVER(PARTITION BY roleid,permissionid ...
- 代码重构:用工厂+策略模式优化冗余的if else代码块
最近在工作中优化了一段冗余的if else代码块,感觉对设计模式的理解和运用很有帮助,所以分享出来.鉴于原代码会涉及到公司的隐私,因此就不贴出来了.下面以更加通俗易懂的案例来解析. 假如写一个针对员工 ...
- JavaScript系列-----Object之toString()和valueOf()方法 (2)
深入理解toString()和valueOf()函数 1.我们为什么要了解这两种方法 众所周知,toString()函数和valueOf函数,这两个函数是Object类的对象生来就拥有的,而且他们还可 ...
- 浅谈字体小图标font awesome,iconfont,svg各自优缺点
三种都是矢量图(即放大不失真),但是个自又有个自的优缺点, 1.font awesome: 优点:相对比较简单,查看官网看例子基本上都会用 (http://www.bootcss.com/p/font ...