找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2191

积分

0

好友

289

主题
发表于 2 小时前 | 查看: 2| 回复: 0

关系模型是现代数据库系统的基石,自1970年由IBM研究员E.F.Codd提出以来,它以集合论和谓词逻辑为坚实理论支撑,逐步取代了层次和网状模型,成为当今主流数据库的标准。对于备战软考“软件设计师”科目的同学而言,掌握这部分知识至关重要,它通常在数据库系统模块占据8-12分的稳定分值。无论是选择题中的关系代数运算、完整性约束判断,还是案例分析里的数据库设计与SQL编写,都是必考内容。

本文将深入浅出地讲解关系模型的核心概念、三大完整性约束、五种基本关系代数运算以及SQL基础查询语法。这些内容不仅能帮你攻克考试难点,更能为你在实际项目中进行数据库设计与操作打下坚实的理论基础。

二、关系模型基本概念

简单来说,关系模型就是用二维表来组织数据,所有操作都基于集合运算。我们先来理清几个核心术语。

2.1 关系与属性

我们常说的“表”,在关系模型中就叫“关系”,每个关系都有一个唯一的名字。表中的每一行是一个“元组”(或记录),每一列则是一个“属性”(或字段)。每个属性都有名字,并且同一列的所有数据都来自同一个值域(数据类型)。

一个规范的关系(表)必须具备以下特征:

  • 列是同质的:同一列的所有值必须属于同一种数据类型。
  • 属性名唯一:不同的列可以来自同一个域,但必须有不同的名字。
  • 行列无序:列和行的排列顺序可以任意交换,不影响数据本身。
  • 元组唯一:不允许存在两条完全相同的记录。
  • 原子性:每个属性(单元格)的值必须是不可再分的基本数据项,不能是数组、列表或另一个表。

2.2 码与属性分类

“码”是标识和关联元组的关键。

  • 候选码:能够唯一标识关系中每一个元组的最小属性集合。一个关系可以有多个候选码。例如,在员工表中,“员工号”和“身份证号”都能唯一确定一个员工,它们都是候选码。
  • 主码(主键):从候选码中选定一个,作为唯一标识元组的正式“身份证”。一个关系有且只有一个主码。
  • 主属性与非主属性:包含在任何一个候选码中的属性称为主属性,反之则是非主属性。上例中,“员工号”、“身份证号”是主属性,“姓名”、“部门”等是非主属性。
  • 外码(外键):它是本关系中的一个属性(集),并非本关系的主码,但却对应着另一个关系的主码。外码是建立表与表之间联系的桥梁。例如,员工表中的“部门号”属性,它不是员工表的主键,但却是部门表的主键,那么“部门号”就是员工表的外码。

关系模型基本概念示意图:表、属性、元组、候选键、主键、外键

三、关系完整性约束

完整性约束是保证数据库中数据正确、一致和可靠的铁律,主要分为三类。

3.1 实体完整性与参照完整性

这两类是由关系模型本身强制要求的。

  • 实体完整性规则主码的所有属性都不能取空值(NULL),也不能出现重复值。道理很简单,主码是元组的唯一标识,如果为空或重复,就失去了“唯一标识”的意义。例如,规定“员工号”是主码,那么每条记录的员工号都必须是非空且唯一的。
  • 参照完整性规则外码的取值只有两种可能:要么为空(NULL),要么等于被参照关系(主表)中某个元组的主码值。这保证了表间的关联是有效的。例如,员工表(参照关系)中的“部门号”(外码),要么为空(表示员工暂未分配部门),要么其值必须在部门表(被参照关系)的“部门号”(主码)中存在。

3.2 用户定义完整性

这是用户根据具体业务需求制定的规则,体现了业务语义。

  • 非空约束:如“员工姓名”不能为空。
  • 唯一约束:如“部门名称”不能重复。
  • 检查约束:如“员工年龄”必须在18到65岁之间,“工资”必须大于0。
  • 默认值约束:如“入职时间”默认为当前系统时间。

数据库系统在执行插入、更新、删除操作时,会自动检查所有这些约束,违反规则的操作将被拒绝。

三类完整性约束关系图:实体完整性、参照完整性、用户自定义完整性

四、关系代数基本运算

关系代数是一种抽象的查询语言,它把关系当作集合进行运算,其结果是新的关系。它是SQL语言的理论基石。所有复杂的查询都可以通过五种基本运算组合而成:并、差、笛卡尔积、投影、选择。

4.1 集合运算(并、差、笛卡尔积)

  • 并运算(∪):合并两个结构相同(属性个数相同,对应域相同)的关系R和S,结果包含所有属于R或属于S的元组,并自动去重。
  • 差运算(-):从关系R中减去也属于关系S的元组,得到仅属于R的元组。同样要求R和S结构相同。
  • 广义笛卡尔积(×):将两个关系R(n列)和S(m列)的元组进行所有可能的组合。结果关系有n+m列,元组数为R的元组数乘以S的元组数。它通常会产生大量无意义的组合,需要配合其他运算(如选择)进行筛选。

4.2 专门的关系运算(投影、选择)

  • 投影(π)垂直筛选。从关系中选取指定的若干列,并去掉重复的行。语法为 π<属性列表>(关系名)。例如,π姓名, 年龄(学生) 会得到所有学生的姓名和年龄列表,重复的(姓名、年龄)组合只出现一次。
  • 选择(σ)水平筛选。从关系中选取满足给定条件的元组。语法为 σ<条件表达式>(关系名)。条件中可使用 >, <, =, <> (不等于)等比较符,以及 AND, OR, NOT 逻辑符。例如,σ年龄>20 AND 性别='男'(学生) 会选出所有20岁以上的男学生。

复杂查询就是这些基本运算的组合。例如,查询选修了课程号为‘C001’的学生姓名,其关系代数表达式为:π姓名(σ课程号='C001'(选课) ⋈ 学生)。这里的连接运算(等值连接)本质上可以通过笛卡尔积加选择运算来实现:先做“选课×学生”的笛卡尔积,再选择出两个关系中学号相等的元组,最后投影出姓名。

五种关系代数运算(并、差、笛卡尔积、投影、选择)示意图

五、SQL基础查询语法

SQL(结构化查询语言)是操作关系数据库的标准语言。SELECT语句是数据查询的核心,它直接对应了关系代数中的投影和选择运算。

5.1 SELECT语句基本结构

基本语法框架如下:

SELECT [ALL|DISTINCT] <目标列表达式>
FROM <表名或视图名列表>
[WHERE <条件表达式>];
  • SELECT子句:对应投影运算,指定要返回的列。DISTINCT用于去除结果中的重复行,ALL(默认)则保留所有行。目标列可以是列名、常量、函数或表达式。
  • FROM子句:指定数据来源,可以是一个或多个表/视图。
  • WHERE子句:对应选择运算,指定筛选元组的条件。

5.2 WHERE子句常用运算符

灵活运用这些运算符是编写查询的关键。

  • 比较运算符=, >, <, >=, <=, <> 用于基本比较。
  • 范围运算符BETWEEN ... AND ... 判断值是否在某个闭区间内。
  • 集合运算符IN (值列表) 判断值是否属于给定集合。
  • 字符匹配运算符LIKE 进行模糊查询。%匹配任意长度字符,_匹配单个字符。
  • 空值判断:必须用 IS NULLIS NOT NULL,不能用 = NULL
  • 逻辑运算符AND, OR, NOT 用于组合多个条件。优先级为 NOT > AND > OR,可用括号()改变顺序。

来看几个典型例子:

-- 查询部门号为'01001'(计算机学院)所有学生的姓名和年龄
SELECT Sname, Sage FROM Student WHERE DepartmentNo = '01001';

-- 查询姓'张'且年龄在20到25岁之间的学生所有信息
SELECT * FROM Student WHERE Sname LIKE '张%' AND Sage BETWEEN 20 AND 25;

-- 查询尚未分配部门的员工姓名
SELECT EmpName FROM Employee WHERE DepartmentNo IS NULL;

SELECT语句执行流程:FROM -&gt; WHERE -&gt; SELECT

六、总结与建议

我们来梳理一下关系模型的核心脉络,它主要围绕四点展开:

  1. 二维表结构:数据以原子值形式存储在规范的表中。
  2. 码体系:通过候选码、主码实现唯一标识,通过外码实现表间关联。
  3. 完整性约束:通过实体、参照和用户定义完整性确保数据的正确与一致。
  4. 关系代数运算:以并、差、笛卡尔积、投影、选择五种基本运算为理论核心,构成所有查询的基础。

对于软考备考者,高频考点包括:主/非主属性判断、参照完整性规则应用、关系代数表达式等价转换、SQL语句编写。常见的“坑”有:外码允许为NULL(除非它同时是自身的主属性)、投影运算自带去重、LIKE通配符的使用、判断空值必须用IS NULL

在解题时,选择题中的关系代数题,可以先做选择(筛选)再做连接,这符合查询优化逻辑,能减少计算量。案例分析写SQL时,一定要时刻考虑表上定义的完整性约束。

学习建议是,先吃透概念定义,区分清楚候选码与主码、主属性与非主属性。然后动手练习五种基本运算,理解每一步的结果。最后,将关系代数表达式与SQL语句对照练习,做到知行合一,这对深入理解数据结构和查询逻辑大有裨益。如果你想获得更多这样的系统学习资料和与同行交流,欢迎访问云栈社区

小试牛刀

(综合题)给定三个关系:

  • 员工关系 E(员工号, 员工名, 部门名, 电话)
  • 工程关系 P(工程号, 工程名)
  • 参与关系 EP(员工号, 工程号, 工作量)

现在要查询员工号为‘005’的员工参与了工程名为“虎头山隧道”的工程的员工名和部门名。给出的关系代数表达式为:
π员工名,部门名(σ员工号=‘005’(E) ⋈ (π工程号(σ工程名=‘虎头山隧道’(P)) ⋈ EP))
你能试着拆解一下这个表达式的组合过程吗?




上一篇:矩阵行列式是什么?从计算公式到几何意义的完全解读
下一篇:AI编程时代,Augment Code的招聘框架预示工程师面试策略之变
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-19 06:52 , Processed in 0.742994 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表