SQL - RDBMS 概念
你好,有抱负的数据库爱好者们!我很高兴能成为你们在这激动人心的SQL和关系数据库管理系统(RDBMS)之旅中的向导。作为一个教授计算机科学多年(我们就说,我记得当软盘确实是软的时候)的人,我在这里用一种简单易懂的方式拆解这些概念,即使你之前从未编写过一行代码也能理解。所以,拿起你最喜欢的饮料,舒服地坐下来,让我们一起开始吧!
什么是RDBMS?
RDBMS代表关系数据库管理系统。我知道这听起来像是术语连篇,但你可以把它想象成你数据的数字文件柜。就像你如何组织物理文档到文件夹和文件柜中,RDBMS帮助你以结构化的方式组织和管理工作的大量信息。
“关系”这个词来自于RDBMS中的数据存储在可以相互关联的表中。想象你正在策划一个大型派对(因为谁不喜欢一个好的派对呢?)。你可能有一个来宾表,一个菜单项表,还有一个座位安排表。这些表都与你策划的派对相关,而RDBMS帮助你高效地管理和连接这些信息。
一些流行的RDBMS示例包括:
- MySQL
- PostgreSQL
- Oracle
- Microsoft SQL Server
每一个都有它自己的特点和功能,但它们都遵循我们将讨论的同样基本原理。
什么是表?
在RDBMS的世界中,表是魔法发生的地方。它是数据库的基本构建块。可以把表想象成电子表格或网格,你在这里存储特定类型的信息。
让我们为我们的虚构派对策划创建一个简单的表:
CREATE TABLE Guests (
GuestID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100),
AttendingStatus VARCHAR(20)
);
这段SQL代码创建了一个名为"Guests"的表,包含五个列。现在不用担心语法;我们稍后会讨论。重要的是要理解这个表将存储我们邀请的每个来宾的信息。
什么是字段?
字段是表中的一列,它持有特定的信息。在我们的Guests表中,我们有五个字段:
- GuestID
- FirstName
- LastName
- AttendingStatus
每个字段都有名称和数据类型。数据类型告诉数据库该字段可以存储什么类型的信息。例如,"GuestID"是INT(整数),因为我们用数字来识别我们的来宾,而"FirstName"是VARCHAR(可变长度字符字符串),因为名字由字母组成。
什么是记录或行?
记录,也称为行,是表中的单个条目。它包含了一个项目在所有字段中的所有信息。在我们的Guests表中,一个单独的记录可能看起来像这样:
INSERT INTO Guests (GuestID, FirstName, LastName, Email, AttendingStatus)
VALUES (1, 'John', 'Doe', '[email protected]', 'Confirmed');
这个SQL命令向我们的Guests表中添加了一个新记录。现在,让我们来分解它:
- GuestID: 1
- FirstName: John
- LastName: Doe
- Email: [email protected]
- AttendingStatus: Confirmed
每条记录代表我们派对策划数据库中的每个来宾。
什么是列?
列是一组垂直的数据值,所有的值都是同一类型。它实际上是查看字段的另一种方式。字段定义了数据的结构,而列是特定字段跨所有记录的实际数据值集合。
例如,如果我们表中有一百个来宾,"FirstName"列将包含所有一百个名字,每个来宾一个。
什么是NULL值?
啊,NULL - 许多初学者的噩梦!NULL不是零,不是空字符串,它是...嗯,它什么都不是。它表示值的缺失。
假设我们不确定John Doe是否参加我们的派对。我们可能会像这样更新我们的记录:
UPDATE Guests
SET AttendingStatus = NULL
WHERE GuestID = 1;
这将John的参加状态设置为NULL,表示我们还没有这个信息。
SQL约束
约束就像是你的数据库派对上的保镖。它们对表中的数据施加规则以保持准确性和可靠性。让我们看看一些常见的约束:
约束 | 描述 | 示例 |
---|---|---|
NOT NULL | 确保列不能有NULL值 | Email VARCHAR(100) NOT NULL |
UNIQUE | 确保列中的所有值都是不同的 | Email VARCHAR(100) UNIQUE |
PRIMARY KEY | NOT NULL和UNIQUE的结合。在表中唯一标识每条记录 | GuestID INT PRIMARY KEY |
FOREIGN KEY | 确保两个表之间的引用完整性 | PartyID INT, FOREIGN KEY (PartyID) REFERENCES Parties(PartyID) |
CHECK | 确保列中的所有值满足特定条件 | CHECK (AttendingStatus IN ('Confirmed', 'Declined', 'Pending')) |
让我们修改我们的Guests表来包含一些这些约束:
CREATE TABLE Guests (
GuestID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(100) UNIQUE NOT NULL,
AttendingStatus VARCHAR(20) CHECK (AttendingStatus IN ('Confirmed', 'Declined', 'Pending'))
);
现在我们的表更加健壮,更不容易出现数据输入错误!
数据完整性
数据完整性是关于在数据的整个生命周期中保持和确保数据的准确性和一致性。这就像在开始烹饪之前确保你所有的食材都是新鲜且正确计量的。
数据完整性有四种类型:
- 实体完整性:确保表中的每行都是唯一可识别的。这通常通过主键实现。
- 引用完整性:确保表之间的关系保持一致。这是通过外键管理的。
- 域完整性:确保列中的所有值都落在定义的域(可接受值的集合)内。
- 用户定义完整性:任何特定于你的业务或应用的规则或约束。
我们带有约束的修改后的Guests表是一个实现数据完整性的好例子。
数据库规范化
数据库规范化就像是整理你的房间 - 它是关于有效地组织你的数据并消除冗余。它是一种根据一系列正规形式来结构化关系数据库的技术,以减少数据冗余并提高数据完整性。
有几种正规形式,但最常用的是:
- 第一正规形式(1NF):每个表单元格应包含单个值,每个记录需要是唯一的。
- 第二正规形式(2NF):表处于1NF,并且所有非键属性完全依赖于主键。
- 第三正规形式(3NF):表处于2NF,并且所有属性只依赖于主键。
例如,我们可能会将单个的"Parties"表,其中包含重复的来宾信息,拆分为两个表:"Parties"和"Guests",并在它们之间建立关系。这减少了冗余,使我们的数据库更加高效。
就这样,伙计们!我们已经涵盖了SQL和RDBMS的基本概念。记住,学习数据库是一个旅程,而不是一个目的地。一开始可能会觉得压倒性,但只要有练习和坚持,你很快就会像一个专业人士一样管理数据。
在我们结束之前,我想起了伟大的计算机科学家Grace Hopper的一句话:“语言中最危险的短语是,'我们一直都是这样做的'。”所以,不要害怕实验,犯错误,找到你自己的理解这些概念的方式。快乐编码,愿你的查询总是返回你期望的结果!
Credits: Image by storyset