如何将数据插入 SQL

0 股票
0
0
0
0

介绍

结构化查询语言(简称 SQL)在向表中插入数据方面提供了极大的灵活性。例如,您可以使用 VALUES 关键字指定单个数据行,使用 SELECT 查询从现有表中复制整个数据集,还可以定义列,使 SQL 自动将数据插入其中。.

在本指南中,我们将探讨如何使用 INSERT INTO SQL 语法,通过这些方法向表中添加数据。.

先决条件

要遵循本指南,您需要一台安装了某种使用 SQL 的关系数据库管理系统 (RDBMS) 的计算机。本指南中的说明和示例已在以下环境下验证:

  • 一台运行 Ubuntu 20.04 的服务器,有一个具有管理权限的非 root 用户,并且配置了 UFW 防火墙。.
  • 服务器上已安装并配置了 MySQL 安全措施。.

您还需要一个数据库和一个表来练习插入数据。如果您还没有这些,可以阅读“连接到 MySQL 和设置示例数据库”部分,了解有关如何创建本指南示例中使用的数据库和表的更多详细信息。.

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

如果您的 SQL 数据库系统运行在远程服务器上,请从本地计算机通过 SSH 连接到您的服务器:

ssh sammy@your_server_ip

然后打开 MySQL 服务器提示符,并将 Sami 替换为您的 MySQL 用户名:

mysql -u sammy -p

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

CREATE DATABASE insertDB;

如果数据库创建成功,您将收到以下输出:

Query OK, 1 row affected (0.01 sec)

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

USE insertDB;
Output
Database changed

选择 insertDB 数据库后,在该数据库中创建一个表。例如,假设您拥有一家工厂,并且想要创建一个表来存储一些关于员工的信息。该表将包含以下五列:

  • 姓名:每位员工的姓名,使用 varchar 数据类型表示,最多 30 个字符。
  • 位置:此列存储每位员工的职位名称,同样使用 varchar 数据类型表示,最多 30 个字符。.
  • 部门:每位员工所在的部门,使用 varchar 数据类型表示,但最多只能包含 20 个字符。.
  • 时薪用于记录每位员工小时工资的列使用十进制数据类型,该列中的值最多为四位,其中两位数字位于小数点右侧。因此,该列允许的值范围为 -99.99 到 99.99。
  • 开始日期:每位员工的入职日期,使用日期数据类型表示。该类型的值必须符合 YYYY-MM-DD 格式。

创建一个名为 factoryEmployees 的表,包含以下五列:

CREATE TABLE factoryEmployees (
name varchar(30),
position varchar(30),
department varchar(20),
hourlyWage decimal(4,2),
startDate date
);

至此,您就可以继续阅读本指南的其余部分,开始学习如何使用 SQL 插入数据了。.

手动输入数据

SQL中插入数据的通用语法如下:

INSERT INTO table_name
(column1, column2, . . . columnN)
VALUES
(value1, value2, . . . valueN);

为了演示,请运行以下 INSERT INTO 语句,向 factoryEmployees 表中加载一行数据:

INSERT INTO factoryEmployees
(name, position, department, hourlyWage, startDate)
VALUES
('Agnes', 'thingamajig foreman', 'management', 26.50, '2017-05-01');
Output
Query OK, 1 row affected (0.00 sec)

该语句以关键字 INSERT INTO 开头,后跟要插入数据的表名。表名之后是要插入数据的列列表,列名用括号括起来。列列表之后是关键字 VALUES,后跟一组用括号括起来、以逗号分隔的值。.

列的排列顺序并不重要。重要的是,您提供的值的顺序必须与列的顺序一致。SQL 总是尝试将第一个值插入到列出的第一列,第二个值插入到下一列,依此类推。例如,以下 INSERT 语句添加了另一行数据,但列的排列顺序不同:

INSERT INTO factoryEmployees
(department, hourlyWage, startDate, name, position)
VALUES
('production', 15.59, '2018-04-28', 'Jim', 'widget tightener');
Output
Query OK, 1 row affected (0.00 sec)

如果值对齐不正确,SQL 可能会将数据插入错误的列。此外,如果任何值与列的数据类型冲突,SQL 也会抛出错误,例如:

INSERT INTO factoryEmployees
(name, hourlyWage, position, startDate, department)
VALUES
('Louise', 'doodad tester', 16.50, '2017-05-01', 'quality assurance');
Output
ERROR 1366 (HY000): Incorrect decimal value: 'doodad tester' for column 'hourlyWage' at row 1

请注意,虽然您必须为指定的每列提供值,但在添加新数据行时,您不一定需要指定表中的每一列。只要您要删除的列没有会导致此情况出错的约束(例如 NOT NULL),MySQL 就会将 NULL 值添加到未指定的列中:

INSERT INTO factoryEmployees
(name, position, hourlyWage)
VALUES
('Harry', 'whatzit engineer', 26.50);
Output
Query OK, 1 row affected (0.01 sec)

如果您要插入一行,并为表中的每一列都填写值,则完全不需要输入列名。但请记住,您输入的值必须与表定义中列的顺序保持一致。.

在这个例子中,列出的值是按照 factoryEmployee 表的 CREATE TABLE 语句中定义的列的顺序排列的:

INSERT INTO factoryEmployees
VALUES
('Marie', 'doodad welder', 'production', 27.88, '2018-03-29');
Output
Query OK, 1 row affected (0.00 sec)

您还可以一次性添加多条记录,只需用逗号分隔每一行即可,如下所示:

INSERT INTO factoryEmployees
VALUES
('Giles', 'gizmo inspector', 'quality assurance', 26.50, '2019-08-06'),
('Daphne', 'gizmo presser', 'production', 32.45, '2017-11-12'),
('Joan', 'whatzit analyst', 'quality assurance', 29.00, '2017-04-29');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

使用 SELECT 语句复制数据

与其逐行指定数据,不如使用 SELECT 查询将一个表中的多行数据复制并插入到另一个表中。.

此类操作的语法如下:

INSERT INTO table_A (col_A1, col_A2, col_A3)
SELECT col_B1, col_B2, col_B3
FROM table_B;

本示例语法没有在列列表后跟 VALUES 关键字,而是紧跟一个 SELECT 语句。本示例中的 SELECT 语句仅包含 FROM 子句,但任何有效的查询都适用。.

为了演示,请运行以下 CREATE TABLE 操作来创建一个名为 showroomEmployees 的新表。请注意,此表中列的名称和数据类型与上一节中使用的 factoryEmployees 表中的三列相同:

CREATE TABLE showroomEmployees (
name varchar(30),
hourlyWage decimal(4,2),
startDate date
);
Output
Query OK, 0 rows affected (0.02 sec)

现在,您可以通过在 INSERT INTO 语句中包含 SELECT 查询,将之前创建的 factoryEmployees 表中的一些数据加载到这个新表中。.

如果 SELECT 查询返回的列数和列顺序与目标表中的列数和列类型相同,并且数据类型也匹配,则可以从 INSERT INTO 语句中省略列列表:

INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name = 'Agnes';
Output
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

此操作中的 SELECT 语句包含一个 WHERE 子句,该子句使查询仅返回 factoryEmployees 表中 name 列包含值 Agnes 的行。由于源表中只有一行,因此只有这一行被复制到 showroomEmployees 表中。.

为了验证这一点,请运行以下查询以返回展厅员工表中的每一条记录:

SELECT * FROM showroomEmployees;
Output
+-------+------------+------------+
| name | hourlyWage | startDate |
+-------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
+-------+------------+------------+
1 row in set (0.00 sec)

您可以使用任何从源表中返回多行数据的查询来插入多行数据。例如,以下语句中的查询将返回 factoryEmployees 数据库中 name 列的值不以 J 开头的任何记录:

INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name NOT LIKE 'J%';
Output
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

要返回展厅员工表中的所有记录,请再次运行此查询:

SELECT * FROM showroomEmployees;
+--------+------------+------------+
| name | hourlyWage | startDate |
+--------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
| Agnes | 26.50 | 2017-05-01 |
| Harry | 26.50 | NULL |
| Marie | 27.88 | 2018-03-29 |
| Giles | 26.50 | 2019-08-06 |
| Daphne | 32.45 | 2017-11-12 |
+--------+------------+------------+
6 rows in set (0.00 sec)

请注意,有两行数据完全相同,名称列中都包含“Agnes”。每次执行包含 SELECT 的 INSERT INTO 语句时,SQL 都会将查询结果视为一组新的数据。除非您对表施加特定的约束或创建更精确的查询,否则添加此类数据时,数据库中必然会出现重复记录。.

自动插入信息

创建表时,您可以为列应用特定属性,使关系数据库管理系统自动填充数据。.

为了说明这一点,请运行以下语句来定义一个名为 interns 的表。这将创建一个名为 interns 的表,其中包含三列。在本例中,第一列 internID 存储的是 int 类型的数据。但请注意,它还包含 AUTO_INCREMENT 属性。此属性会使 SQL 自动为每一行生成一个唯一的数值,默认值为 1,然后每增加一条记录就递增 1。.

同样,第二列 section 包含关键字 DEFAULT。如果从 INSERT INTO 语句的列列表中删除 section,关系数据库管理系统 (RDBMS) 将自动插入默认值——在本例中为“production”。

CREATE TABLE interns (
internID int AUTO_INCREMENT PRIMARY KEY,
department varchar(20) DEFAULT 'production',
name varchar(30)
);

为了演示这些功能,请运行以下 INSERT INTO 语句,向 Interns 表中加载一些数据。此操作仅指定 Name 列的值:

INSERT INTO interns (name) VALUES ('Pierre'), ('Sheila'), ('Francois');
Output
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

然后运行以下查询以返回表中的每一条记录:

SELECT * FROM interns;
Output
+----------+------------+----------+
| internID | department | name |
+----------+------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
+----------+------------+----------+
3 rows in set (0.00 sec)

该输出表明,由于列定义,前面的 INSERT INTO 语句会向内部和外部部分添加值,即使它们没有被指定。.

要向节列添加除默认值之外的值,必须在 INSERT INTO 语句中指定该列,如下所示:

INSERT INTO interns (name, department)
VALUES
('Jacques', 'management'),
('Max', 'quality assurance'),
('Edith', 'management'),
('Daniel', DEFAULT);
Output
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0

请注意,本示例中提供的最后一行值包含关键字 DEFAULT 而不是字符串值。这会导致数据库插入默认值(‘production’):

SELECT * FROM interns;
Output
+----------+-------------------+----------+
| internID | department | name |
+----------+-------------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
| 4 | management | Jacques |
| 5 | quality assurance | Max |
| 6 | management | Edith |
| 7 | production | Daniel |
+----------+-------------------+----------+
7 rows in set (0.00 sec)

结果

通过阅读本指南,您学习了几种将数据插入表中的不同方法,包括使用 VALUES 关键字指定单个数据行、使用 SELECT 查询复制整个数据集以及定义 SQL 将自动插入数据的列。.

这里列出的命令应该适用于任何使用 SQL 的数据库管理系统。请注意,每个 SQL 数据库都使用其独特的语言实现,因此您应该参考数据库管理系统的文档,以获取有关 INSERT INTO 语句的处理方式及其可用选项的更完整说明。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢

战神2游戏剧情

引言:奎托斯,这位曾经的凡人战士,击败了战神阿瑞斯,成为了新的战神。然而……