很多时候,我们可能需要将数据从一个现有的表复制到一个新的表中,例如,备份数据,或将一个环境中的数据复制到另一个环境中,就像出于测试目的所做的那样。在 SQL 中,通常会使用 CREATE TABLE 和 SELECT 语句,如下所示:
CREATE TABLE new_table; SELECT SELECT col, col2, col3 INTO new_table FROM existing_table;
在第一个语句中,数据库使用 CREATE TABLE 语句中指定的名创建一个新表。新表的结构由 SELECT 语句的结果集定义。然后,数据库将 SELECT 语句的结果填充到新表中。
尽管上述的过程可以完美地复制表,但是有一种更简单的方法,我们可以使用 CREATE TABLE 语句的变体将表复制到新表中!今天我们将在这里学习如何使用它。
介绍 CREATE TABLE AS SELECT 语句
CREATE TABLE 语句提供了一种方法从另一个表创建表。这种方法就是在 CREATE TABLE 语句的末尾添加 SELECT 语句。该语句的完整语法是这样:
CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;
这种方法只需一行代码,与我们在上面使用两个单独的语句所做的操作完全相同。
复制部分数据
由于 SELECT 语句支持你通常在 SQL 语句中使用的所有子句,包括 WHERE 和 ORDER BY 子句,因此我们可以通过在语句中提供条件来限制要复制的内容。以下是它的语法:
CREATE TABLE new_table SELECT col1, col2, col3 FROM existing_table WHERE conditions;
一些示例
以下是几个使用 Navicat Premium 作为数据库客户端的示例:
在最基本的形式中,CREATE TABLE AS SELECT 语句可以使用 SELECT All (*)按原样复制表。这是一个示例:
这是一个更复杂的示例,该示例仅从 orders 表中复制三列,并将行限制为具有最近的 requiredDate 的行:
我们可以看到新表只有三列被选中:
总结
毫无疑问,CREATE TABLE AS SELECT 语句提供了一种快速简便的方法来将数据从一个表复制到新表中。话虽如此,它确实有其局限性。首先,并不是所有的关系数据库都支持它。我知道 MySQL 和 SQL Server 支持,但是其他数据库可能支持也可能不支持。
还值得注意的是,CREATE TABLE AS SELECT 语句只是复制表及其数据。它不会复制与表关联的其他数据库对象,例如索引、主键约束、外键约束、触发器等。为了不仅复制数据,并同时复制与表关联的所有数据库对象,我们应该使用两个单独的语句,如下所示:
CREATE TABLE orders_copy LIKE orders; INSERT orders_copy SELECT * FROM orders;