课程
对于数据科学家和数据工程师来说,SQL 是从数据库中获取洞见的必备工具。数据库由多张表组成,SQL 也有不同的“方言”,从 PostgreSQL 到 Snowflake 不一而足。
在 SQL 中,数据定义语言(DDL)命令用于定义和管理数据库对象的结构。本文将通过一个电影数据库示例讲解 SQL 中的 DDL 命令。让我们开始吧!
什么是 SQL 中的 DDL 命令?
数据定义语言(DDL)命令使我能够在 SQL 中定义和管理架构(schema)。简而言之,SQL 中的架构是一份蓝图,用于规定数据在数据库中的组织方式,以及库内不同表之间关系的管理方式。
DDL 命令由多种具备不同功能的命令组成,我将按以下顺序介绍:
|
DDL 命令 |
描述 |
语法 |
|
|
创建一张表及其列,并指定各列的数据类型。 |
|
|
|
修改列名,以及添加或删除列。 |
|
|
|
更改表名。 |
|
|
|
为 SQL 代码添加说明,便于团队成员审阅。 |
|
|
|
在不删除表的情况下清空表中数据。 |
|
|
|
删除整张表及其数据。 |
|
SQL 中的 DDL 命令示例
现在我们已经对 DDL 命令及其用途有了基本了解,接下来用电影数据库来看看一些实用示例。
SQL 中的 CREATE 命令
当我需要创建新表时,会使用如下所示的 CREATE TABLE 命令:
CREATE TABLE table_name (
column_1 datatype,
column_2 datatype,
...,
column_n datatype
);
在上述示例中,我为列定义了不同的数据类型。SQL 支持多种数据类型,但最常见的通常是 STRING(文本)、INT(整数)、FLOAT(小数)和 DATE(日期)。
例如,如果我想创建表 actor,可以这样使用 CREATE TABLE:
CREATE TABLE actor (
actor_id String(32767),
first_name String(32767),
last_name String(32767),
last_update String(32767)
);
其中:
actor是表名actor_id是列名,其内容应为文本格式(String),且不超过 32767 个字符。first_name是列名,其内容应为文本格式(String),且不超过 32767 个字符。last_name是列名,其内容应为文本格式(String),且不超过 32767 个字符。last_update是列名,其内容应为文本格式(String),且不超过 32767 个字符。
执行查询后,新表会与其他表一同显示,此后我就可以随时查询它。
SQL 中的 ALTER 命令
使用 SQL 中的 ALTER,我可以在不新建并删除旧表的情况下更新一张表。组织往往有成千上万张表,掌握如何在不冒数据丢失风险的前提下保持数据最新至关重要。
需要注意的是,ALTER 有多种用法,包括:
- 在表中添加新列
- 重命名表中的列
- 修改表中的列
- 删除表中的列
ALTER 中的 ADD 命令
要使用 ALTER 添加新列,我们将 ALTER 与 ADD 命令组合使用,如下所示:
ALTER TABLE table_name ADD column_name datatype;
这里,我们在 actor 表中添加一个名为 nationality、数据类型为 STRING 的新列。
ALTER TABLE actor ADD nationality String(32767);
所有 SQL 中的 ALTER 命令都遵循类似的结构,使 SQL 成为一种自然易学、易于掌握的语言。
ALTER 中的 RENAME 命令
每当我需要更改列名时,会按如下方式在 ALTER 中使用 RENAME 命令:
ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;
例如,让我们将列名 last_name 改为 family_name,以避免它指代中间名还是姓氏的歧义。在这种情况下,我会执行以下查询:
ALTER TABLE actor RENAME COLUMN last_name TO family_name;
ALTER 中的 MODIFY 命令
数据类型定义了列的属性,并影响数据质量。例如,last_update 被设为 String(text),但数据显然表示日期和时间。
参考不同的数据类型并回看该列中的数据,合适的数据类型应为 TIMESTAMP。
适当更新列的数据类型,有助于借助其他SQL 命令按日期进行聚合和过滤。以下是我们在 SQL 中使用 MODIFY 的方式:
ALTER TABLE table_name ALTER COLUMN column_name datatype;
将上述思路应用到 last_update,我会使用以下查询:
ALTER TABLE actor ALTER COLUMN last_update TIMESTAMP;
ALTER 中的 DROP 命令
ALTER 的最后一个选项是删除列。我可能需要 DROP 某列的原因很多,包括但不限于:
- 信息不再相关,
- 信息重复(同一列在另一张表中也存在),
- 数据质量问题,
- 优化存储空间。
在 SQL 中删除列很简单,但请谨慎使用,因为删除操作并不总是可逆的。
ALTER TABLE table_name DROP COLUMN column_name;
删除列的命令与重命名列的命令看起来相似,但二者并不相同。重命名列会保留列中的数据,只是更改表头;而 DROP 会同时移除数据和表头,就像该列从未存在过一样。
在意识到 last_update 这一列除表明数据库是否刷新外几乎没有信息后,我决定使用以下查询将其删除:
ALTER TABLE actor DROP COLUMN last_update;
SQL 中的 RENAME 命令
RENAME 命令仅用于更改表名,不要与 ALTER 的 RENAME 能力混淆。实际上,更改表名的查询很简单:
RENAME TABLE old_table_name TO new_table_name;
表 actor 只包含姓名,并未包含有关演员的其他信息。因此,将表名更明确地改为:
SQL 中的 COMMENT在 SQL 中编写注释对于清晰与上下文至关重要,可让查询更易于理解与维护。它有助于解释复杂逻辑、记录变更并阐明某些选择的理由。在 SQL 中,您可以通过两种方式添加注释:
- 单行注释
- 多行注释
我们来看一下如何使用。
SQL 中的单行注释
单行注释通常紧随代码编写,如下所示。这样,我在阅读代码时就能同时看到同事的注释。
在 actor 表中,actor_id 和 last_update 语义不够直观,需要用注释加以说明。
CREATE TABLE actor (
actor_id String(32767), --unique identifier
first_name String(32767),
last_name String(32767),
last_update String(32767)--datetime of last update
);
SQL 中的注释与本文其他命令不同,因为它并不调用一个名为 COMMENT 的函数。两个连续的短横线且中间不留空格“--”表示注释的开始,其后的任何内容都不会被视为代码的一部分。
SQL 中的多行注释
当说明较长时,请使用多行注释。这更适合解释函数或提供详细上下文。要在 SQL 中添加多行注释,以 /* 开头并以 */ 结尾。SQL 引擎会忽略写在 /* 与 */ 之间的任何内容,并且不会作为查询的一部分执行。
/* Create a table `actor` with the actors’ names. Store first and last name, and keep track of any updates*/
CREATE TABLE actor (
actor_id String(32767), --unique internal identifier
first_name String(32767),
last_name String(32767),
last_update String(32767)--datetime of last update
);
SQL 中的 TRUNCATE 命令
清空(truncate)表与删除表并不相同。清空会移除所有数据,但保留表结构;而删除则会同时移除整张表及其结构。务必根据目的谨慎选择合适的命令。
TRUNCATE 在 Excel 中的等效操作类似于选中列名下的所有数据并按 Delete。在 SQL 中,我会这样写:
TRUNCATE TABLE table_name;
如果需要清空 actor,我会执行:
TRUNCATE TABLE actor;
结果将是一张只有列名而没有任何值的表。
SQL 中的 DROP 命令
与 TRUNCATE 相反,DDL 命令 DROP 会将表及其所有数据一并删除。执行此类命令时必须谨慎,因为此操作并不总是可逆。DROP 命令的结构与 TRUNCATE 类似:
DROP TABLE table_name;
因此,删除表 actor 只需:
DROP TABLE actor;
尽管不同的 SQL 方言在语法上可能略有差异,但无论您使用哪种 SQL 版本,以上 DDL 命令在大体上都是一致的。
DDL 命令与其他类型命令的对比
在上一节中,我解释了 DDL 命令如何定义表的结构,并在需要时更新其内容或属性。其他类型的SQL 命令可以用于选择、聚合、更新,甚至连接多张表,以获得不同的数据视图,每一类命令都有其特定目的。
|
命令 |
定义 |
用途 |
|
DQL |
数据查询语言 |
根据条件从数据库获取数据 |
|
DML |
数据操作语言 |
以比 ALTER 更丰富的功能来操作数据库中的表。 |
|
DCL |
数据控制语言 |
访问与权限的控制。 |
|
TCL |
事务控制语言 |
将通过 DML 命令所做的更改提交到数据库 |

在 DataCamp 提升您的 SQL 技能
良好的数据质量有赖于数据被清晰定义并结构化。SQL 中的 DDL 命令帮助数据从业者构建并维护结构化的数据库。其他 SQL 命令(如DML 命令)可用于查看、聚合、插入、过滤与合并数据。通过以下资源进一步学习 SQL 并提升您的技能:
- 了解用于操作 SQL 的不同类型命令
- 随手备一份SQL 速查表,熟悉最佳实践与常用命令。
- 使用我们的SQL 面试高频问题指南做好面试准备
