插入insert,修改update和删除delete都属于数据操纵语言DML。
建表
mysql> CREATE TABLE IF NOT EXISTS `student1` (
-> `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
-> `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
-> `password` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
-> `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
-> `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
-> `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
-> `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
-> PRIMARY KEY (`id`)
-> )ENGINE=INNODB DEFAULT CHARSET=utf8
-> ;
Query OK, 0 rows affected (0.04 sec)
mysql> desc student1;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | 匿名 | |
| password | varchar(20) | NO | | 123456 | |
| sex | varchar(2) | NO | | 女 | |
| birthday | datetime | YES | | NULL | |
| address | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> select * from student1;
Empty set (0.00 sec) -- 可以看到目前为止是一个空表
一、插入insert
1.基本语法
insert into 表名(字段名1,字段名2,字段名3) values(值1,值2,值3)
2.示例1:单行数据,全列插入
这种方式插入时,可以不写字段名,但是后面插入的值要写全,每个字段要赋的值都要写。
mysql> insert into `student1` values(1,'张三','123456','男','1998-1-1','北京海淀区中关村大街1号','123@qq.com');
Query OK, 1 row affected (0.00 sec)
插完之后查询一下:
mysql> select * from student1;
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| id | name | password | sex | birthday | address | email |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| 1 | 张三 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 123@qq.com |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
1 row in set (0.00 sec)
3.示例2:单行数据,指定列插入
插入的数据要与指定的字段相匹配
mysql> insert into `student1`(name,password) values('李四','123456');
Query OK, 1 row affected (0.01 sec)
插完查询一下:
mysql> select * from student1;
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| id | name | password | sex | birthday | address | email |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| 1 | 张三 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 123@qq.com |
| 2 | 李四 | 123456 | 女 | NULL | NULL | NULL |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
2 rows in set (0.00 sec)
4.示例3:多行数据,指定列插入
同样,插入的数据要与指定的字段相匹配。
mysql> insert into `student1`(name,password) values('王五','123456'),('faker','123456');
Query OK, 2 rows affected (0.00 sec)
插完查询一下:
mysql> select * from student1;
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| id | name | password | sex | birthday | address | email |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
| 1 | 张三 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 123@qq.com |
| 2 | 李四 | 123456 | 女 | NULL | NULL | NULL |
| 3 | 王五 | 123456 | 女 | NULL | NULL | NULL |
| 4 | faker | 123456 | 女 | NULL | NULL | NULL |
+----+--------+----------+-----+---------------------+------------------------------------+------------+
4 rows in set (0.00 sec)
5.insert小结
insert插入上面说了三种方法,其实都一样,记住一个点就行了:数据和字段一定要一一对应。多行插入时values后面的值要用逗号隔开,values(…),(…)。
二、修改update
1.基本语法:
update 表名 set 列字段=values,[列字段=values...] where 条件
2.示例1
将id为1的同学,姓名改为阿卡丽。
mysql> UPDATE `STUDENT1` SET `name`='阿卡丽' WHERE id=1;
Query OK, 1 row affected (0.01 sec)
改完查询:
mysql> select * from student1;
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
| id | name | password | sex | birthday | address | email |
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
| 1 | 阿卡丽 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 123@qq.com |
| 2 | 李四 | 123456 | 女 | NULL | NULL | NULL |
| 3 | 王五 | 123456 | 女 | NULL | NULL | NULL |
| 4 | faker | 123456 | 女 | NULL | NULL | NULL |
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
4 rows in set (0.00 sec)
3.在示例1的基础上不加where会怎么样呢?
mysql> UPDATE `STUDENT1` SET `name`='阿卡丽';
Query OK, 3 rows affected (0.00 sec)
mysql> select * from student1;
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
| id | name | password | sex | birthday | address | email |
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
| 1 | 阿卡丽 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 123@qq.com |
| 2 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
| 3 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
| 4 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
+----+-----------+----------+-----+---------------------+------------------------------------+------------+
4 rows in set (0.00 sec)
查完发现不加限制条件,所有人的姓名都被改成阿卡丽了。
不用where指定条件的情况下会修改所有数据,所以平常一定要避免这样操作。
4.示例2
- 修改多个字段属性。将学号为1的同学的姓名改为亚索,email改为555353@qq.com。
mysql> UPDATE `STUDENT1` SET `name`='亚索',`email`='555353@qq.com' WHERE id=1;
Query OK, 1 row affected (0.00 sec)
查询一下,可以看到修改成功
mysql> select * from student1;
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
| id | name | password | sex | birthday | address | email |
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
| 1 | 亚索 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 555353@qq.com |
| 2 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
| 3 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
| 4 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
4 rows in set (0.00 sec)
5.update小结
- 1.where条件为筛选条件,如果没有指定行,则会修改所有行,应尽量避免;
- 2.value可以是一个具体的值,也可以是一个变量,如birthday就可不给具体的值,直接用datetime函数;
- 3.多个设置的属性之间使用英文逗号隔开。
三、删除delete
1.基本语法
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
2.示例1
删除id为4的同学的数据
mysql> DELETE FROM `student1` WHERE id=4;
Query OK, 1 row affected (0.00 sec)
查询一下:
mysql> select * from student1;
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
| id | name | password | sex | birthday | address | email |
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
| 1 | 亚索 | 123456 | 男 | 1998-01-01 00:00:00 | 北京海淀区中关村大街1号 | 555353@qq.com |
| 2 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
| 3 | 阿卡丽 | 123456 | 女 | NULL | NULL | NULL |
+----+-----------+----------+-----+---------------------+------------------------------------+---------------+
3 rows in set (0.00 sec)
3.在示例1的基础上,不加where条件会怎么样呢?
mysql> DELETE FROM `student1` ;
Query OK, 3 rows affected (0.00 sec)
查询一下:
mysql> select * from student1;
Empty set (0.00 sec)
可以看到不加where,然后删除,表就为空了。
4.关于delete和truncate区别
清空一张表,除了用不加where的delete外,还可以用truncate。那么二者有什么区别呢?
先看两段代码
- delete
mysql> insert into `student1`(id,name,password) values(1,'李四','123456');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student1;
+----+--------+----------+-----+----------+---------+-------+
| id | name | password | sex | birthday | address | email |
+----+--------+----------+-----+----------+---------+-------+
| 5 | 李四 | 123456 | 女 | NULL | NULL | NULL |
+----+--------+----------+-----+----------+---------+-------+
1 row in set (0.00 sec)
可以看到,依旧是接着被删除的最近的那一条记录ID加1后进行记录。也就是说删除表而id并没有被重置。
- truncate
mysql> truncate table `student1`;
Query OK, 0 rows affected (0.03 sec) --使用truncate方法清空一张表
mysql> select * from student1;
Empty set (0.00 sec)
mysql> insert into `student1`(id,name,password) values(1,'李四','123456');
Query OK, 1 row affected (0.01 sec)
mysql> select * from student1;
+----+--------+----------+-----+----------+---------+-------+
| id | name | password | sex | birthday | address | email |
+----+--------+----------+-----+----------+---------+-------+
| 1 | 李四 | 123456 | 女 | NULL | NULL | NULL |
+----+--------+----------+-----+----------+---------+-------+
1 row in set (0.00 sec)
可以看到在用truncate清空一张表后,再插入语句,id这个自增项被重置了。
小结:
二者主要区别为以下两点:
- 1.delete删除的时候是一条一条的删除记录,对于auto_increment(自增)的记录不清空,并且配合事务(在同一个事务中),还可以将数据恢复。
- 2.而truncate是直接将表摧毁,相当于再建一张一模一样的新表,对于auto_increment的记录也清空,并且删除的数据是找不回的。