插入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號','[email protected]');
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改爲[email protected]。
mysql> UPDATE `STUDENT1` SET `name`='亞索',`email`='[email protected]' 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的記錄也清空,並且刪除的數據是找不回的。