关系模型、关系模型约束、关系、关系基本术语、关系表类型、性质第三次课
关系型数据库(以SQLSERVER为例)
1关系模型
1)基本概念
(1)实体:就是一个数据表(对象集合),这些对象具有共享的属性如学号,姓名,性别等. 一个实体对应一个关系
(2)属性: 关系二维表的一列叫一个属性(有些教材称为字段,field 。上1中学号,姓名是属性
一个实体是属性的集合(列的集合),也是记录的集合(行的集合)
一个数据行叫一个记录record
一个实体的一个属性针对不同对象的取值范围一样的(数据域)({“男”,“女”}是性别属性的域 )
(3)联系: 实体之间的按关键字的联系(用于以后多表连接查询)
例如:
select 学生表.学号,姓名,年龄,课程号,成绩 from 学生表,成绩表 where 学生表.学号=成绩表.学号
这就是一种两表联系的操作,把两个物理表按共同的关键字学号在逻辑上在列向上合并成一个结果表
实例记录是1对多,一个学生可选多门课,在成绩表中同一个学号可能有n次出现,表示该生选了n门课.
提醒:绝对不能做1:1,如:
成绩表:
学号 课程号1 成绩1 课程号2 成绩2 ……课程号 成绩n
01 d01 78 d02 77 …. d111 88
学生和成绩表在中小学,每个学生的课程是相同,固定情况下可以制作成1:1; 大学开课很多,学生任意选课,只能做成1:n
2)关系模型中的约束
引例:建立一个新表,性别属性列只能输入汉字男或女,身高列只能输入150-180, 姓名必须两个汉字以上
补: C,JAVA逻辑运算符 && ,||,!
对应于sql中逻辑运算符and,or,not
create table 学生表( 姓名 nchar(10) check(len(姓名)>=2), 身高 smallint check(身高>=150 and 身高<=180), 性别 nchar(1) check(性别='男' or 性别='女') ) insert into 学生表(姓名,身高,性别) values('李',110,'中') //错了 insert into 学生表(姓名,身高,性别) values('李二',170,'男')//对 select * from 学生表
(1)实体完整性
以上的各种约束和概念是保证实体(表的)内的完整性
(2)参照完整性
一个表的关键属性值发生变化时,要参考另一个表的同属性值。(工资表中不能出现不在人事表事先存在的人)
(3)用户自定义完整性
总结:一个表应该有PK,且值不能为空(实体完整性之一)
工资表的数据按工号去参考人事表,证明该人是否是合法员(实体之间的参照完整性)
制表中的性别只能是男或女,身高范围(自定义完整性之一)
注:如果一个表实在无法定义一个主码PK属性列,也要定义一个自增列,相当于记录号--recno )
2关系的数学定义概念
实例:查询学生表中姓名为杨和李的学生
select * from 学生表 where LEFT(姓名,1)='李' or LEFT(姓名,1)='杨'
(select * from 学生表 where LEFT(姓名,1)='李' ) union
(select * from 学生表 where LEFT(姓名,1)='杨')
集合学生表,集合课程表,假如每个学生把所有课程都选一次,选课结果为迪卡尔积,具体SQL实现:
select * from 学生表
select * from 课程表
select 姓名,课程号,名称 from 学生表,课程表
补充说明:
选择:查询时使用命令条件where,选一部分行记录出来
投影:查义时只查询了部分列
连接:同时按关键字列对应查询多个表
域: 一组有相同类型的值的集合。Domain,可理解为取值范围,如在老版的c语言中的int x,x的域为(-2^15 ~ 2^15-1 )
数据库中也是一样的理解,域可粗理解为一个关系中某个属性的值的范围界定。
如:属性性别的域为{男,女}, 身高的域为[150,180]
元组:表中的一个数据行(不是表头)叫一个记录,也叫一个元组。如学生表的:
0001 张三 男 1989-2-1 这就是一个元组
分量:一个元组的某个属性值就是分量,如上面的“张三”,“男”都是该元组的分量
笛卡尔积:
如:现实的实体表往往是集体概念上的笛卡尔积的子集。
如:所有学生表选课,并不是所有学生把所有的课全选一遍。所以学生选课结果表是学生表和课程表的笛卡尔积的子集。
3 关系中基本术语(重点)
(1)元组:表中的一个数据行(不是表头)叫一个记录,也叫一个元组。如学生表的:
0001 张三 男 1989-2-1 这就是一个元组
(2)属性:建立在字段类型之后,对字段除类型之外的其他约束
属性是在定义表字段的时候针对每个字段进行属性设定,是SQL用来增加字段规范和约束的
设定好的属性可以通过查看表字段desc进行查看
数据在进行增删改(写)操作时需要在满足字段类型和属性的要求
用好属性能够提升数据的有效性,方便未来进行数据操作和数据分析(数据真实性和有效性)
(3)候选码:在一个实体表中,某属性的值唯一,用这些值可以在表中唯一代表标识该元组记录,如学生表中的学号列,身份证号列,手机号列。这些列属性可以作为表的候选码,但注意,一个表可以有多个候选码。
(4)主码:一个表在候选码选一个最具有代表的属性作为主码primary key(PK), 一个表只能有一个PK码。在学生表中一般选学号为PK
注意:如管理一些数据时,数据无明确的主码,应该人为地给这样的表指定一个ID列,甚至可以让它随着新的记录数据入驻而自动产生一个整数ID,以后在操作这些记录时就有一个明确的唯一的ID。
一个表主码可能是由一列组成,也可以组多个列属性组成,比如:
学生表中: pk(学号)
成绩表中:pk(学号,课程号)
(5)主属性:在表中所的属性列中,能作为主码的一个或多个属性构成该表的主属性。
特别注意:如在学生表中,学号是主码,学号是主属性(姓名依赖于学号)。
如在选课成绩表(学号 ,课程号,成绩值)中,学号+课程号 才是主码,此时学号,课程号是成绩表的主属性。
专业说法:成绩值依赖于学号+课程号(学号和课程号组合起来就是不重复的)一个实体表中,除了主属性外的其它属性列叫非主属性列.
补:一个好的严谨的表,非主属性的值要完全(仅)依赖于主属性值;如果一个表的某属性值只是依赖于主属性(主码)的一部分,叫“部分依赖”,这样的是不优化(冗余数据太多)
(6)外码:FK 在A表中某属性列c1为主码,在B表同样有属性列c1但c1不是主码。两表可靠C1属性值进行逻辑的关联,如果要让B表的人在逻辑上依赖A1表的值的存在,此时说立足B表,C1列叫针对A表的外码。 本例中: B表->用C1列FK->A表
A表 B表
C1 c2 c3 C1 d1 d2
1 11 111 1 d11 d22
2 22 222 2 c11 c222
1 d33 d44
2 d44 d555
如成绩表中学号(代表学生),这些学号值的存在要依赖,要参考学生表的学号值。在成绩表插入一个新学生成选课数据时,我们应该要检测此学号是否已经存在于学生表中,如果存在则可以插入;如果不存在则出现“外键错误”。
以上理论就是表间的关系约束,也是一种数据完整性控制
大中型APP中,数据表几十上百个,这些表大部分要靠以上理论来实现表间的联系。
4关系(表)的类型
(1)基本表:table
是数据库最重要的实体,就是存放各种数据的物理表,是以APP的数据主要来源. 如学生表,课程表等
(2)视图:view
是虚拟表,仅存在于内存,它在使用时功能当基本表来使用,它的数据来源于基本表。虚拟表在使用结束时消失。
如:select * from 学生表
成功后系统以一个视力虚拟表呈现给用户(可这样说:在sqlserver中用户使用查询命令输出的结果都叫视图)
虽然说视图数据来源于基本表,但完成操作后,视图一般与基本表不再有关系.
可见:数据库以视图的方式把需要的数据展现出来(在前天讲的三级模式中的中间模式)。如再利用JAVA把这些视图中的数据以漂亮的表格列表方式呈现给网民(外模式)
数据库最底层提供数据过程:物理磁盘的数据库->视图->用户展示数据
(3)查询临时表
基本上同(2),临时表还包括在数据操纵过程中系统临时表,触发器(delected,inserted表)用到的.
5关系的基本性质
一个表内的数据,属性的特点
(1)列是同质的
同一列的数据有规范范围,不同列是相互独立又相互依赖的。
(2)不同列可以来自同一个域,也可不同
域是属性值的取值范围,如数学成绩,英语成绩两列可来自于同一个域。姓名列值与英语列域不一样
(3)列的左右顺序位置无意义
物理表的列左右位置顺序无意义,如学号和姓名不管谁前谁后。在查询生成视图时,可使用投影来调整
select * from 学生表
select 姓名,年龄,学号 from 学生表
可见,用户看到的结果虽然来自于物理基本表,但在形成用户视图时,可随意调整列的输出顺序位置
(4)同一个关系中不能存放完全相同的两个元组
尽量保证元组唯一,实在不行,表中人为定义一个ID数值自增列。
(5)元组的上下位置顺序无意义
向表中插入一个新元组,默认是插入在最后的。
设有内容:
Xx yyy
1
2
3
4
把原来的3行删除得:
Xx yyy
1
2
4
再向表中插入新的3得:
Xx yyy
1
2
4
3
可见,基本表的行顺序是无意义的,如上例,要形成用户视图时要按XX列有序:
Select * from 表 order by xx 就自然有序了,结果:
Xx yyy
1
2
3
4
例:select 学号,性别,姓名 from 学生表 where left(姓名,1)=’李’ order by 性别 desc
WEEK2 作业:
1 根据自己的理解(不要抄袭网络),谈谈实体之间的有哪几种联系?请为每一种联系举一个实例
答:
2 请说明实体-联系模型中的实体,属性,联系的基本概念。请举一个实例(至少三个实体),作出基本简单的E-R图
答:
3 说明以下实体间的联系的种类,并简述理由。
(1) 教研室和老师(一个老师只属于一个教研室,一个教研室可有多名老师)
答:
(2) 商品和顾客
答:
(3) 国家和首都
答:
(4) 飞机和乘客(一个航班的飞机可以载多名乘客,一名乘客可在不同时间乘坐同一航班的飞机)
答:
(5) 银行与账户
答:
(6) 图书与借阅者 (一个借阅人可以同时借多本本,可以在不同时间对同一本借阅多次)
答:
4 根据自己的理解来解释下列术语含义,每一个术语要求使用实例说明
(1) 笛卡尔积
(2) 主码
(3) 候选码
(4) 外码:
(5) 关系:
(6) 关系模式:
5 关系型数据库中的三大完整性约束是什么?各自含义是什么?请使用自己的理解说明含义并举实际例子
6 三大关系运算分别是什么?作用是什么? 各种运算试举一个实例说明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构