在上一章,我们像建筑师一样,用 CREATE TABLE 命令搭建好了 friends 表的“骨架”。现在,这个骨架是空的,没有灵魂。
是时候扮演“造物主”的角色,向表里注入生命了!这一章,我们的核心任务就是学习 INSERT 命令,把实实在在的数据填充到我们的表中。
准备好迎接你的第一批“数据朋友”了吗?
准备工作:重建friends表
如果你在上一章结尾尝试了 DROP TABLE 命令,那么 friends 表可能已经不在了。别担心,我们再把它建起来。
确保你已经连接到了 my_first_db 数据库 (\c my_first_db),然后执行:
CREATE TABLE friends (
id INT,
name VARCHAR(50),
birthday DATE,
years_known INT
);
好,我们的空房子又回来了!
5.1 单行插入:你的第一个朋友
INSERT 的最基本用法,就是一次往表里添加一行数据。
语法结构 非常直观:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
- INSERT INTO table_name: 指定要向哪张表里插入数据。
- (column1, column2, ...): 列出你要为哪些列提供值。
- VALUES (value1, value2, ...): 提供与前面列一一对应的具体值。
动手时间! 让我们来添加第一个朋友,“老王”。
INSERT INTO friends (id, name, birthday, years_known)
VALUES (1, '老王', '1990-05-20', 5);
代码解读 :
- 我们向 friends 表插入数据。
- 指定了要填充的 id, name, birthday, years_known 四个列。
- 对应地,提供了值 1, '老王', '1990-05-20', 5。
注意 :
- 文本(VARCHAR)和日期(DATE)类型的值,需要用单引号 ' ' 括起来。
- 数字(INT)类型的值,直接写数字即可。
- 列的顺序和值的顺序必须严格对应!
执行这条 SQL!如果成功,你会看到 INSERT 0 1 这样的返回信息,意思是成功插入了 1 行。
怎么验证?
我们暂时用一个简单的 SELECT 语句来查看表里的所有内容(SELECT 是下一章的主角,这里先偷看一下):
SELECT * FROM friends;
你应该能看到老王的信息已经被成功记录在案了!
id | name | birthday | years_known
----+------+------------+-------------
1 | 老王 | 1990-05-20 | 5
(1 row)
5.2 多行插入:朋友们,一起来!
一次只加一个朋友太慢了!INSERT 命令也支持一次性插入多行数据,效率更高。
只需要在 VALUES 后面,用逗号 , 分隔开每一行的数据即可。
动手时间! 我们再把“小李”和“张三”也加进来。
INSERT INTO friends (id, name, birthday, years_known)
VALUES
(2, '小李', '1992-08-15', 3),
(3, '张三', '1988-01-30', 10);
执行它!返回的信息应该是 INSERT 0 2。
再次用 SELECT * FROM friends; 查看,你会发现,现在你的朋友列表热闹起来了!
id | name | birthday | years_known
----+------+------------+-------------
1 | 老王 | 1990-05-20 | 5
2 | 小李 | 1992-08-15 | 3
3 | 张三 | 1988-01-30 | 10
(3 rows)
5.3 从另一张表复制数据 (高级技巧)
这个技巧现在可能用不上,但非常有用,先了解一下。
想象一下,你还有一张 old_friends 表,你想把里面的所有朋友都迁移到新的 friends 表里。你不需要先把数据查出来再一行行 INSERT,可以直接用 INSERT ... SELECT ... 语句。
语法结构:
INSERT INTO target_table (column1, column2)
SELECT column_a, column_b FROM source_table
WHERE some_condition;
这个命令会执行 SELECT 查询,然后把查询出的结果直接插入到 target_table 中。这在数据迁移和ETL(数据抽取、转换、加载)工作中是家常便饭。
一个常见的简写方式
如果你插入数据时,提供的值的顺序和数量与 CREATE TABLE 时定义的列的顺序和数量完全一致,那么你可以省略掉列名列表。
比如,下面这两种写法是等价的:
-- 标准写法 (推荐 )
INSERT INTO friends (id, name, birthday, years_known)
VALUES (4, '赵四', '1978-11-11', 15);
-- 简写 (不推荐 )
INSERT INTO friends
VALUES (4, '赵四', '1978-11-11', 15);
为什么不推荐简写?
因为这种写法高度依赖表的物理列顺序。如果将来有人修改了表的结构(比如在中间加了一列),那么这条简写的 INSERT 语句就会立刻出错,或者更糟糕——把数据插到错误的列里面去!
所以,始终明确地写出列名,是一个非常好的编程习惯!
本章小结
恭喜你,你已经掌握了 INSERT 命令,学会了如何为你的数据表注入灵魂!
- 我们学会了单行插入和多行插入。
- 我们知道了文本和日期要用单引号。
- 我们还养成了一个好习惯:总是写明列名。
现在,我们的 friends 表里已经有了一些数据。但是,我们如何才能按照我们的意愿,只查看我们想看的数据呢?比如,只看“老王”的信息,或者找出我们认识超过5年的朋友?
这就是下一章——SELECT 查询——要教给我们的核心技能。准备好从你的数据宝库中“探宝”了吗?我们下一章见!