超越电子表格

让我们从一个简单的例子开始。假设我们想收集关于人们的信息——他们的姓名、出生地以及其他一些项目。一开始我们可能会考虑在一个简单的电子表格中收集这些数据。但如果我们发展成为一家成功的公司,并且需要处理数百万条这些数据项怎么办?电子表格能应对如此庞大的信息量吗?是否可以让多个员工或程序同时插入、删除或更改数据?当然不行。这也是数据库管理系统(DBMS)相对于电子表格程序的一个显著优势:我们可以将表的结构想象成一个简单的电子表格——但对其的访问在内部被组织成能够让大量用户同时访问大量数据的方式。

总而言之,可以说,表格可以被想象为一个针对大批量数据和并发访问进行了优化的电子表格。

设计结构

为了保持控制并确保良好的性能,表格必须遵守一些严格的规则。每个表的列都有固定的名称,每列的值必须属于相同的数据类型。此外,强烈建议——尽管不是强制性的——每一行可以通过一个唯一的值来标识。存储该标识值的列称为主键。在本维基书中,我们始终将其命名为id。但每个人都可以自由选择不同的名称。此外,我们也可以使用多个列的组合作为主键。

一开始,我们必须决定以下问题:

  1. 我们想保存关于人(在这个例子中)的哪些数据?当然,关于人的信息有很多(例如,眼睛颜色、星座等),但每个应用程序只需要其中的一部分。我们必须决定在具体上下文中哪些信息是有意义的。
  2. 我们为选定的数据赋予什么名称?每个识别出的数据项都放入表的一个列中,该列需要有一个名称。
  3. 数据的类型是什么?同一列中的所有数据值必须属于相同的类型。我们不能将任意字符串放入数据类型为DATE的列中。

在我们的例子中,我们决定保存名字、姓氏、出生日期和出生地、社会保障号码以及个人体重。显然,出生日期的数据类型是DATE,体重是数字,其他所有数据都是某种字符串。对于字符串,有固定长度和长度通常因行而异的区分。前者命名为CHAR(),其中是固定长度,后者命名为VARCHAR(),其中是最大长度。

确定决策

之前做出的决策必须用机器可理解的语言来表达。这种语言就是SQL,它作为最终用户——或特殊程序——与DBMS之间的接口。

-- 注释行以两个连续的减号 '--' 开始
CREATE TABLE person (
  -- 定义列(名称 / 类型 / 默认值 / 可为空)
  id             DECIMAL      NOT NULL,
  firstname      VARCHAR(50)  NOT NULL,
  lastname       VARCHAR(50)  NOT NULL,
  date_of_birth  DATE,
  place_of_birth VARCHAR(50),
  ssn            CHAR(11),
  weight         DECIMAL DEFAULT 0 NOT NULL,
  -- 选择一个已定义的列作为主键,并
  -- 为主键约束猜一个有意义的名称:'person_pk' 可能是一个不错的选择
  CONSTRAINT person_pk PRIMARY KEY (id)
);

我们选择“person”作为表的名称,该表由七列组成。id列被指定为主键。我们可以在id和weight列中存储仅由数字组成的值,在firstname、lastname和place_of_birth列中存储长度最多为50个字符的字符串,在date_of_birth列中存储日期,在ssn列中存储正好十一字符的字符串。短语NOT NULL是id、firstname、lastname和weight的定义的一部分。这意味着在每一行中,这四列必须有一个值。不能在这些列中存储空值——但允许存储8字符的字符串 '无值' 或数字 '0',因为它们是有效值。或者换句话说:可以省略date_of_birth、place_of_birth和ssn的值。

主键的定义称为“约束”(稍后我们将了解更多种类的约束)。每个约束都应该有一个名称——在此例中是person_pk。

结果

执行上述 'CREATE TABLE' 命令后,DBMS创建了一个对象,可以将其想象为如下的维基表格:

id | firstname | lastname | date_of_birth | place_of_birth | ssn | weight

该维基表格显示了4行。第一行代表列的名称——而不是值!接下来的3行仅用于演示目的。但在数据库表中,目前没有任何行!它完全是空的,根本没有行,没有任何值!数据库中唯一存在的是表的结构。

回到起点

也许有一天我们想删除这个表。为此,我们可以使用DROP命令。它会完全删除表:所有数据和完整的结构都会被丢弃。

DROP TABLE person;

不要将DROP命令与DELETE命令混淆,后者将在下一页介绍。DELETE命令仅删除行——可能是全部行。然而,保留了表本身,即存储结构定义的部分。


您可以根据需要复制/粘贴这些示例,以帮助您学习和实践SQL。

Last modified: Tuesday, 28 January 2025, 12:18 PM