跳至内容

结构化查询语言/创建简单的表

来自维基教科书,开放的书籍,开放的世界


不仅仅是电子表格

[编辑 | 编辑源代码]

让我们从一个简单的例子开始。假设我们想要收集有关人员的信息 - 他们的姓名、出生日期、以及一些其他信息。起初,我们可能考虑在一个简单的电子表格中收集这些数据。但是,如果我们发展成一家成功的公司,需要处理数百万条这样的数据项呢?电子表格能否处理如此庞大的信息量?多个员工或程序能否同时插入新的数据、删除或更改数据?当然不行。这就是数据库管理系统 (DBMS) 相对于电子表格程序的显著优势之一:我们可以将表的结构想象成一个简单的电子表格,但对它的访问是内部组织的,从而使大量用户能够同时访问海量数据

总之,可以说,我们可以将表想象成一个针对大量数据和并发访问而优化的电子表格。

构思结构

[编辑 | 编辑源代码]

为了保持控制并确保良好的性能,表格需要遵守一些严格的规则。每个表格列都具有固定的名称,并且每列的值必须属于相同的类型。此外,强烈建议(虽然不是强制性的)每行可以通过唯一的值来标识。包含此标识值的列称为主键。在这本维基教科书中,我们始终将其命名为id。但每个人都可以自由选择其他名称。此外,我们可以使用多个列的组合作为主键。

在开始之前,我们需要确定以下问题

  1. 我们想要保存有关人员(在这个第一个示例中)的哪些数据?当然,有关人员的信息有很多(例如,眼睛颜色、星座等),但每个应用程序只需要其中一部分。我们需要确定哪些信息在我们特定的场景中感兴趣。
  2. 我们将为所选数据分配哪些名称?每个识别出的数据都将进入表格的一列,这列需要有一个名称。
  3. 数据的类型是什么?同一列中的所有数据值必须属于相同的类型。我们不能将任意字符串放入数据类型为DATE的列中。

在我们的示例中,我们决定保存名字、姓氏、出生日期、出生地点、社会保障号码以及人员的体重。显然,出生日期的数据类型为DATE,体重为数字,所有其他信息都是某种字符串。对于字符串,我们需要区分具有固定长度的字符串和长度通常在行之间差异很大的字符串。前者称为CHAR(<n>),其中<n>是固定长度,后者称为VARCHAR(<n>),其中<n>是最大长度。

确定决策

[编辑 | 编辑源代码]

之前做出的决策必须用机器可以理解的语言表达。这种语言是 SQL,它充当最终用户(或特殊程序)与 DBMS 之间的接口。

-- comment lines start with two consecutive minus signs '--'
CREATE TABLE person (
  -- define columns (name / type / default value / nullable)
  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,
  -- select one of the defined columns as the Primary Key and
  -- guess a meaningful name for the Primary Key constraint: 'person_pk' may be a good choice 
  CONSTRAINT person_pk PRIMARY KEY (id)
);

我们选择person作为表的名称,它包含七列。id列被分配为主键角色。我们可以在idweight列中专门存储数字,在firstnamelastnameplace_of_birth列中存储最大长度为 50 个字符的字符串,在date_of_birth列中存储日期,在ssn列中存储长度正好为 11 个字符的字符串。短语 NOT NULL 是idfirstnamelastnameweight定义的一部分。这意味着在每行中,这些四列都必须有值。在这些列中存储任何值都不可能,但允许使用 8 个字符的字符串“no value”或数字“0”,因为它们都是值。换句话说,可以省略date_of_birthplace_of_birthssn的值。

主键的定义被称为“约束”(稍后我们将了解更多类型的约束)。每个约束都应该有一个名称 - 在此示例中为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 命令。DELETE 命令仅删除行 - 可能删除所有行。但是,包含结构定义的表本身将保留下来。


华夏公益教科书