一、插入数据记录
在MySQL软件中可以通过 “INSERT INTO” 语句来实现插入记录,该SQL语句可以通过如下四种方式使用:
- 插入完整数据记录
- 插入数据记录一部分
- 插入多条数据记录
- 插入查询结果
插入完整数据记录, 插入数据记录一部分, 插入多条数据记录中,不论哪种插入方式,其语法形式都很接近,因此只要记住插入多条完整数据记录的语法形式,其他的就会了。
1.1插入多条完整数据记录
语法形式:
INSERT INTO table_name(field1,field2,……fieldn)
VALUES(value11,value21,……valuen1),
(value12,value22,……valuen2),
…………
(value1m,value2m,……valuenm);
参数 table_name 表示所要插入记录的表名,fieldn 表示字段名,记录 (value11,value21,……valuen1)表示要插入第一条记录的数值,以此类推。
注:
- 在具体应用时参数 fieldn 与参数 valuen 应一一对应。
- 由于我们指定了具体的 fieldn(字段) ,所以 field1, field2,……fieldn 的顺序可以与表中字段的顺序不一致。但是,必须满足上一条的要求。
例1:插入多条完整记录
首先创建一个名为 t_dept 的表,同时创建3个字段,并设置字段 deptno 为自动增加(AUTO INCREMENT)和 主键约束(PK),loc 字段设置默认值为 ‘shangxi’
mysql> #创建表#
mysql> CREATE TABLE t_dept(
-> deptno INT PRIMARY KEY AUTO_INCREMENT,
-> dname VARCHAR(20),
-> loc VARCHAR(40) DEFAULT 'shangxi'
-> );
Query OK, 0 rows affected (0.04 sec)
然后查看一下该表的字段
mysql> #查看表结构#
mysql> DESC t_dept;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| deptno | int | NO | PRI | NULL | auto_increment |
| dname | varchar(20) | YES | | NULL | |
| loc | varchar(40) | YES | | shangxi | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
插入多条完整记录
mysql> #插入2条完整记录#
mysql> INSERT INTO t_dept(deptno,dname,loc)
-> VALUES(1,'cjgong1','shangxi1'),
-> (2,'cjgong2','shangxi2');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
效验:
插入了两条完整的记录
mysql> #效验是否插入成功#
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
+--------+---------+----------+
2 rows in set (0.00 sec)
例2:不按表的字段顺序进行插入完整记录
如果我们插入记录的时候,字段的顺序打乱一下,与表中的字段顺序不一致,只要保证数据与插入的字段一一对应,也可插入成功。
mysql> INSERT INTO t_dept(loc,dname,deptno)
-> VALUES('shangxi3','cjgong3',3),
-> ('shangxi4','cjgong4',4);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
4 rows in set (0.00 sec)
效验:插入的第3、4条记录
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
+--------+---------+----------+
可以看出:只要插入语句中记录的数值与字段的参数对应即可插入成功。
例3:插入
1.2插入多条部分记录
如果在上面的语法形式中字段参数 field中 包含表中的部分字段,而不是全部字段,且 VALUES 参数的记录数据与其一一对应,就可以实现插入部分记录了。
例: 在 dname 字段中插入两条记录:cjgong5 和cjgong6
mysql> INSERT INTO t_dept(dname)
-> VALUE('cjgong5'),
-> ('cjgong6');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
效验:
可以看出,虽然表中第5条与第6条是2条完整的记录,但是我们只操作了 dname 字段,deptno 字段的内容是因为该字段设置了自动增加(AUTO INCREMENT)约束,所以其数据是插入记录时自动分配的,而 loc 字段的内容,是因为我们在前面设置了其默认值为 ‘shangxi’ 的约束,它自动添加为该默认值。
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
| 5 | cjgong5 | shangxi |
| 6 | cjgong6 | shangxi |
+--------+---------+----------+
6 rows in set (0.00 sec)
注:
同样,插入多条部分记录时,插入的字段顺序也可以不按表中的顺序排列,只要插入的字段与插入的数据记录一一对应即可。
1.3 插入一条记录
插入一条记录同样分两种情况:插入一条完整记录、插入一条部分记录
语法形式与插入多条记录的一样,只是在 VALUES 参数处只有一组数据。
语法形式
INSERT INTO table_name(field1,field2,field3, …… fieldn)
VALUES(value1,value2,value3 …… valuen)
例1:插入一条完整记录,并效验
mysql>##完整插入第7条记录##
mysql> INSERT INTO t_dept(deptno,dname,loc)
-> VALUES (7,'cjgong7','shangxi7');
Query OK, 1 row affected (0.00 sec)
mysql>##效验##
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
| 5 | cjgong5 | shangxi |
| 6 | cjgong6 | shangxi |
| 7 | cjgong7 | shangxi7 |
+--------+---------+----------+
7 rows in set (0.00 sec)
例2:插入一条部分记录并效验
mysql>##在 dname 字段处插入一条数据##
mysql> INSERT INTO t_dept(dname)
-> VALUES ('cjgong8');
Query OK, 1 row affected (0.00 sec)
mysql>## deptno 字段自动生成8 , loc 字段 默认 shangxi ##
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
| 5 | cjgong5 | shangxi |
| 6 | cjgong6 | shangxi |
| 7 | cjgong7 | shangxi7 |
| 8 | cjgong8 | shangxi |
+--------+---------+----------+
8 rows in set (0.00 sec)
1.4 不指定字段插入完整记录
如果要插入完整记录,还可以不用指定字段名,但 VALUES 中的数据的顺序与数量必须与表中的字段顺序与数量一致
语法形式
INSERT INTO table_name
VALUES(value11,value21,……valuen1),
(value12,value22,……valuen2),
……
(value1m,value2m,……valuenm);
例1:插入一条完整记录
插入时,VALUES中的数据的顺序为 deptno dname loc三个字段
mysql>##插入一条完整记录##
mysql> INSERT INTO t_dept
-> VALUES(9,'cjgong9','shangxi9');
Query OK, 1 row affected (0.00 sec)
验证
添加成功第9条记录
mysql>##验证##
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
| 5 | cjgong5 | shangxi |
| 6 | cjgong6 | shangxi |
| 7 | cjgong7 | shangxi7 |
| 8 | cjgong8 | shangxi |
| 9 | cjgong9 | shangxi9 |
+--------+---------+----------+
9 rows in set (0.00 sec)
1.4 插入来自其他表的数据
可以将另一个表中的查询结果插入表中,从而实现表数据值的复制功能。
语法形式
INSERT INTO table_name1(field11,field12,field13,……field1n)
SELECT (field21,field22,field23,……field2n)
FROM table_name2
WHERE ……
解释:
将表table_name2中满足WHERE 条件的指定的字段(field21~ field2n)复制并插入到表 table_name1 中 field11~ field1n的字段中。
注:
参数 (field11,field12,field13,……field1n) 与参数 (field21,field22,field23,……field2n) 的个数与类型必须一致。
例:
向数据库 company 中的表 t_loader 插入部门表(t_dept)中关于字段 dname 和 loc 的查询结果。
1、首先建立 t_loader 表
mysql> CREATE TABLE t_loader(
-> id INT,
-> name VARCHAR(20),
-> dname VARCHAR(20),
-> loc VARCHAR(40)
-> );
Query OK, 0 rows affected (0.04 sec)
2、查看 t_loader 表和 t_dept 表
mysql> ##查看 t_loader 表的记录##
mysql> SELECT * FROM t_loader;
Empty set (0.01 sec)
mysql> ##查看 t_dept 表的记录##
mysql> SELECT * FROM t_dept;
+--------+---------+----------+
| deptno | dname | loc |
+--------+---------+----------+
| 1 | cjgong1 | shangxi1 |
| 2 | cjgong2 | shangxi2 |
| 3 | cjgong3 | shangxi3 |
| 4 | cjgong4 | shangxi4 |
| 5 | cjgong5 | shangxi |
| 6 | cjgong6 | shangxi |
| 7 | cjgong7 | shangxi7 |
| 8 | cjgong8 | shangxi |
| 9 | cjgong9 | shangxi9 |
+--------+---------+----------+
9 rows in set (0.00 sec)
t_loader 表没有记录,t_dept 表有9条记录
3、复制表 t_dept 后三条记录至 表 t_loader 中
mysql> INSERT INTO t_loader(dname,loc)
-> SELECT dname,loc
-> FROM t_dept
-> WHERE deptno>6;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
查询条件为 deptno字段中的数据 > 6 ,在表 t_dept 中只有第7、8、9条满足条件。
验证:
mysql> SELECT * FROM t_loader;
+------+------+---------+----------+
| id | name | dname | loc |
+------+------+---------+----------+
| NULL | NULL | cjgong7 | shangxi7 |
| NULL | NULL | cjgong8 | shangxi |
| NULL | NULL | cjgong9 | shangxi9 |
+------+------+---------+----------+
3 rows in set (0.00 sec)
表 t_loader 被插入了3条记录,涉及到2个字段(dname 与 loc)
生词表
单词 | 读音 | 译文 | MySQL |
---|---|---|---|
Value | 英 [ˈvæljuː] | n. (商品)价值;(与价格相比的)值,划算程度;用途;积极作用;是非标准;值 | 值 |
Field | 英 [fiːld] | n.领域;田;地;牧场;(作某种用途的)场地;(覆盖…的或有…的)大片地方;专业;实地;运动场;守队;(比赛项目的)全体参赛者;行业;场;字段 | 字段 |
如有错误敬请高人指点,书写的易读性可否,希望大家多提意见。
上一篇【MySQL 索引的操作】
下一篇【MySQL 数据的操作二】