文章

数据库基本知识

数据库基本知识

数据库基本知识

参考文章:https://blog.csdn.net/welkin_qing/article/details/85874145

数据库基本知识

基本概念

Q&A

Q: 数据库管理系统能实现对数据库中数据的查询、插入、修改和删除,这类功能称为?

A: 数据操纵功能。

Q: 什么是数据的语义?为什么数据与其语义是不可分的?

A: 数据的含义称为数据的语义,所以数据和语义是不可分的。

Q: 什么是数据库?什么是数据库管理系统? 说明两者的区别和联系。

A:

  • 数据库(DataBase,DB):长期存储的、有组织的、可共享的相关数据的集合。
  • 数据库管理系统(Database Management System,DBMS):是建立、运用、管理、控制和维护数据库,并对数据进行统一管理和控制的系统软件。
  • 数据库系统:指在计算机系统中引入数据库后的系统,即具有数据处理功能的系统。
  • 联系:数据库系统一般由数据库、数据库管理系统、应用系统、用户构成。

Q: 下面列出的数据管理技术发展的三个阶段中,没有专门的软件对数据进行管理的是?

A: 人工管理阶段。

Q: 关系数据模型是目前最重要的一种数据模型,它的三个要素分别是?

A: 数据结构、关系操作、完整性约束。

Q: 举例说明以下基本概念: 实体,实体型,实体集,实体之间的联系。

A:

  • 实体: 客观存在并可以相互区分的事物叫实体。例如:一门具体的课程。
  • 实体型: 具有相同属性的实体具有由相同的特征和性质,用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。例如:课程(课程号,课程名称)。
  • 实体集: 同型实体的集合称为实体集。例如:大三所有课程。
  • 实体之间的联系: 通常是指不同实体型的实体集之间的联系,有一对一,一对多,多对多等多种类型。

Q: 在哪种模型中一个结点可以有多个双亲,结点之间可以有多种联系?

A: 网状模型。

Q: 关系数据模型的基本数据结构是?

A: 关系。

Q: 数据的逻辑独立性是指?

A: 模式改变,外模式和应用程序不变。

Q: 什么叫数据与程序的物理独立性?什么叫数据与程序的逻辑独立性? 为什么数据库系统具有数据与程序的独立性?

A:

  • 物理独立性:用户应用程序与存储在磁盘上的数据库中的数据是独立的。
  • 逻辑独立性:当数据的逻辑结构(即模式)改变时,用户程序(外模式)可以不变。
  • 原因:由于数据库管理系统在用户与数据之间增加了一层抽象,数据与程序相互分离,从而简化了应用程序的编写和维护。

Q: 数据库系统由数据库、数据库管理系统、应用系统和谁组成?

A: 数据库管理员(DBA)。

Q: 给定三个域,D1为导师集合{张清玫,刘逸},D2为专业集合{计算机专业,信息专业},D3为研究生集合{李勇,刘晨,王敏},则域D1,D2,D3的笛卡尔积的基数为?

A: 12 (2 * 2 * 3 = 12)。

Q: 关系数据库中的“关系”与日常生活中常见的“表格”有什么不同?

A: 关系中不能有重复的元组(行),而表格中可以出现相同的行。

Q: 一个关系是否元组越多,所描述的信息就越丰富?

A: 不一定。

Q: 关系模型中必须满足的完整性约束包括?

A: 实体完整性、参照完整性。

Q: 如果数据库只有一个关系,是否就不存在参照完整性了?

A: 不是。一个关系中的外键可以参照其自身的主键。

Q: 关系代数的运算对象和运算结果为?

A: 关系。

Q: 有两张学生成绩表,表1(学号,姓名,数学成绩),表2(学号,姓名,物理成绩),请问这两张表是否可以做“集合并”操作?为什么?

A: 不可以,因为它们的域(列的定义)不完全相同(数学成绩 vs 物理成绩)。

Q: 假设关系R(A,B,C)中A是码,R1(A,B)和R2(A,C)是分别从R中投影得到的两个关系,请问 R1(A,B) Join R2(A,C) = R(A,B,C) 是否成立?(注:Join是自然连接)

A: 错误。如果B或C列中存在NULL值,自然连接可能会丢失信息。但在没有NULL值的情况下,这个等式是成立的。

Q: 给出两种或以上不同的表达,其结果是一样的:选修数据库的学生名单(学号,姓名)。

A:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 假设有 Student(Sno, Sname), Course(Cno, Cname), SC(Sno, Cno) 三张表
-- 方法一:使用连接查询
SELECT s.Sno, s.Sname
FROM Student s
JOIN SC sc ON s.Sno = sc.Sno
JOIN Course c ON sc.Cno = c.Cno
WHERE c.Cname = '数据库';

-- 方法二:使用子查询
SELECT Sno, Sname
FROM Student
WHERE Sno IN (
    SELECT Sno
    FROM SC
    WHERE Cno = (SELECT Cno FROM Course WHERE Cname = '数据库')
);

Q: 如何理解SQL是非过程的语言?

A: SQL是一种声明式语言,用户只需指定“做什么”(What),而不需要指定“怎么做”(How)。数据库管理系统会负责优化和执行查询。它一次处理一个记录集合,而不是单条记录。

Q: 为什么不需要一个 ALTER VIEW 的语句?

A: 视图是一个虚表,数据库中只存储其定义,不存储数据。因此,修改视图通常通过 CREATE OR REPLACE VIEW 来实现,即重新定义视图,而不是修改现有视图。

Q: 如何让查询结果的列显示顺序与数据库中的列顺序不一样?

A: 在 SELECT 语句中按照你想要的顺序列出列名即可。

Q: HAVINGWHERE 的作用有何不同?什么时候 HAVING 的条件可以用 WHERE 条件来取代而结果不变?

A:

  • 作用对象不同WHERE 子句作用于基本表或视图,在分组前过滤行。HAVING 短语作用于分组后的结果,过滤分组。
  • 取代条件:当 HAVING 子句的条件不涉及聚合函数时,可以用 WHERE 子句替代,结果不变。

Q: 怎么理解“自然连接”,它与等值连接有什么不同?

A: 自然连接是一种特殊的等值连接。它会自动在两个关系中具有相同名称的列上进行等值连接,并且在结果中去除重复的属性列。等值连接则需要明确指定连接条件,并且不会自动去除重复列。

Q: 什么是“不相关子查询”?如何转换成连接查询?

A: 不相关子查询(或称独立子查询)是指子查询的执行不依赖于外部查询。它可以独立执行并将其结果作为外部查询的条件。通常,不相关子查询都可以转换为连接查询,这样通常效率更高。

Q: 如何理解 EXISTS 子查询的返回结果?

A: EXISTS 用于检查子查询是否返回任何行。如果子查询返回至少一行,EXISTS 的结果为 TRUE;如果子查询没有返回任何行,结果为 FALSE

Q: 两个查询在什么情况下可以执行 UNION 操作?

A: 两个查询的列数必须相同,并且对应列的数据类型必须兼容。

Q: 请问是否可以用插入和删除操作来实现更新操作,怎么做?

A: 可以。先执行 DELETE 操作删除旧记录,再执行 INSERT 操作插入新记录。但需要注意,这整个过程应该在一个事务中完成,以保证原子性,并且不能违背完整性约束。

Q: 对于一个数值类型字段,空值(NULL)和0值相同吗?

A: 不相同。0 是一个确切的数值,而 NULL 表示未知或不存在的值。

Q: 请解释 WITH CHECK OPTION 子句的作用。

A: WITH CHECK OPTION 用于视图,确保通过该视图进行的 INSERTUPDATE 操作所产生的新行或修改后的行,必须满足视图定义中的 WHERE 子句条件。

Q: 为什么说视图机制可以提供数据的逻辑独立性?

A: 视图作为一个抽象层,将应用程序与底层基本表的结构隔离开。当基本表的结构发生变化时,只要视图的定义不变,依赖于该视图的应用程序就无需修改,从而提供了数据的逻辑独立性。

数据库安全

Q: 分析一下数据库都有哪些不安全因素,给出实例。

A:

  • 非授权用户对数据库的恶意存取和破坏:例如,黑客通过SQL注入获取管理员权限。
  • 数据库中重要或敏感的数据被泄露:例如,内部员工窃取客户的个人信息。
  • 安全环境的脆弱性:例如,数据库服务器操作系统存在漏洞。

Q: 数据库安全性控制的常用方法有哪些,自主存取控制是如何保证数据库安全性的?

A:

  • 常用方法:用户标识与鉴别、存取控制(自主存取和强制存取)、视图机制、审计、数据加密。
  • 自主存取控制(DAC):通过 GRANTREVOKE 等SQL命令,用户可以控制自己创建的对象的访问权限,将权限授予其他用户或从其他用户收回。

Q: 什么是强制存取控制,它与自主存取控制的区别是什么?为什么强制存取控制可以更好地保证数据库安全性?

A:

  • 强制存取控制(MAC):系统为每个数据对象和用户主体都分配一个安全级别(标签)。用户只能访问其安全级别允许的数据。
  • 区别:在DAC中,对象的所有者可以决定谁有权访问。而在MAC中,访问控制由系统强制执行,基于固定的安全策略,用户无法更改。
  • 安全性:MAC提供了更高级别的安全性,因为它防止了数据从高安全级别泄露到低安全级别,即使用户拥有该数据。

Q: 什么是数据库审计?它是如何保障数据库安全性的?

A: 数据库审计是记录和监控数据库访问活动的过程。它通过记录谁、在什么时间、对什么对象执行了什么操作,来帮助发现潜在的安全威胁、定位安全事件、并进行事后追查取证,从而保障数据库的安全。

数据库完整性

Q: DBMS完整性控制机制的功能是什么?它由哪些部分组成?这几部分是如何配合工作的?

A:

  • 功能:确保数据库中的数据始终满足预定义的约束条件。
  • 组成
    1. 定义功能:提供定义完整性约束条件的机制。
    2. 检查功能:检查用户的操作是否会违背完整性约束。
    3. 违约处理:当操作违背约束时,采取相应的措施(如拒绝操作、级联操作等)。
  • 工作方式:首先通过定义功能设定规则,然后在数据操作时通过检查功能进行验证,如果发现违约,则启动违约处理机制。

Q: 说明参照完整性的定义方式,检查时机以及各类违约处理方式。

A:

  • 定义方式:在 CREATE TABLE 中使用 FOREIGN KEY 子句定义外键,并用 REFERENCES 子句指明其参照的主表和主键。
  • 检查时机:在对参照表(有外键的表)进行 INSERTUPDATE 操作,或者对被参照表(有主键的表)进行 DELETEUPDATE 操作时。
  • 违约处理方式
    • NO ACTION / RESTRICT:如果存在关联的参照表记录,则拒绝执行操作(默认)。
    • CASCADE:级联操作。删除或更新主表记录时,自动删除或更新参照表中的匹配记录。
    • SET NULL:删除或更新主表记录时,将参照表中匹配记录的外键列设置为 NULL
    • SET DEFAULT:删除或更新主表记录时,将参照表中匹配记录的外键列设置为默认值。

Q: 说明用户定义完整性的方法,检查时机以及各类违约处理方式。

A:

  • 方法:通过 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECK 等约束来定义。
  • 检查时机:在 INSERTUPDATEDELETE 等操作执行时。
  • 违约处理:通常是拒绝执行违反约束的操作,并返回错误信息。

Q: 断言的用途是什么?在学生-课程-选课数据库中,如何定义断言“每学期每个学生最多可以选修7门课”?

A:

  • 用途:断言(Assertion)是一种更通用的约束,可以定义涉及多个表或需要复杂逻辑的完整性规则。
  • 定义示例: ```sql – 首先,假设SC表有学期(TERM)字段 – ALTER TABLE SC ADD TERM VARCHAR2(10);

CREATE ASSERTION CNUM_ASSERTION CHECK ( NOT EXISTS ( SELECT Sno, TERM FROM SC GROUP BY Sno, TERM HAVING COUNT(Cno) > 7 ) );

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
**Q: 是否可以在一个表上定义多个触发器?如果可以,那么这些触发器的执行顺序是怎样的?**

A: 可以。对于同一事件(如 `BEFORE INSERT`),可以定义多个触发器。在Oracle中,默认的执行顺序是不确定的。如果需要指定顺序,可以使用 `FOLLOWS` 子句来定义它们的执行次序。

**Q: RDBMS定义完整性约束的方法有哪些?**

A:
1.  **实体完整性**:通过 `PRIMARY KEY` 约束实现。
2.  **参照完整性**:通过 `FOREIGN KEY` 约束实现。
3.  **用户定义完整性**:通过 `NOT NULL`、`UNIQUE`、`CHECK` 约束实现。
4.  **触发器(Trigger)**:可以实现更复杂的完整性规则。
5.  **断言(Assertion)**:定义全局的、跨表的约束(部分DBMS支持不佳)。

## 视图 (View) 与物化视图 (Materialized View)

### 视图 (View)

视图是一种**虚表**,它本身不存储数据,数据仍然存储在基表中。视图的主要目的是简化复杂的查询,并提供一定程度的数据安全性。

- **优点**:
    - 简化查询:将复杂的连接和计算封装在视图中。
    - 数据安全:可以只向用户暴露部分数据。
    - 逻辑独立性:应用程序可以建立在视图上,屏蔽基表结构的变化。
- **缺点**:
    - 性能:查询视图本质上是执行视图的定义语句,对于复杂的视图,性能可能不高。

### 物化视图 (Materialized View)

物化视图是存储了查询结果的**物理表**。它是普通视图的“物化”版本。

- **特点**:
    - **物理存储**:物化视图会占用磁盘空间来存储数据。
    - **性能提升**:对于复杂的、耗时的查询(如聚合、连接),预先计算并存储结果可以极大地提高查询性能。
    - **数据同步**:需要定期与基表进行数据同步,以保证数据的一致性。

- **刷新 (Refresh) 方式**:
    - `ON DEMAND` (按需刷新):手动执行刷新操作。
    - `ON COMMIT` (提交时刷新):一旦基表数据提交(`COMMIT`),立即自动刷新物化视图。

- **创建语法**:
```sql
CREATE MATERIALIZED VIEW mv_name
[BUILD IMMEDIATE | BUILD DEFERRED]
REFRESH [FAST | COMPLETE | FORCE | NEVER]
ON [DEMAND | COMMIT]
[START WITH (start_date)]
[NEXT (interval)]
AS
SELECT ... FROM ...;
  • BUILDIMMEDIATE 在创建时立即生成数据(默认),DEFERRED 创建时不生成数据。
  • REFRESH
    • FAST:增量刷新,只刷新基表发生变化的部分。需要创建物化视图日志。
    • COMPLETE:全量刷新,重新执行整个查询。
    • FORCE:尝试快速刷新,如果不行则执行完全刷新(默认)。
    • NEVER:不刷新。
  • ONDEMAND 按需刷新(默认),COMMIT 提交时刷新。
  • START WITH / NEXT:用于定时自动刷新。

事务 (Transaction)

事务的ACID特性

事务必须具备以下四个属性,简称 ACID

  1. 原子性 (Atomicity)
    • 事务是一个不可分割的完整操作单元。事务中的所有操作要么全部成功,要么全部失败回滚。
    • 场景:银行转账,A账户减100元和B账户加100元,这两个操作必须同时成功或同时失败。
  2. 一致性 (Consistency)
    • 事务必须使数据库从一个一致性状态转变到另一个一致性状态。事务执行的结果必须是使数据满足所有的完整性约束。
    • 场景:转账前后,银行系统总的资金额应该保持不变。
  3. 隔离性 (Isolation)
    • 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    • 场景:两个事务同时操作一个账户,一个在取钱,一个在存钱,它们的操作应该像串行执行一样,互不影响。
  4. 持久性 (Durability)
    • 一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作或故障不应该对其有任何影响。
    • 场景:事务提交后,即使系统崩溃,通过数据库的日志(如Redo Log)也能恢复数据,保证事务的结果不会丢失。

事务的开始和结束

  • 开始:事务通常在第一条DML(INSERT, UPDATE, DELETE)语句执行时隐式开始。
  • 查看事务
    1
    
    SELECT * FROM v$transaction;
    
  • 结束
    • COMMIT:提交事务。
    • ROLLBACK:回滚事务。
    • 执行 DDL 语句(如 CREATE, ALTER, DROP):隐式提交当前事务。
    • 执行 DCL 语句(如 GRANT, REVOKE):隐式提交当前事务。
    • 正常退出 SQL*Plus:提交事务。
    • 异常退出或系统崩溃:回滚事务。

锁 (Lock)

锁是实现并发控制的主要机制,用于管理对共享资源的并发访问。

锁的分类

  • 共享锁 (Share Lock, S锁):多个事务可以同时持有共享锁读取同一资源,但排斥其他事务的排它锁。
  • 排它锁 (Exclusive Lock, X锁):也称独占锁。如果一个事务获取了资源的排它锁,那么其他任何事务都不能再获取该资源的任何锁(共享或排它),直到该锁被释放。

Oracle中的锁类型

  1. DML锁 (Data Lock):用于保护数据。
    • TX (Transaction Lock):行级锁,在修改数据行时获取,防止其他事务修改同一行。
    • TM (Table Lock):表级锁,在对表进行DML操作时获取,以保护表的结构不被改变。
  2. DDL锁 (Dictionary Lock):用于保护数据库对象的结构,如表、索引的定义。

  3. 系统锁 (Internal Lock):保护数据库的内部结构,如数据文件等,由Oracle内部管理。

查看锁信息

  • 查看事务
    1
    
    SELECT * FROM v$transaction;
    
  • 查看锁: ```sql SELECT * FROM v$lock;
本文由作者按照 CC BY 4.0 进行授权