如何使用SQL系列 之 如何在SQL中创建和管理表

简介

表是SQL数据库的主要组织结构。它们由若干列组成,反映表中每一行或每条记录的各个属性。这样的数据组织的一个基本方面,重要的是人与关系数据库了解如何创建、更改和删除表。

在本指南中,我们将介绍如何用SQL创建表,以及如何修改和删除现有的表。

前期准备

为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。

注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。

你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。

连接到MySQL并设置一个示例数据库

如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:

ssh sammy@your_server_ip

然后打开MySQL服务器提示符,将==sammy==替换为你的MySQL用户账户的名称:

mysql -u sammy -p

创建一个名为tablesDB的数据库:

CREATE DATABASE tablesDB;

如果数据库成功创建,您将收到这样的输出:

OutputQuery OK, 1 row affected (0.01 sec)

要选择tablesDB数据库,运行以下USE语句:

USE tablesDB;
OutputDatabase changed

有了这些,你就可以开始学习如何在SQL中创建和管理表了。

创建表结构

要在SQL中创建表,使用CREATE TABLE命令,后面跟上你想要的表名:

CREATE TABLE table_name;

请注意,与所有SQL语句一样,CREATE TABLE语句必须以分号(;)结尾。

这个示例语法将创建一个没有任何列的空表。要创建一个包含多列的表,在表名后面加上一列列名及其对应的数据类型和约束,用括号括起来,用逗号分隔:

CREATE TABLE table_name (
column1_name column1_data_type,
column2_name column2_data_type,
. . .
columnN_name columnN_data_type
);

例如,假设你想创建一个表来记录纽约市最喜欢的公园的一些信息。在决定要记录每个公园的哪些属性之后,接下来要确定每个属性的列名以及相应的数据类型:

  • parkName:每个公园的名称。公园名称的长度有很大的差异,所以varchar数据类型的最大长度为30字符是合适的。
  • yearBuilt:公园建成的年份。虽然MySQL有year数据类型,但只允许从19012155的值。纽约市有几个公园建于1901年之前,所以你可以使用int数据类型。
  • firstVisit:第一次参观每个公园的日期。MySQL有date数据类型,你可以用它来表示这一列。它以YYYY-MM-DD的格式存储数据。
  • lastVisit:最近访问每个公园的日期。同样,你可以使用date类型。

要创建一个名为faveParks的表,其中的列具有这些名称和数据类型,你可以运行以下命令:

CREATE TABLE faveParks (
parkName varchar(30),
yearBuilt int,
firstVisit date,
lastVisit date
);
OutputQuery OK, 0 rows affected (0.01 sec)

请记住,这只是创建了表的结构,因为没有向表中添加任何数据。

你也可以使用CREATE TABLE AS语法从现有表中创建新表:

CREATE TABLE new_table_name AS (
SELECT column1, column2, . . . columnN
FROM old_table_name
);

在新表的名称后面跟着一列列及其数据类型,你在它后面跟着AS,然后在括号中有一个SELECT语句,该语句返回原始表中你想复制到新表中的任何列和数据。

注意,如果原表的列保存了任何数据,那么所有这些数据也会被复制到新表中。此外,为了清晰起见,这个示例语法包含了一个只包含必要的FROM子句的SELECT查询。然而,任何有效的SELECT语句都可以在这个地方工作。

为了说明,下面的命令从之前创建的faveParks表中的两列创建了一个名为parkInfo的表:

CREATE TABLE parkInfo AS (
SELECT parkName, yearBuilt
FROM faveParks
);
OutputQuery OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

如果faveParks表有任何数据,数据从其parkNameyearBuilt列将被复制到parkInfo表,但在这种情况下两个表将是空的。

如果尝试使用已存在表的名称创建表,将导致错误:

CREATE TABLE parkInfo (
name varchar(30),
squareFootage int,
designer varchar(30)
);
OutputERROR 1050 (42S01): Table 'parkInfo' already exists

为了避免出现此错误,您可以在CREATE TABLE命令中包含IF NOT EXISTS选项。这将告诉数据库检查指定名称的数据库是否已经存在,如果存在,则发出警告而不是错误:

CREATE TABLE IF NOT EXISTS parkInfo (
name varchar(30),
squareFootage int,
designer varchar(30)
);
OutputQuery OK, 0 rows affected, 1 warning (0.00 sec)

这个命令仍然无法创建新表,因为名为parkInfo的表仍然存在。但是请注意,这个输出表明CREATE TABLE语句导致了一个警告。要查看警告消息,请运行诊断SHOW WARNINGS语句:

SHOW WARNINGS;
Output| Level | Code | Message                         |
+-------+------+---------------------------------+
| Note  | 1050 | Table 'parkInfo' already exists |
+-------+------+---------------------------------+
1 row in set (0.00 sec)

正如这个输出所示,你之前收到的相同错误已经被注册为警告,因为你包含了IF NOT EXISTS选项。这在某些情况下很有用,比如运行事务时;错误将导致整个事务失败,而警告将意味着只有导致它的语句会失败。

修改表结构

有时您可能需要更改表的定义。这与更新表中的数据不同。相反,它涉及到改变表本身的结构。要做到这一点,你需要使用ALTER TABLE语法:

ALTER TABLE table_name ALTER_OPTION sub_options . . . ;

开始的ALTER TABLE语句之后,您指定的名称表你想改变。然后,传入RDBMS中可用的选项,执行你想要的修改。

例如,用户可能想要重命名表、添加新列、删除旧列或更改列的定义。您可以继续阅读并在前面创建表一节中创建的faveParks表上练习这些示例。

改变faveParks表的名称,您可以使用“重命名”语法。下面的例子将faveNYCParks表的名字改为faveNYCParks:

警告:重命名表时要小心。如果应用程序使用该表或数据库中的其他表引用它,那么这样做可能会导致问题。

ALTER TABLE faveParks RENAME TO faveNYCParks;
OutputQuery OK, 0 rows affected (0.01 sec)

要添加新列,需要传入ADD COLUMN选项。下面的例子在faveNYCParks表中添加了一个名为borough的列,该列包含varchar类型的数据,但最大长度为20个字符:

ALTER TABLE faveNYCParks ADD COLUMN borough varchar(20);
OutputQuery OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

要从表中删除一列及其包含的任何数据,你可以使用DROP table 语法。这个示例命令删除borough列:

ALTER TABLE faveNYCParks DROP COLUMN borough;

许多SQL实现允许你使用ALTER TABLE来更改列的定义。下面的例子使用了MySQL的MODIFY COLUMN子句,将yearBuilt列的数据类型改为smallint而不是原来的int:

ALTER TABLE faveNYCParks MODIFY COLUMN yearBuilt smallint;

请注意,每个RDBMS都有不同的选项,可以通过ALTER TABLE语句更改什么。为了全面了解你可以用ALTER TABLE做什么,你应该查阅你的RDBMS的官方文档,了解它有哪些ALTER TABLE选项。

以下是几个流行的开源数据库的官方文档:

  • MySQL ALTER TABLE文档
  • PostgreSQL ALTER TABLE文档
  • SQLite ALTER TABLE文档

删除表结构

要删除一张表及其所有数据,使用DROP TABLE语法:

警告:运行DROP TABLE命令时要小心,因为它将永久删除表及其所有数据。

DROP TABLE table_name;

你可以使用DROP语句删除多个表,用逗号和空格分隔表名,如下所示:

DROP TABLE table1, table2, table3;

为了说明,下面的命令将删除本文前面创建的faveNYCParksparkInfo表:

DROP TABLE IF EXISTS faveNYCParks, parkInfo;

注意,这个例子包含了IF EXISTS选项。这与CREATE TABLE中可用的IF NOT EXISTS选项的功能相反。在这种情况下,如果指定的表不存在,IF EXISTS将导致DROP TABLE语句返回一个警告而不是错误信息。

总结

通过阅读本指南,您了解了如何在基于sql的数据库中创建、更改和删除表。这里列出的命令应该适用于任何使用SQL的数据库管理系统。记住,每种SQL数据库都使用自己独特的语言实现,因此要更完整地描述每个命令及其所有选项,应该查阅相应DBMS的官方文档。

你可能感兴趣的:(SQL,sql,数据库)