在前面的部分中,我们考虑了从先前创建的表中检索数据的工作。现在是时候弄清楚如何创建/删除表、添加新记录和删除旧记录了。
为此,SQL 中有如下运算符:
让我们开始通过 INSERT 运算符来熟悉这组运算符。
顾名思义,INSERT INTO 运算符用于将行插入(添加)到数据库表中。
添加可以通过多种方式完成:
因此,要向表中添加新行,我们需要指定表名,列出列名,并使用 INSERT INTO table_name(field1, field2 ...) VALUES (value1, value2 ...) 构造。让我们考虑一个例子。
INSERT INTO Sellers (ID, Address, City, Seller_name, Country)
VALUES ('6', '1st Street', 'Los Angeles', 'Harry Monroe', 'USA')
您还可以更改列名的顺序,但同时需要更改VALUES参数中值的顺序。
在前面的示例中,当使用 INSERT 运算符时,我们显式指定了表列的名称。使用这种语法,我们可以跳过一些列。这意味着您为某些列输入值,而不为其他列提供值。例子:
INSERT INTO Sellers (ID, City, Seller_name)
VALUES ('6', 'Los Angeles', 'Harry Monroe')
在这个例子中,我们没有为Address和Country两列指定值。如果允许您定义表,您可以从 aaa 语句中排除某些列。在这种情况下,必须满足以下条件之一:该列被定义为允许空值(没有任何值)或在表定义中指定了默认值。这意味着如果未指定值,则将使用默认值。如果您从表中省略一列,该列不允许 NULL 值出现在其行中,并且没有定义默认使用的值,则 DBMS 将发出错误消息,并且不会添加该行。
在前面的示例中,我们通过在查询中手动键入数据将数据插入到表中。然而,如果我们想从另一个表插入数据,INSERT INTO 运算符允许我们自动执行此过程。为此,SQL 中有这样的结构: INSERT INTO ... SELECT ... 。这种设计允许您同时从一个表中选择数据并将它们插入到另一个表中。假设我们有另一个表 Sellers_EU,其中包含我们产品在欧洲的卖家列表,我们需要将它们添加到通用表 Sellers 中。这些表的结构是相同的(相同的列数和相同的名称),但数据不同。为此,我们可以编写以下查询:
INSERT INTO Sellers (ID, Address, City, Seller_name, Country)
SELECT ID, Address, City, Seller_name, Country
FROM Sellers_EU
需要注意的是内部键的值不要重复(ID字段),否则会出错。 SELECT 语句还可以包含 WHERE 子句来过滤数据。还应该注意的是,DBMS 并不关心 SELECT 运算符中包含的列的名称,它只关心它们所在位置的顺序。因此,无论字段名称如何,通过 SELECT 选择的第一个指定列中的数据在任何情况下都将填充到 INSERT INTO 运算符之后指定的 Sellers 表的第一列中。
通常,在使用数据库时,需要创建任何表的副本以进行备份或修改。为了在 SQL 中创建表的完整副本,提供了单独的运算符 SELECT INTO。例如,我们需要创建表Sellers的副本,我们需要编写如下查询:
SELECT * INTO Sellers_new
FROM Sellers
与之前的构造 INSERT INTO ... SELECT ... 不同,当将数据添加到现有表时,构造 SELECT ... INTO ... FROM ... 将数据复制到新表。也可以说,第一个建筑导入数据,第二个建筑导出数据。
当使用结构 SELECT ... INTO ... FROM ... 时,应考虑以下因素: