数据库原理与应用【2025-2026-2】

赵春、毛红霞、李驰、刘福刚、曾丽

目录

  • 1 两课设计
    • 1.1 教学大纲
    • 1.2 教案
      • 1.2.1 李驰老师-教案
        • 1.2.1.1 24级数媒4班-教案
      • 1.2.2 毛红霞老师-教案
        • 1.2.2.1 24级数字媒体2班教案
        • 1.2.2.2 24级数字媒体3班教案
    • 1.3 课堂反思
      • 1.3.1 李驰老师-课堂反思
        • 1.3.1.1 24数媒4班
          • 1.3.1.1.1 3月9日(第2周第1次课)
          • 1.3.1.1.2 3月16日(第4周第1次课)
      • 1.3.2 毛红霞老师-课堂反思
        • 1.3.2.1 24级数字媒体2班
          • 1.3.2.1.1 3月12号(第2周第2次课——除运算)
          • 1.3.2.1.2 3月18号(第3周第1次课——关系代数习题课)
        • 1.3.2.2 24级数字媒体3班
          • 1.3.2.2.1 3月12日(第2周第2次课——连接、除)
          • 1.3.2.2.2 3月17日(第3周第1次课——关系代数习题课)
    • 1.4 课程反思
      • 1.4.1 李驰老师-课程反思
      • 1.4.2 毛红霞老师-课程反思
    • 1.5 高阶课堂安排
    • 1.6 教材案例配套数据表
    • 1.7 实验数据库Northwind
    • 1.8 数据库软件安装
  • 2 数据库基本概念
    • 2.1 学习内容及要求
    • 2.2 课堂设计(教案)
    • 2.3 内容要点解析
    • 2.4 电子课件
    • 2.5 参考文献
  • 3 关系数据库
    • 3.1 学习内容及要求
    • 3.2 课堂设计(教案)
    • 3.3 内容要点解析
    • 3.4 电子课件
    • 3.5 参考文献
    • 3.6 微课视频
    • 3.7 翻转教学
      • 3.7.1 学习任务单
  • 4 关系代数
    • 4.1 学习内容及要求
    • 4.2 课堂设计(教案)
    • 4.3 内容要点解析
    • 4.4 电子课件
    • 4.5 参考文献
    • 4.6 微课视频
    • 4.7 翻转教学
      • 4.7.1 学习任务单
  • 5 关系代数(习题课)
    • 5.1 学习内容及要求
    • 5.2 课堂设计(教案)
    • 5.3 内容要点解析
    • 5.4 电子课件
    • 5.5 微课视频
  • 6 SQL数据类型与数据定义语句
    • 6.1 学习内容及要求
    • 6.2 课堂设计(教案)
    • 6.3 内容要点解析
    • 6.4 电子课件
    • 6.5 参考文献
    • 6.6 微课视频
    • 6.7 上机实验
    • 6.8 翻转教学1
      • 6.8.1 学习任务单
      • 6.8.2 翻转课件
      • 6.8.3 翻转视频
      • 6.8.4 讨论问题
    • 6.9 翻转教学2
      • 6.9.1 学习任务单
  • 7 SQL单表基本查询
    • 7.1 学习内容及要求
    • 7.2 课堂设计(教案)
    • 7.3 内容要点解析
    • 7.4 电子课件
    • 7.5 参考文献
    • 7.6 微课视频
      • 7.6.1 单表查询与聚合函数
      • 7.6.2 图形化单表查询
    • 7.7 上机实验
    • 7.8 翻转教学
      • 7.8.1 学习任务单
  • 8 SQL统计查询
    • 8.1 学习内容及要求
    • 8.2 课堂设计(教案)
    • 8.3 内容要点解析
    • 8.4 电子课件
    • 8.5 参考文献
    • 8.6 微课视频
    • 8.7 上机实验
    • 8.8 翻转教学
      • 8.8.1 学习任务单
  • 9 SQL多表查询
    • 9.1 学习内容及要求
    • 9.2 课堂设计(教案)
    • 9.3 内容要点解析
    • 9.4 电子课件
    • 9.5 参考文献
    • 9.6 微课视频
    • 9.7 上机实验
    • 9.8 翻转教学
      • 9.8.1 学习任务单
  • 10 SQL嵌套子查询
    • 10.1 学习内容及要求
    • 10.2 课堂设计(教案)
    • 10.3 内容要点解析
    • 10.4 电子课件
    • 10.5 参考文献
    • 10.6 微课视频
    • 10.7 上机实验
    • 10.8 翻转教学
      • 10.8.1 翻转视频
      • 10.8.2 翻转课任务分配
      • 10.8.3 翻转课流程安排
      • 10.8.4 学习任务单
      • 10.8.5 查询语句编写秘籍
  • 11 SQL数据更新
    • 11.1 学习内容及要求
    • 11.2 课堂设计(教案)
    • 11.3 内容要点解析
    • 11.4 电子课件
    • 11.5 参考文献
    • 11.6 微课视频
    • 11.7 上机实验
    • 11.8 SQL编程综合习题课(高阶翻转)
      • 11.8.1 翻转学习任务单
      • 11.8.2 翻转视频
      • 11.8.3 翻转课件
    • 11.9 备份资料
      • 11.9.1 学习任务单
  • 12 索引和视图
    • 12.1 学习内容及要求
    • 12.2 课堂设计(教案)
    • 12.3 内容要点解析
    • 12.4 电子课件
    • 12.5 参考文献
    • 12.6 微课视频
    • 12.7 上机实验
    • 12.8 翻转教学
      • 12.8.1 学习任务单
      • 12.8.2 翻转课件
  • 13 数据库设计
    • 13.1 学习内容及要求
    • 13.2 课堂设计(教案)
    • 13.3 内容要点解析
    • 13.4 电子课件
    • 13.5 参考文献
    • 13.6 微课视频
    • 13.7 上机实验
    • 13.8 数据库设计-翻转方案I(分班级实施)
      • 13.8.1 学习任务单
      • 13.8.2 翻转视频
      • 13.8.3 翻转课件
      • 13.8.4 课前作业及讨论
    • 13.9 数据库设计-翻转方案II(分班级实施)
      • 13.9.1 学习任务单
      • 13.9.2 翻转视频
      • 13.9.3 翻转课件
      • 13.9.4 问答总结
      • 13.9.5 技巧总结
      • 13.9.6 案例练习
  • 14 规范化理论-1
    • 14.1 学习内容及要求
    • 14.2 课堂设计(教案)
    • 14.3 内容要点解析
    • 14.4 电子课件
    • 14.5 参考文献
    • 14.6 翻转教学
      • 14.6.1 学习任务单
  • 15 规范化理论-2
    • 15.1 学习内容及要求
    • 15.2 课堂设计(教案)
    • 15.3 内容要点解析
    • 15.4 电子课件
    • 15.5 参考文献
    • 15.6 翻转视频
    • 15.7 上机实验
    • 15.8 翻转教学
      • 15.8.1 学习任务单
  • 16 事务、存储过程与触发器
    • 16.1 学习内容及要求
    • 16.2 课堂设计(教案)
    • 16.3 内容要点解析
    • 16.4 电子课件
    • 16.5 参考文献
    • 16.6 微课视频
    • 16.7 翻转教学
      • 16.7.1 学习任务单
  • 17 数据库高阶挑战性项目实践Ⅰ
    • 17.1 学习内容及要求
    • 17.2 实践任务
    • 17.3 课堂设计(教案)
    • 17.4 参考文献
    • 17.5 微课视频
  • 18 数据库高阶挑战性项目实践Ⅱ
    • 18.1 学习内容及要求
    • 18.2 实践任务
    • 18.3 课堂设计(教案)
    • 18.4 电子课件
    • 18.5 参考文献
    • 18.6 微课视频
    • 18.7 数据预处理总结
  • 19 课程扩展-数据备份与导入导出
    • 19.1 微课视频
    • 19.2 参考文献
  • 20 课程设计
    • 20.1 课堂设计(教案)
    • 20.2 课程设计及项目报告模板
内容要点解析
  • 1 多表连接
  • 2 自连接

SQL多表查询

搬出问题背景:

每一位同学在期末放假的时候,都想知道自己各门课程的考试成绩(当然,或许也有不想知道的!:))。我们来看看如何满足同学们的需求。

先来分析一下,当同学们查成绩的时候,需要呈现出什么样的内容。大概会有:学生姓名、学号、课程名称、成绩。大抵如此。可以很明确地发现,这些信息分布在上述三张表中,所以这三张表都是我们的查询目标。那这样的SQL怎么写呢?是这样吗:

select Sno,Sname,Cname,Grade from Student,Course,SC

这条语句如果在数据库中被执行?会得到什么呢?

结果是:会得到一堆乱七八槽的东西!结果中的记录数量=Student的记录数*Course的记录数*SC的记录数。咱们想要的应该不是这样?因为至少从记录数上看,结果是错误的,它不应该超过学生选课总数(即SC表的记录数量)。哪里出了问题?善于联想的同学或许已经从上述描述中想到了一种运算,因为这种运算的结果正好是上面这个结果。什么运算?

笛卡尔积!

没错!就是它!上面的SQL语句执行的结果正是做的笛卡尔积。但这种运算并不能给予我们正确的结果。我们需要做的就是增加表和表之间的连接条件,通过连接条件来告诉这些表,哪些记录可以匹配、合并,而不是漫无目的地将任意两条记录随意地合并在一起。

那么连接条件应该怎么写呢?让我们来考察一下表Student和表SC。大家肯定已经明确了,这两张表之间是有关联的。即SC中的Sno参考了Student中的Sno;换句话说,Student中的Sno是外码,SC表中的Sno来自于Student中的Sno。所以对于Student中的某一名同学,如果SC表中某些记录的Sno等于这个同学的Sno,那么我们就可以说这些记录就是这个同学的选课记录。因此Sno是我们关联这两张的关键。

好了,我们现在应该可以写出这两张表之间的连接条件了:

Student.Sno=SC.Sno

好,但是我们还有一张表:Course。道理和上面相同,我们也得把它拉帮入伙!谁去拉?Student?SC?Student是无法完成这个任务的,因为它没有可以与Course相关联的字段;但是SC表中有这个东西,这就是Cno。所以我们可以凭借Cno,通过SC去连接Course。再写一个连接条件:

SC.Cno=Course.Cno

每一个连接条件都连接了两张表呢,我们把它们并起来就实现了对三张表的连接:

Student.Sno=SC.Sno and SC.Cno=Course.Cno

最后来完善我们最开始给出的SQL语句:

select Sno,Sname,Cname,Grade 

from Student,Course,SC

where Student.Sno=SC.Sno and SC.Cno=Course.Cno

这条语句基本完成,但如果直接放到SQLServer中去执行,依然会给我们报错。报错的信息大概是:Sno不明确。什么地方的Sno不明确?为什么不明确呢?让我来回答一下这两个问题:

1、Select后的Sno不明确;

2、因为在Student和SC表中都存在Sno字段,因此select后的Sno到底是谁的Sno呢?好,报的不明确就是指这个原因。

既然如此,那我们怎么让它明确呢?加上表名限定就可以了。如下:

select Student.Sno,Sname,Cname,Grade 

from Student,Course,SC

where Student.Sno=SC.Sno and SC.Cno=Course.Cno

大家会想另外一个问题吗?Sname、Cname、Grade为什么不加?因为这三个字段都只是在各自的表中出现,并不会引起混淆的情况,所以它们可加,也可不加表名限定。这个由你决定。

OK!这就是我们最终的SQL语句,它完成了对Student、SC、Course三张表的连接。这条查询语句的执行结果可以告诉我们每一名同学的课程成绩。

闲话一下:其实通常由于表名较长,且难写,因此出于避免出错和简洁代码的考虑,我们在进行多表连接时,都会给表名一个更为简洁的别名,比如上面的语句可写成:

select s.Sno,Sname,Cname,Grade

from Student s,Course c,SC sc

where s.Sno=sc.Sno and sc.Cno=c.Cno

看上去是不是要好一点...

通过以上稍显啰嗦的讨论,大家应该明白了多表连接的基本原理和方法。最后总结一下:

1、什么时候需要多表连接?

当我们查询的字段和条件字段分布在多张表的时候,就需要做多表连接。

强调:多表连接是很耗费数据库资源的,除非必要,否则不要频繁地做多表连接。单表可以完成查询的,一定不要做多表连接查询。

2、多表如何连接?

找出表之间的关联字段,通过对关联字段的比较来完成表与表之间的连接。这种比较不一定是等值比较;这种关联字段也不一定是外键字段。

提醒:如果两张表无法做直接的连接,那么就必须要想方设法地寻找第3张表来间接地关联两表,也就是要为无法直接关联的两张表找一个桥梁。

【例1】查询选修了“数据库”课程的学生姓名。

select Sname

from Course c, SC sc, Student s

where sc.cno=c.cno and sc.Sno=s.Sno and c.Cname=‘数据库’