1.1插入或替换
# 如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。此时可以使用REPLACE语句,这样就不必先查询,再决定是否先删除再插入
MySQL [mysql_chuid]> select * from students; # 查询表students中的信息
+----+-----------+------+
| id | name_list | sex |
+----+-----------+------+
| 1 | chd | man |
| 3 | chuid | man |
| 5 | anivd | man |
| 6 | chen | man |
+----+-----------+------+
4 rows in set (0.00 sec)
MySQL [mysql_chuid]> replace into students (id,name_list,sex)values(8,'chuid','man'); # 替换原数据
Query OK, 2 rows affected (0.03 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+------+
| id | name_list | sex |
+----+-----------+------+
| 1 | chd | man |
| 5 | anivd | man |
| 6 | chen | man |
| 8 | chuid | man |
+----+-----------+------+
4 rows in set (0.00 sec)
MySQL [mysql_chuid]> replace into students (id,name_list,sex)values(4,'wang','man'); # 插入新数据
Query OK, 1 row affected (0.00 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+------+
| id | name_list | sex |
+----+-----------+------+
| 1 | chd | man |
| 4 | wang | man |
| 5 | anivd | man |
| 6 | chen | man |
| 8 | chuid | man |
+----+-----------+------+
5 rows in set (0.00 sec)
1.2插入或更新
INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语句
# 如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录;若记录不存在,INSERT语句将插入新记录。
MySQL [mysql_chuid]> insert into students(id,name_list,sex)values(1,'chd','man')on duplicate key update name_list='chd',sex='man';
Query OK, 0 rows affected, 1 warning (0.04 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+------+
| id | name_list | sex |
+----+-----------+------+
| 1 | chd | man |
| 4 | wang | man |
| 5 | anivd | man |
| 6 | chen | man |
| 8 | chuid | man |
+----+-----------+------+
5 rows in set (0.00 sec)
**************************************************************************************************************
MySQL [mysql_chuid]> alter table students add height int(5) default '171'; # 增加表的字段(height)
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [mysql_chuid]> alter table students add weight int(5) default '130'; # 增加表的字段(weight)
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [mysql_chuid]> select * from students;
+----+-----------+------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+------+--------+--------+
| 1 | chd | man | 130 | 171 |
| 4 | wang | man | 130 | 171 |
| 5 | anivd | man | 130 | 171 |
| 6 | chen | man | 130 | 171 |
| 8 | chuid | man | 130 | 171 |
+----+-----------+------+--------+--------+
5 rows in set (0.00 sec)
MySQL [mysql_chuid]> insert into students(id,name_list,sex)values(2,'wang','man')on duplicate key update name_list='wang',sex='woman',weight=105,height=165; # 插入更新
Query OK, 2 rows affected, 1 warning (0.01 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 1 | chd | man | 130 | 171 |
| 2 | wang | woman | 105 | 165 |
| 5 | anivd | man | 130 | 171 |
| 6 | chen | man | 130 | 171 |
| 8 | chuid | man | 130 | 171 |
+----+-----------+-------+--------+--------+
5 rows in set (0.00 sec)
1.3 插入或忽略
INSERT IGNORE INTO ... 语句
# 插入一条新记录(INSERT),如果记录已经存在,就什么都不做直接忽略;若记录不存在,INSERT语句将插入新记录。
MySQL [mysql_chuid]> insert ignore into students(id,name_list,sex,weight,height)values(5,'anivd','man',130,171);
Query OK, 0 rows affected (0.00 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 1 | chd | man | 130 | 171 |
| 2 | wang | woman | 105 | 165 |
| 5 | anivd | man | 130 | 171 |
| 6 | chen | man | 130 | 171 |
| 8 | chuid | man | 130 | 171 |
+----+-----------+-------+--------+--------+
5 rows in set (0.00 sec)
MySQL [mysql_chuid]> insert ignore into students(id,name_list,sex,weight,height)values(7,'zhang','woman',98,162);
Query OK, 1 row affected (0.03 sec)
MySQL [mysql_chuid]> select * from students;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 1 | chd | man | 130 | 171 |
| 2 | wang | woman | 105 | 165 |
| 5 | anivd | man | 130 | 171 |
| 6 | chen | man | 130 | 171 |
| 7 | zhang | woman | 98 | 162 |
| 8 | chuid | man | 130 | 171 |
+----+-----------+-------+--------+--------+
6 rows in set (0.00 sec)
快照
# 如果想要对一个表进行快照,即复制一份当前表的数据到一个新表,可以结合CREATE TABLE和SELECT
MySQL [mysql_chuid]> select * from students;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 1 | chd | man | 130 | 171 |
| 2 | wang | woman | 105 | 165 |
| 5 | anivd | man | 130 | 171 |
| 6 | chen | man | 130 | 171 |
| 7 | zhang | woman | 98 | 162 |
| 8 | chuid | man | 130 | 171 |
+----+-----------+-------+--------+--------+
6 rows in set (0.00 sec)
MySQL [mysql_chuid]> create table students_1 select * from students where id=7;
Query OK, 1 row affected (0.12 sec)
Records: 1 Duplicates: 0 Warnings: 0
MySQL [mysql_chuid]> select * from students_1;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 7 | zhang | woman | 98 | 162 |
+----+-----------+-------+--------+--------+
1 row in set (0.00 sec)
MySQL [mysql_chuid]> create table students_2 select * from students where id=1;
Query OK, 1 row affected (0.95 sec)
Records: 1 Duplicates: 0 Warnings: 0
MySQL [mysql_chuid]> select * from students_2;
+----+-----------+------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+------+--------+--------+
| 1 | chd | man | 130 | 171 |
+----+-----------+------+--------+--------+
1 row in set (0.00 sec)
克隆表
# 将数据表的数据记录生成到新的表中
CREATE TABLE <新表> LIKE <源表>
INSERT INTO <新表> SELECT * FROM <源表>
MySQL [mysql_chuid]> show tables;
+-----------------------+
| Tables_in_mysql_chuid |
+-----------------------+
| students |
| students_1 |
| students_2 |
+-----------------------+
3 rows in set (0.00 sec)
MySQL [mysql_chuid]> create table students_6 like students_2;
Query OK, 0 rows affected (0.11 sec)
MySQL [mysql_chuid]> desc students_6;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int(5) | NO | | 0 | |
| name_list | varchar(10) | YES | | NULL | |
| sex | char(6) | YES | | man | |
| weight | int(5) | YES | | 130 | |
| height | int(5) | YES | | 171 | |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
MySQL [mysql_chuid]> insert into students_6 select * from students_2;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
MySQL [mysql_chuid]> select * from students_6;
+----+-----------+------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+------+--------+--------+
| 1 | chd | man | 130 | 171 |
+----+-----------+------+--------+--------+
1 row in set (0.00 sec)
清空表
# 删除表内的所有数据
DELETE FROM <数据表>
TRUNCATE table <数据表>
MySQL [mysql_chuid]> select * from students_5;
+----+-----------+-------+--------+--------+
| id | name_list | sex | weight | height |
+----+-----------+-------+--------+--------+
| 7 | zhang | woman | 98 | 162 |
+----+-----------+-------+--------+--------+
1 row in set (0.00 sec)
MySQL [mysql_chuid]> delete from students_5;
Query OK, 1 row affected (0.02 sec)
MySQL [mysql_chuid]> select * from students_5;
Empty set (0.00 sec)
*****************************************************************************************************
# 清空表后,返回的结果内有删除的记录条目;delete工作时是一行一行的删除记录数据的,如果表中有自增长字段,使用delete from删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
MySQL [mysql_chuid]> create table students_7 (id int primary key auto_increment,name varchar(20) not null,age char(2) not null unique key);
Query OK, 0 rows affected (0.08 sec)
# id int (整型) # primary key (主键) # auto_increment (从1开始自动递增)
MySQL [mysql_chuid]> show tables;
+-----------------------+
| Tables_in_mysql_chuid |
+-----------------------+
| students |
| students_1 |
| students_2 |
| students_3 |
| students_5 |
| students_6 |
| students_7 |
+-----------------------+
7 rows in set (0.01 sec)
MySQL [mysql_chuid]> insert into students_7 (name,age) values ('chen','28'); # 插入数据
Query OK, 1 row affected (0.06 sec)
MySQL [mysql_chuid]> select * from students_7; # 查询表内的数据
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | chen | 28 |
+----+------+-----+
1 row in set (0.00 sec)
MySQL [mysql_chuid]> delete from students_7; # 删除表内的数据
Query OK, 1 row affected (0.00 sec)
MySQL [mysql_chuid]> select * from students_7;
Empty set (0.00 sec)
MySQL [mysql_chuid]> insert into students_7 (name,age) values ('chuid','27');
Query OK, 1 row affected (0.00 sec)
MySQL [mysql_chuid]> select * from students_7;
+----+-------+-----+
| id | name | age |
+----+-------+-----+
| 3 | chuid | 27 |
+----+-------+-----+
1 row in set (0.00 sec)
MySQL [mysql_chuid]> insert into students_7 (name,age) values ('chd','28');
Query OK, 1 row affected (0.00 sec)
MySQL [mysql_chuid]> select * from students_7;
+----+-------+-----+
| id | name | age |
+----+-------+-----+
| 3 | chuid | 27 |
| 5 | chd | 28 |
+----+-------+-----+
2 rows in set (0.00 sec)
****************************************************************************************************
# truncate清空表后,没有返回被删除的条目;truncate工作时是将表结构按原样重新建立,因此在速度上truncate会比delete清空表快,使用truncate清空表内数据后,ID会从1开始重新记录。
MySQL [mysql_chuid]> select * from students_7;
+----+-------+-----+
| id | name | age |
+----+-------+-----+
| 3 | chuid | 27 |
| 5 | chd | 28 |
+----+-------+-----+
2 rows in set (0.00 sec)
MySQL [mysql_chuid]> truncate table students_7; # 清空表内的数据
Query OK, 0 rows affected (0.22 sec)
MySQL [mysql_chuid]> select * from students_7;
Empty set (0.00 sec)
MySQL [mysql_chuid]> insert into students_7 (name,age) values ('chd','25');
Query OK, 1 row affected (0.02 sec)
MySQL [mysql_chuid]> select * from students_7; # ID从1开始
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | chd | 25 |
+----+------+-----+
1 row in set (0.00 sec)
创建临时表
# 临时表创建成功之后,使用show table命令看不到创建的临时表,临时表会在连接退出后被销毁,在退出连接之前可以执行增删改查等操作。
也可以使用drop table语句手动删除临时表
CREATE temporary table 表名 (字段1 数据类型,字段2 数据类型[,...][,primary key(主键名)]);
MySQL [mysql_chuid]> create temporary table students_9(id int(5),name char(10),sex char(6),height int(5),weight int(5),primary key(id));
Query OK, 0 rows affected (0.09 sec)
MySQL [mysql_chuid]> insert into students_9 values(1,'chuid','man',171,130);
Query OK, 1 row affected (0.01 sec)
MySQL [mysql_chuid]> select * from students_9;
+----+-------+------+--------+--------+
| id | name | sex | height | weight |
+----+-------+------+--------+--------+
| 1 | chuid | man | 171 | 130 |
+----+-------+------+--------+--------+
1 row in set (0.00 sec)
MySQL [mysql_chuid]> show tables;
+-----------------------+
| Tables_in_mysql_chuid |
+-----------------------+
| students |
| students_5 |
| students_6 |
| students_7 |
| students_8 |
+-----------------------+
8 rows in set (0.00 sec)