SQL Server 插入数据详解:使用 INSERT
插入单条或多条记录及 INSERT SELECT
在 SQL Server 中,插入数据是对数据库操作的核心之一。在日常开发和数据处理过程中,向数据库表中插入数据是一个常见且重要的操作。本文将详细讲解如何在 SQL Server 中使用 INSERT
语句插入单条或多条记录,同时介绍 INSERT SELECT
语法及其在插入数据中的应用场景。
1. INSERT
语句简介
INSERT
语句用于向数据库表中插入新的数据行。根据使用场景的不同,我们可以使用 INSERT INTO
语句插入单条或多条记录,或者将查询结果插入到目标表中。
INSERT INTO
语法的基本结构如下:
INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);
表名
:要插入数据的目标表。列1, 列2, ...
:表中的列名,可以选择插入部分列的数据。VALUES
:插入的实际值,与列名一一对应。
2. 插入单条记录
向数据库中插入单条记录是最常见的操作。通过 INSERT INTO
语句,我们可以在指定表的指定列中插入一行数据。
示例 1:插入单条记录
假设我们有一个名为 Employees
的表,表结构如下:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Salary DECIMAL(18, 2),
HireDate DATETIME
);
我们可以使用 INSERT INTO
语句插入一名新员工的数据:
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, HireDate)
VALUES (101, 'John', 'Doe', 55000.00, '2024-01-15');
解释:
- 我们向
Employees
表中插入了 5 个值,分别对应EmployeeID
,FirstName
,LastName
,Salary
, 和HireDate
列。
示例 2:插入部分列的数据
在实际应用中,并不总是需要向所有列插入数据。例如,如果某些列允许为空(NULL
),或者具有默认值,我们可以只为特定的列插入数据:
INSERT INTO Employees (EmployeeID, FirstName, LastName)
VALUES (102, 'Jane', 'Smith');
解释:
- 在此例中,我们只为
EmployeeID
,FirstName
, 和LastName
插入了值,Salary
和HireDate
列将使用其默认值或NULL
。
示例 3:不指定列名的插入
如果我们希望插入所有列的数据,并且所有列的数据顺序与表中的列顺序一致,我们可以省略列名。此时 VALUES
中的值顺序必须与表的列顺序一致:
INSERT INTO Employees
VALUES (103, 'Michael', 'Jordan', 60000.00, '2024-05-01');
注意:
- 不推荐省略列名的写法,因为表结构可能发生变化,导致插入的数据与列不匹配。
3. 插入多条记录
在 SQL Server 中,可以使用 INSERT INTO ... VALUES
的方式一次插入多条记录。在 VALUES
之后,可以添加多组值,每组值用逗号隔开。
示例 4:插入多条记录
我们可以在一次操作中插入多名员工的数据:
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, HireDate)
VALUES
(104, 'Emily', 'Blunt', 52000.00, '2024-02-20'),
(105, 'Chris', 'Evans', 58000.00, '2024-03-10'),
(106, 'Scarlett', 'Johansson', 61000.00, '2024-04-15');
解释:
- 此语句一次性向
Employees
表中插入了 3 条记录,每条记录分别包含 5 个值。
4. 使用 INSERT SELECT
插入查询结果
INSERT SELECT
语句允许我们将查询的结果插入到另一个表中。这在需要从一个表导入数据到另一个表时非常有用。
INSERT SELECT
的语法结构如下:
INSERT INTO 目标表名 (列1, 列2, ...)
SELECT 列1, 列2, ...
FROM 源表
WHERE 条件;
示例 5:将查询结果插入到另一张表
假设我们有一个名为 NewEmployees
的表,我们可以将 Employees
表中的部分员工信息插入到 NewEmployees
表中:
CREATE TABLE NewEmployees (
EmployeeID INT,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Salary DECIMAL(18, 2)
);
INSERT INTO NewEmployees (EmployeeID, FirstName, LastName, Salary)
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Salary > 55000;
解释:
- 我们从
Employees
表中选取工资大于 55000 的员工,并将其插入到NewEmployees
表中。 - 这种方法非常适合在需要将一部分数据迁移到另一个表时使用。
示例 6:将所有数据从一个表复制到另一个表
我们还可以通过 INSERT SELECT
语句将一个表的所有数据复制到另一个表中:
INSERT INTO NewEmployees (EmployeeID, FirstName, LastName, Salary)
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees;
5. INSERT INTO
的注意事项
5.1 自增列(IDENTITY 列)
如果表中包含自增列(例如主键 ID
列),我们通常不需要为自增列指定值,SQL Server 会自动为其生成值。
假设 EmployeeID
是一个自增列,我们可以这样插入数据:
CREATE TABLE Employees (
EmployeeID INT IDENTITY(1,1), -- 自增列
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Salary DECIMAL(18, 2),
HireDate DATETIME
);
INSERT INTO Employees (FirstName, LastName, Salary, HireDate)
VALUES ('Tom', 'Holland', 54000.00, '2024-06-01');
5.2 插入数据与数据类型
插入的数据必须与列的数据类型相匹配。例如,如果 Salary
列的数据类型是 DECIMAL(18, 2)
,则插入的数据必须为数值类型,且小数点后最多保留两位。
错误示例:
-- 错误:插入的字符串不符合 DECIMAL 类型
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, HireDate)
VALUES (107, 'Peter', 'Parker', 'FiftyThousand', '2024-06-15');
正确示例:
-- 正确:插入的数值符合 DECIMAL 类型
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, HireDate)
VALUES (107, 'Peter', 'Parker', 50000.00, '2024-06-15');
6. 使用 OUTPUT
返回插入的数据
有时我们在插入数据后希望知道哪些数据已成功插入。这时可以使用 OUTPUT
关键字,它可以在 INSERT
操作后返回插入的值。
示例 7:使用 OUTPUT
返回插入的值
INSERT INTO Employees (FirstName, LastName, Salary, HireDate)
OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName
VALUES ('Bruce', 'Wayne', 70000.00, '2024-07-01');
解释:
OUTPUT
关键字可以返回插入操作中被插入的值。这里我们返回了插入的EmployeeID
,FirstName
, 和LastName
。
7. 总结
本文详细介绍了 SQL Server 中 INSERT
语句的使用方法,包括插入单条和多条记录、使用 INSERT SELECT
插入查询结果,以及如何通过 OUTPUT
返回插入的数据。在日常开发中,正确使用 INSERT
语句能够有效提高数据的处理效率,同时确保数据的完整性和准确性。
通过 INSERT
语句的灵活运用,我们不仅可以轻松地向数据库中添加数据,还可以实现数据迁移和数据备份等复杂操作。掌握这些技术,将为你在数据库操作中带来更多的灵活性和便利。