MySQL 操作表中的数据

INSERT:插入数据

数据库与表创建成功以后,需要向数据库的表中插入数据。在 MySQL 中可以使用INSERT语句向数据库已有的表中插入一行或者多行元组数据。

基本语法

INSERT语句有两种语法形式,分别是INSERT…VALUES语句和INSERT…SET语句。

INSERT…VALUES语句

1
2
INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]
VALUES (值1) [… , (值n) ];

语法说明:

  • <表名>:指定被操作的表名。
  • <列名>:指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用INSERT <表名> VALUES(…)即可。
  • VALUESVALUE子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。

INSERT…SET语句

1
2
3
4
INSERT INTO <表名>
SET <列名1> = <1>,
<列名2> = <2>,

此语句用于直接给表中的某些列指定对应的列值,即要插入的数据的列名在SET子句中指定,col_name为指定的列名,等号后面为指定的数据,而对于未指定的列,列值会指定为该列的默认值。

INSERT语句的两种形式可以看出:

  • 使用INSERT…VALUES语句可以向表中插入一行数据,也可以插入多行数据;
  • 使用INSERT…SET语句可以指定插入行中每列的值,也可以指定部分列的值;
  • INSERT…SELECT语句向表中插入其他表的数据;
  • 采用INSERT…SET语句可以向表中插入部分列的值,这种方式更为灵活;
  • INSERT…VALUES语句可以一次插入多条数据。

在 MySQL 中,用单条INSERT语句处理多个插入要比使用多条INSERT语句更快。

当使用单条INSERT语句插入多行数据的时候,只需要将每行数据用圆括号括起来即可。

向表中的全部字段添加值

test_db数据库中创建一个课程信息表tb_courses,包含课程编号course_id、课程名称course_name、课程学分course_grade和课程备注course_info

1
2
3
4
5
6
7
8
9
mysql> CREATE TABLE tb_courses
-> (
-> course_id INT NOT NULL AUTO_INCREMENT,
-> course_name CHAR(40) NOT NULL,
-> course_grade FLOAT NOT NULL,
-> course_info CHAR(100) NULL,
-> PRIMARY KEY(course_id)
-> );
Query OK, 0 rows affected (0.00 sec)

向表中所有字段插入值的方法有两种:一种是指定所有字段名;另一种是完全不指定字段名。

tb_courses表中插入一条新记录,course_id值为 1,course_name值为Networkcourse_grade值为 3,info值为Computer Network

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tb_courses;
Empty set (0.00 sec)

mysql> INSERT INTO tb_courses
-> (course_id,course_name,course_grade,course_info)
-> VALUES(1,'Network',3,'Computer Network');
Query OK, 1 rows affected (0.08 sec)
mysql> SELECT * FROM tb_courses;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
+-----------+-------------+--------------+------------------+
1 row in set (0.00 sec)

可以看到插入记录成功。在插入数据时,指定了tb_courses表的所有字段,因此将为每一个字段插入新的值。

INSERT语句后面的列名称顺序可以不是tb_courses表定义时的顺序,即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> INSERT INTO tb_courses
-> (course_name,course_info,course_id,course_grade)
-> VALUES('Database','MySQL',2,3);
Query OK, 1 rows affected (0.08 sec)
mysql> SELECT * FROM tb_courses;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
| 2 | Database | 3 | MySQL |
+-----------+-------------+--------------+------------------+
2 rows in set (0.00 sec)

使用INSERT插入数据时,允许列名称列表column_list为空,此时值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。

1
2
3
4
5
6
7
8
9
10
11
mysql> INSERT INTO tb_courses VLAUES(3,'Java',4,'Java EE');
Query OK, 1 rows affected (0.08 sec)
mysql> SELECT * FROM tb_courses;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
| 2 | Database | 3 | MySQL |
| 3 | Java | 4 | Java EE |
+-----------+-------------+--------------+------------------+
3 rows in set (0.00 sec)

INSERT语句中没有指定插入列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入的值,并且这些值的顺序必须和tb_courses表中字段定义的顺序相同。

注意:虽然使用INSERT插入数据时可以忽略插入数据的列名称,若值不包含列名称,则VALUES关键字后面的值不仅要求完整,而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,对列进行增加、删除或者位置改变操作,这些操作将使得用这种方式插入数据时的顺序也同时改变。如果指定列名称,就不会受到表结构改变的影响。

向表中指定字段添加值

为表的指定字段插入数据,是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> INSERT INTO tb_courses
-> (course_name,course_grade,course_info)
-> VALUES('System',3,'Operation System');
Query OK, 1 rows affected (0.08 sec)
mysql> SELECT * FROM tb_courses;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
| 2 | Database | 3 | MySQL |
| 3 | Java | 4 | Java EE |
| 4 | System | 3 | Operating System |
+-----------+-------------+--------------+------------------+
4 rows in set (0.00 sec)

使用 INSERT INTO…FROM 语句复制表数据

INSERT INTO…SELECT…FROM语句用于快速地从一个或多个表中取出数据,并将这些数据作为行数据插入另一个表中。

SELECT子句返回的是一个查询到的结果集,INSERT语句将这个结果集插入指定表中,结果集中的每行数据的字段数、字段的数据类型都必须与被操作的表完全一致。

在数据库test_db中创建一个与tb_courses表结构相同的数据表tb_courses_new

1
2
3
4
5
6
7
8
9
10
11
mysql> CREATE TABLE tb_courses_new
-> (
-> course_id INT NOT NULL AUTO_INCREMENT,
-> course_name CHAR(40) NOT NULL,
-> course_grade FLOAT NOT NULL,
-> course_info CHAR(100) NULL,
-> PRIMARY KEY(course_id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM tb_courses_new;
Empty set (0.00 sec)

tb_courses表中查询所有的记录,并将其插入tb_courses_new表中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> INSERT INTO tb_courses_new
-> (course_id,course_name,course_grade,course_info)
-> SELECT course_id,course_name,course_grade,course_info
-> FROM tb_courses;
Query OK, 4 rows affected (0.17 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM tb_courses_new;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
| 2 | Database | 3 | MySQL |
| 3 | Java | 4 | Java EE |
| 4 | System | 3 | Operating System |
+-----------+-------------+--------------+------------------+
4 rows in set (0.00 sec)

UPDATE:修改数据

在 MySQL 中,可以使用UPDATE语句来修改、更新一个或多个表的数据。

UPDATE 语句的基本语法

使用UPDATE语句修改单个表,语法格式为:

1
2
UPDATE <表名> SET 字段 1=1 [,字段 2=2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]

语法说明:

  • <表名>:用于指定要更新的表名称。
  • SET子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字DEFAULT表示列值。
  • WHERE子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
  • ORDER BY子句:可选项。用于限定表中的行被修改的次序。
  • LIMIT子句:可选项。用于限定被修改的行数。

注意:修改一行数据的多个列值时,SET子句的每个值用逗号分开即可。

修改表中的数据

tb_courses_new表中,更新所有行的course_grade字段值为 4。

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> UPDATE tb_courses_new SET course_grade=4;
Query OK, 3 rows affected (0.11 sec)
Rows matched: 4 Changed: 3 Warnings: 0
mysql> SELECT * FROM tb_courses_new;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 4 | Computer Network |
| 2 | Database | 4 | MySQL |
| 3 | Java | 4 | Java EE |
| 4 | System | 4 | Operating System |
+-----------+-------------+--------------+------------------+
4 rows in set (0.00 sec)

根据条件修改表中的数据

tb_courses表中,更新course_id值为 2 的记录,将course_grade字段值改为 3.5,将course_name字段值改为DB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> UPDATE tb_courses_new
-> SET course_name='DB',course_grade=3.5
-> WHERE course_id=2;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM tb_courses_new;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 4 | Computer Network |
| 2 | DB | 3.5 | MySQL |
| 3 | Java | 4 | Java EE |
| 4 | System | 4 | Operating System |
+-----------+-------------+--------------+------------------+
4 rows in set (0.00 sec)

注意:保证UPDATEWHERE子句结束,通过WHERE子句指定被更新的记录所需要满足的条件,如果忽略WHERE子句,MySQL 将更新表中所有的行。

DELETE:删除数据

在 MySQL 中,可以使用DELETE语句来删除表的一行或者多行数据。

删除单个表中的数据

使用DELETE语句从单个表中删除数据:

1
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

语法说明:

  • <表名>:指定要删除数据的表名。
  • ORDER BY子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
  • WHERE子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
  • LIMIT子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。

注意:在不使用WHERE条件的时候,将删除所有数据。

删除表中的全部数据

删除tb_courses_new表中的全部数据。

1
2
3
4
mysql> DELETE FROM tb_courses_new;
Query OK, 3 rows affected (0.12 sec)
mysql> SELECT * FROM tb_courses_new;
Empty set (0.00 sec)

根据条件删除表中的数据

tb_courses_new表中,删除course_id为 4 的记录。

1
2
3
4
5
6
7
8
9
10
11
mysql> DELETE FROM tb_courses WHERE course_id=4;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM tb_courses;
+-----------+-------------+--------------+------------------+
| course_id | course_name | course_grade | course_info |
+-----------+-------------+--------------+------------------+
| 1 | Network | 3 | Computer Network |
| 2 | Database | 3 | MySQL |
| 3 | Java | 4 | Java EE |
+-----------+-------------+--------------+------------------+
3 rows in set (0.00 sec)

TRUNCATE:清空表记录

MySQL 提供了DELETETRUNCATE关键字来删除表中的数据。TRUNCATE关键字用于完全清空一个表。

1
TRUNCATE [TABLE] 表名

其中,TABLE关键字可省略。

新建表tb_student_course,插入数据并查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> CREATE TABLE `tb_student_course` (
-> `id` int(4) NOT NULL AUTO_INCREMENT,
-> `name` varchar(25) NOT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM tb_student_course;
+----+--------+
| id | name |
+----+--------+
| 1 | Java |
| 2 | MySQL |
| 3 | Python |
+----+--------+
3 rows in set (0.00 sec)

使用TRUNCATE语句清空tb_student_course表中的记录:

1
2
3
4
5
mysql> TRUNCATE TABLE tb_student_course;
Query OK, 0 rows affected (0.04 sec)

mysql> SELECT * FROM tb_student_course;
Empty set (0.00 sec)

TRUNCATE 和 DELETE 的区别

从逻辑上说,TRUNCATE语句与DELETE语句作用相同,但是在某些情况下,两者在使用上有所区别。

  • DELETE是 DML 类型的语句;TRUNCATE是 DDL 类型的语句。它们都用来清空表中的数据。
  • DELETE是逐行一条一条删除记录的;TRUNCATE则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比DELETE快。因此需要删除表中全部的数据行时,尽量使用TRUNCATE语句, 可以缩短执行时间。
  • DELETE删除数据后,配合事件回滚可以找回数据;TRUNCATE不支持事务的回滚,数据删除后无法找回。
  • DELETE删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE清空表记录后,系统会重新设置自增字段的计数器。
  • DELETE的使用范围更广,因为它可以通过WHERE子句指定条件来删除部分数据;而TRUNCATE不支持WHERE子句,只能删除整体。
  • DELETE会返回删除数据的行数,但是TRUNCATE只会返回 0,没有任何意义。

总结

当不需要该表时,用DROP;当仍要保留该表,但要删除所有记录时,用TRUNCATE;当要删除部分记录时,用DELETE

打赏
  • Copyrights © 2017-2023 WSQ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信