文章目录
- 🥩 Update (更新/修改) 🦖
- 🥚 修改单行数据的某个字段内的数据 🦕
- 🥚 配合LIMIT分页与ORDER BY 对符合条件的多条数据进行修改 🦕
- 🥚 对整表的某个数据字段进行修改 🦕
- 🥩 Delete (删除数据) 🦖
- 🥚 删除单条数据 🦕
- 🥚 删除整表数据 🦕
- 🥚 截断表 (TRUNCATE) 🦕
- 🥩 总结 🦖🦖🦖🦖🦖
🥩 Update (更新/修改) 🦖
该语法主要针对于对数据库的表内数据进行修改;
一般该操作需要配合条件筛选,否则操作将影响整张表;
语法:
UPDATE table_name SET column = expr[,column = expr ... ]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
存在一张表:
+----+---------+---------+------+---------+
| id | name | chinese | math | english |
+----+---------+---------+------+---------+
| 1 | Lihua | 67 | 88 | 90 |
| 2 | Liming | 57 | 58 | 70 |
| 3 | Zhaolao | 66 | 80 | 47 |
| 4 | Wu | 76 | 70 | 47 |
| 5 | Wuqi | 88 | 43 | 80 |
| 6 | Liqiang | 89 | 92 | 90 |
| 7 | Qinsu | 90 | 74 | 67 |
| 8 | Zhaoli | 54 | 74 | 100 |
+----+---------+---------+------+---------+
🥚 修改单行数据的某个字段内的数据 🦕
示例:将name字段为Lihua的chinese字段数据修改为100
mysql> select name,chinese from Point where name ='Lihua';# 打印数据进行观察
+-------+---------+
| name | chinese |
+-------+---------+
| Lihua | 67 |
+-------+---------+
1 row in set (0.00 sec)
mysql> update Point set chinese=100 where name='Lihua';# 修改数据
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select name,chinese from Point where name ='Lihua';# 打印数据进行观察
+-------+---------+
| name | chinese |
+-------+---------+
| Lihua | 100 |
+-------+---------+
1 row in set (0.00 sec)
也可对单行数据的多个字段数据进行修改,前提是这个数据具有唯一属性(体现了主键约束的重要性);
🥚 配合LIMIT分页与ORDER BY 对符合条件的多条数据进行修改 🦕
示例:将字段条件chinese+math+english前3大的数据中的math字段数据+30
# 打印数据进行查看 -- 修改前
mysql> select name,math from Point order by math+chinese+english desc limit 3;
+---------+------+
| name | math |
+---------+------+
| Lihua | 88 |
| Liqiang | 92 |
| Qinsu | 74 |
+---------+------+
3 rows in set (0.00 sec)
mysql> select name,math+chinese+english from Point order by math+chinese+english desc limit 3;
+---------+----------------------+
| name | math+chinese+english |
+---------+----------------------+
| Lihua | 278 |
| Liqiang | 271 |
| Qinsu | 231 |
+---------+----------------------+
3 rows in set (0.00 sec)
# 修改数据
mysql> update Point set math=math+30 order by math+chinese+english desc limit 3;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
# 打印数据进行查看 -- 修改后
mysql> select name,math+chinese+english from Point order by math+chinese+english desc limit 3;
+---------+----------------------+
| name | math+chinese+english |
+---------+----------------------+
| Lihua | 308 |
| Liqiang | 301 |
| Qinsu | 261 |
+---------+----------------------+
3 rows in set (0.00 sec)
mysql> select name,math from Point order by math+chinese+english desc limit 3;
+---------+------+
| name | math |
+---------+------+
| Lihua | 118 |
| Liqiang | 122 |
| Qinsu | 104 |
+---------+------+
当需要修改的数据条件繁琐的前提可以先使用SELECT FROM
语句先对需要修改的数据进行查看筛选,再对该SELECT FROM
语句根据筛选条件修改为对应的UPDATE SET
语句对数据进行修改!
🥚 对整表的某个数据字段进行修改 🦕
在UPDATE SET
语句中若是没有用WHERE
语句进行筛选则更新整表!
在SQL中对整表的操作需要慎重;示例:将整表中的english字段数据修改为 *=2 ;
# 使用SELECT FROM语句对数据进行查看 -- 修改前
mysql> select id,name,english from Point;
+----+---------+---------+
| id | name | english |
+----+---------+---------+
| 1 | Lihua | 90 |
| 2 | Liming | 70 |
| 3 | Zhaolao | 47 |
| 4 | Wu | 47 |
| 5 | Wuqi | 80 |
| 6 | Liqiang | 90 |
| 7 | Qinsu | 67 |
| 8 | Zhaoli | 100 |
+----+---------+---------+
8 rows in set (0.00 sec)
# 对数据进行修改
mysql> update Point set english*=2 ; #SQL语句中不支持*=,+=等语法!
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*=2' at line 1# error
mysql> update Point set english=english*2 ;# 正确
Query OK, 8 rows affected (0.01 sec)
Rows matched: 8 Changed: 8 Warnings: 0
# 使用SELECT FROM语句对数据进行查看 -- 修改后
mysql> select id,name,english from Point;
+----+---------+---------+
| id | name | english |
+----+---------+---------+
| 1 | Lihua | 180 |
| 2 | Liming | 140 |
| 3 | Zhaolao | 94 |
| 4 | Wu | 94 |
| 5 | Wuqi | 160 |
| 6 | Liqiang | 180 |
| 7 | Qinsu | 134 |
| 8 | Zhaoli | 200 |
+----+---------+---------+
8 rows in set (0.00 sec)
🥩 Delete (删除数据) 🦖
该语句一般用于对某条数据的删除,也可以删除整表的数据;
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
存在一张表(to_del):
+-----+-----------+
| id | name |
+-----+-----------+
| 001 | Lihua |
| 002 | Liming |
| 003 | Zhangchao |
| 004 | Zhaoli |
| 005 | Lili |
+-----+-----------+
🥚 删除单条数据 🦕
示例:删除id字段为2的数据
mysql> select * from to_del
-> ;
+-----+-----------+
| id | name |
+-----+-----------+
| 001 | Lihua |
| 002 | Liming |
| 003 | Zhangchao |
| 004 | Zhaoli |
| 005 | Lili |
+-----+-----------+
5 rows in set (0.00 sec)
mysql> delete from to_del where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from to_del;
+-----+-----------+
| id | name |
+-----+-----------+
| 001 | Lihua |
| 003 | Zhangchao |
| 004 | Zhaoli |
| 005 | Lili |
+-----+-----------+
4 rows in set (0.00 sec)
🥚 删除整表数据 🦕
与UPDATE SET
语句相同,DELETE FROM
语句也可以删除整表的数据;
-- 查看表内数据 删除前
mysql> select * from to_del;
+-----+-----------+
| id | name |
+-----+-----------+
| 001 | Lihua |
| 003 | Zhangchao |
| 004 | Zhaoli |
| 005 | Lili |
+-----+-----------+
4 rows in set (0.00 sec)
-- 删除整表数据
mysql> delete from to_del;
Query OK, 4 rows affected (0.00 sec)
-- 查看表内数据 删除后
mysql> select * from to_del;
Empty set (0.00 sec)
🥚 截断表 (TRUNCATE) 🦕
语法:
TRUNCATE [TABLE] table_name;
截断表的操作与删除整表的作用类似也为清除整表内容(不作示例);
但存在不同;
同样以该表进行测试;
+-----+-----------+
| id | name |
+-----+-----------+
| 001 | Lihua |
| 002 | Liming |
| 003 | Zhangchao |
| 004 | Zhaoli |
| 005 | Lili |
+-----+-----------+
- 使用
SHOW CREATE TABLE table_name \G
对表的详细信息进行查看;
mysql> show create table to_del\G
*************************** 1. row ***************************
Table: to_del
Create Table: CREATE TABLE `to_del` (
`id` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT 'id增加主键约束',
`name` varchar(20) NOT NULL COMMENT 'name增加唯一键约束',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
对该表进行查看时自增AUTO_INCREMENT
关键字为6
;
- 使用
DELETE FROM
删除整表;
mysql> delete from to_del;
Query OK, 5 rows affected (0.01 sec)
mysql> show create table to_del\G
*************************** 1. row ***************************
Table: to_del
Create Table: CREATE TABLE `to_del` (
`id` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT 'id增加主键约束',
`name` varchar(20) NOT NULL COMMENT 'name增加唯一键约束',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
使用DELETE FROM
对整表进行删除时其AUTO_INCREMENT
关键字并没有改变;
- 使用
TRUNCATE
对整表进行截断操作;
mysql> truncate to_del;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table to_del\G
*************************** 1. row ***************************
Table: to_del
Create Table: CREATE TABLE `to_del` (
`id` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT 'id增加主键约束',
`name` varchar(20) NOT NULL COMMENT 'name增加唯一键约束',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
而使用TRUNCATE
对表进行截断操作时此时该表的AUTO_INCREMENT
关键字不见了;
综上所述可以确定:
1. TRUNCATE
只能对整表进行操作,且不能像DELETE
对部分数据进行操作;
2. 若是表中存在AUTO_INCREMENT
自增约束时,TRUNCATE
的截断表操作将会重置AUTO_INCREMENT
;
除此之外,对于DELETE
来说,TRUNCATE
的删除操作会较快,因为TRUNCATE
在操作删除数据时并不经过真正的事务,所以无法回滚;
🥩 总结 🦖🦖🦖🦖🦖
对于对表内数据的操作来说,无论是UPDATE
还是DELETE
与TRUNCATE
对整表进行操作都应该注意;
尽量在对表内数据修改或删除前对需要修改\删除的数据使用 SELETC
进行查看,避免误操作;