『 MySQL数据库 』MySQL复习(一)
文章目录
- MySQL数据库结构抽象图
- 库的增删改查
- 增
- 删
- 改(备份方式)
- 查
- 表的增删改查
- 表的创建
- 表的删除
- 表的修改
- 修改表名
- 修改字符集和校对集
- 表的查
- 表内字段增删改查
- 表内字段修改
- 表内单个字段(列名)修改
- 表内单个字段属性修改
- 表内字段增加
- 增加单个字段
- 增加多个字段
- 添加字段并指定字段位置
- 表内字段删除
- 表内数据增删改
- 数据插入
- 单行数据插入
- 多行数据插入
- 从其他表插入数据
- 插入时处理重复键
- 数据删除
- 基本删除
- 使用`JOIN`删除
- 单张表`JOIN`删除
- 多张表`JOIN`删除
- 使用子查询删除
- 快速清空
- 数据修改
- 使用`UPDATE`更新
- 使用表达式更新
- 使用`JOIN`更新多张表
- 使用子查询更新
- 使用`CASE`语句进行条件更新
MySQL数据库结构抽象图
库的增删改查
增
CREATE DATABASE [IF NOT EXISTS] db_name [CHARSET='xxxxx'] [COLLATE='xxxxx'];CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET xxxxx] [COLLATION xxxxxx];
上述两者语法不同但意义相同;
删
DROP DATABASE [IF EXISTS] db_name;
改(备份方式)
新版mysql
无法直接更换名字, 采用备份的方式;
mysqldump -u username -p -B path/filename.sql
带-B
选项时.sql
将会包括创建数据库的CREATE
和选择数据库USE
的操作;
否则备份不包含创建数据库的CREATE
以及选择数据库USE
的操作;
SOURCE path/filename.sql;
# 如果没有选择 -B 选项则需要先 CREATE 创建数据库再 USE 选择数据库
查
-
查看当前所有数据库
SHOW DATABASES;
-
查看对应数据库的创建语句
SHOW CREATE DATABASE db_name;
-
查看当前所选择数据库
SELECT DATABASE();
-
数据库的选择
USE db_name;
表的增删改查
表的创建
CREATE TABLE table_name(field1 field_type [PRIMARY KEY] [NOT NULL] [COMMENT 'xxxxx'] [.../*其他约束与属性*/], field2 field_type [PRIMARY KEY] [NOT NULL] [COMMENT 'xxxxx'] [.../*其他约束与属性*/] , ......
) [ENGINE=xxxx/*存储引擎*/] [COLLATE=xxxx/*校验集*/] [COMMENT='xxxx'/*注释*/] [.../*其他约束与属性*/];
表的删除
DROP TABLE [IF EXISTS] table_name;
表的修改
修改表名
-
单个表名
ALTER TABLE old_table_name RENAME TO new_table_name;RENAME TABLE old_table_name TO new_table_name;-- 语法不同但意义相同
-
多个表名
RENAME TABLE old_table_name1 TO new_table_name1, old_table_name2 TO new_table_name2, old_table_name3 TO new_table_name3, ...;
-
修改存储引擎
ALTER TABLE table_name ENGINE='xxxx'; -- xxxx 可以是任何存储引擎, 如InnoDB或者MyISAM
可以通过
SHOW ENGINES
来查看当前MySQL
支持的所有存储引擎;
修改字符集和校对集
-
字符集
ALTER TABLE table_name CHARACTER SET utf8mb3; ALTER TABLE table_name CHARSET='utf8mb3'; ALTER TABLE table_name CHARACTER SET='utf8mb3';
-
校对集
ALTER TABLE table_name COLLATE='utf8mb3_bin'; ALTER TABLE table_name COLLATE utf8mb3_bin;
-
一起修改
上述两种随意组合;
如:
ALTER TABLE table_name COLLATE='utf8mb3_bin' CHARACTER SET='utf8mb3';
-
表注释
ALTER TABLE table_name COMMENT 'xxxx'; ALTER TABLE table_name COMMENT='xxxx';
表的查
-
查看当前数据库内所有表
SHOW TABLES;
-
查看表的具体描述
DESC table_name; DESCRIBE table_name;
-
查看创建表的语句
SHOW CREATE TABLE table_name;
表内字段增删改查
表内字段修改
表内单个字段(列名)修改
ALTER TABLE table_name CHANGE old_field_name new_field_name field_type [COMMENT 'xxx'] [.../*其他属性与约束*/];
通过CHANGE
对名称修改时需要带上参数, 本质上CHANGE
是覆盖原有字段, 包括字段名;
表内单个字段属性修改
采用MODIFY
关键字修改
ALTER TABLE table_name MODIFY field_name field_type [COMMENT 'xxx'] [COLLATE xxxx] [.../*其他属性与约束*/]
表内字段增加
增加单个字段
ALTER TABLE table_name ADD field field_type [CONSTRAINT] [CONSTRAINT] ...;
增加多个字段
ALTER TABLE table_name
ADD field1 field_type [CONSTRAINT] [CONSTRAINT] ..., ADD field2 field_type [CONSTRAINT] [CONSTRAINT] .../*其他约束*/, .../*其他需要添加的字段*/;
添加字段并指定字段位置
-
单个字段
-- 增加一个字段并放在首位 ALTER TABLE table_name ADD field1 field_type [CONSTRAINT] [CONSTRAINT] ... FIRST;-- 增加单个字段并放在某个字段后面 ALTER TABLE table_name ADD field1 field_type [CONSTRAINT] [CONSTRAINT] ... AFTER other_field;
-
多个字段
ALTER TABLE table_name ADD field1 field_type [CONSTRAINT1] [CONSTRAINT2] ... [FIRST / AFTER other_field], ADD field2 field_type [CONSTRAINT1] [CONSTRAINT2] ... [FIRST / AFTER other_field], ...;
表内字段删除
-
删除单字段
ALTER TABLE table_name DROP field;
-
删除多字段
ALTER TABLE table_name DROP field1, DROP field2, ...;
表内数据增删改
数据插入
单行数据插入
-- 选择列(字段)进行插入
INSERT INTO table_name(column1, column2, ...) VALUES(value1, value2, ...);-- 插入单行数据, 为所有列提供值(按照表结构顺序进行传参)
INSERT INTO table_name VALUES(value1, value2, ...);
多行数据插入
多行数据插入与单行数据插入格式类似, 不同点在于()
数量, 多行数据插入可以选择单列/多列/整行;
-- 选择列(字段)进行插入
INSERT INTO table_name(column1, column2, ...) VALUES(value1, value2, ...), (value3, value4, ...), (value5, value6, ...);-- 插入整行的多行数据, 为所有列提供值(按照表结构顺序进行传参)
INSERT INTO table_name VALUES(value1, value2, ...), (value3, value4, ...), (value5, value6, ...);
从其他表插入数据
INSERT INTO table_name/*需要插入数据的表*/ [(column1, column2, .../*需要插入数据的表的字段*/)] SELECT another_column1/*选择另一张表的字段*/, another_column2, ... FROM another_table/*另一张表名*/;
插入时处理重复键
键为创建表时某字段的键属性, 通常设置为PRIMARY KEY
, 当字段设置成该属性时表示该列的每一个数据是唯一不可重复的;
-
遇到重复键则忽略
INSERT IGNORE INTO table_name [(column1, column2, ...)] VALUES (value1, value2, ...);
举例:
mysql> SELECt * FROM class_1; +----------+-------+ | name | sex | +----------+-------+ | ZhangSan | Man | | LiSi | Man | | WangWu | Women | | ZhaoLiu | Man | +----------+-------+ 4 rows in set (0.00 sec)mysql> ALTER TABLE class_1 MODIFY name VARCHAR(20) PRIMARY KEY NOT NULL; Query OK, 4 rows affected (0.05 sec) Records: 4 Duplicates: 0 Warnings: 0mysql> mysql> DESC class_1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | PRI | NULL | | | sex | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)mysql> mysql> mysql> INSERT IGNORE INTO class_1 VALUES ('ZhangSan', 'Man'), ('LiuYi', 'Women'), ('ChenEr', 'Women'); Query OK, 2 rows affected, 1 warning (0.00 sec) Records: 3 Duplicates: 1 Warnings: 1mysql> SELECt * FROM class_1; +----------+-------+ | name | sex | +----------+-------+ | ChenEr | Women | | LiSi | Man | | LiuYi | Women | | WangWu | Women | | ZhangSan | Man | | ZhaoLiu | Man | +----------+-------+ 6 rows in set (0.00 sec)
-
遇到重复键则更新现有行
INSERT INTO table_name [(column1, column2, .../*其他列*/)] VALUES (value1, value2, .../*其他数据*/), .../*多行数据*/ ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, .../*其他需要更新的字段*/;
举例:
mysql> DESC class_1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | PRI | NULL | | | sex | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)mysql> SELECT * FROM class_1; +----------+-------+ | name | sex | +----------+-------+ | ChenEr | Women | | LiSi | Man | | LiuYi | Women | | WangWu | Women | | ZhangSan | Man | | ZhaoLiu | Man | +----------+-------+ 6 rows in set (0.00 sec)mysql> INSERT INTO class_1 (name, sex) VALUES('LiSi','Women'), ('SunQi','Man') ON DUPLICATE KEY UPDATE name='XXX', sex='xxx'; Query OK, 3 rows affected (0.00 sec) Records: 2 Duplicates: 1 Warnings: 0 mysql> SELECT * FROM class_1; +----------+-------+ | name | sex | +----------+-------+ | ChenEr | Women | | LiuYi | Women | | SunQi | Man | | WangWu | Women | | XXX | xxx | | ZhangSan | Man | | ZhaoLiu | Man | +----------+-------+ 7 rows in set (0.00 sec)
-
替换已存在的行(先删除再插入)
REPLACE INTO table_name [(column1, column2, ...)] VALUES (value1, value2, ...);
该操作与
ON DUPLICATE KEY UPDATE
不同的是前者只是删除该行数据(包括主键)再重新填入, 后者是更新整行(或一行中指定列名)的数据;有力的证据如下:
mysql> SELECT * FROM test; +----+----------+ | id | name | +----+----------+ | 1 | LiuYi | | 2 | ChenEr | | 3 | ZhangSan | | 4 | LiSi_2 | +----+----------+ 4 rows in set (0.00 sec)mysql> REPLACE INTO test VALUES(4, 'LiSi_2'); Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO test VALUES(4, 'LiSi_1') ON DUPLICATE KEY UPDATE name='LiSi_2'; Query OK, 0 rows affected (0.00 sec)
执行了
REPLACE INTO
插入的数据与表中对应主键原有的数据相同, 但是还是出现了:Query OK, 1 row affected (0.01 sec)
说明一行有受影响, 而一行受影响就是删除了该列的数据(包括主键)后再次插入了数据;
但执行的
ON DUPLICATE KEY UPDATE
的操作同样插入主键和值都相同的数据结果为:Query OK, 0 rows affected (0.00 sec)
说明零行受影响;
数据删除
基本删除
DELETE FROM table_name [WHERE condition];
-- [] 内为可选项
-- 当WHERE条件可选项存在时表示只删除满足条件的内容
-- 当WHERE条件可选项不存在时表示删除table_name中的所有已有数据, 即删除所有行(慎用!)
举例:
mysql> SELECT * FROM test;
+----+----------+
| id | name |
+----+----------+
| 1 | LiuYi |
| 2 | ChenEr |
| 3 | ZhangSan |
| 4 | LiSi_2 |
+----+----------+
4 rows in set (0.00 sec)mysql> DELETE FROM test WHERE id=1;
Query OK, 1 row affected (0.01 sec)mysql> SELECT * FROM test;
+----+----------+
| id | name |
+----+----------+
| 2 | ChenEr |
| 3 | ZhangSan |
| 4 | LiSi_2 |
+----+----------+
3 rows in set (0.00 sec)mysql> DELETE FROM test;
Query OK, 3 rows affected (0.00 sec)mysql> SELECT * FROM test;
Empty set (0.00 sec)
一般情况下主要语法为DELETE FROM table_name
, 但在某些时候需要在DELETE
后跟表名, 主要是两种情况:
- 需要删除多张表内的数据
JOIN
关联多张表时表内的字段存在歧义(如table1
与table2
表中都存在名为id
的field
, 这种重复的情况被称为字段歧义);
使用JOIN
删除
一般使用JOIN
删除时表示删除该表与另一张表内容相关联的内容, 主要的删除依旧采用DELETE FROM
, 但通过JOIN
来相关联另一张表;
当前表的结构为如下:
mysql> SHOW CREATE TABLE test1\G
*************************** 1. row ***************************Table: test1
Create Table: CREATE TABLE `test1` (`id` int NOT NULL DEFAULT '0',`name` varchar(10) COLLATE utf8mb3_croatian_ci NOT NULL,`age` int DEFAULT NULL COMMENT 'ageTest'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_croatian_ci
1 row in set (0.00 sec)mysql> SHOW CREATE TABLE test2\G
*************************** 1. row ***************************Table: test2
Create Table: CREATE TABLE `test2` (`ccc` int DEFAULT NULL,`id` int NOT NULL DEFAULT '0',`name` varchar(10) COLLATE utf8mb3_croatian_ci NOT NULL,`a1` varchar(20) COLLATE utf8mb3_croatian_ci DEFAULT NULL,`a2` varchar(10) COLLATE utf8mb3_croatian_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_croatian_ci
1 row in set (0.00 sec)mysql> SELECT * FROM test1;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | LiuYi | NULL |
| 2 | ChenEr | NULL |
| 3 | ZhangSan | NULL |
| 4 | LiSi_2 | NULL |
+----+----------+------+
4 rows in set (0.00 sec)mysql> SELECT * FROM test2;
+------+----+----------+------+------+
| ccc | id | name | a1 | a2 |
+------+----+----------+------+------+
| NULL | 1 | LiuYi | NULL | NULL |
| NULL | 2 | ChenEr | NULL | NULL |
| NULL | 3 | ZhangSan | NULL | NULL |
| NULL | 4 | LiSi_2 | NULL | NULL |
+------+----+----------+------+------+
4 rows in set (0.00 sec)
单张表JOIN
删除
DELETE t1 FROM table1 t1 JOIN table2 t2 ON t1.field=t2.field WHERE t2.field='value';
-
解释:
删除操作主要依靠
DELETE xxx FROM
;table1 t1/table2 t2
表示为table1
创建别名为t1
,table2
创建别名为t2
;ON t1.field = t2.field
表示表t1
的某些字段与t2
的某些字段相等, 这里不仅仅只可使用=
, 这里只是条件, 也可使用其他作为条件, 本身是弹性的, 其中这里的ON
表示一些附加条件, 实际上t1.field=t2.field
就是这里的附加条件;在上述条件结束后通过
WHERE
字段筛出最后的条件即t2.field='value'
, 本身这里的条件也是弹性的;筛选出来的结果最终被
DELETE t1
删除;可以理解为类似这种框架:
DELETE t1 FROM {{{(table1 t1) JOIN (table2 t2)}ON (t1.field=t2.field)} WHERE(t2.field='value') };
主要操作还是依靠
DELETE ... FROM
来删除, 后面的只是条件筛选, 当然可以把需要展示的内容通过SELECT
投影出来;SELECT {* or t1.field1, t1.field2, ...} FROM table1 t1 JOIN table2 t2 ON t1.field=t2.field WHERE t2.field='value';
-
示例
根据上文所提供的例子进行示例:
mysql> SELECT * FROM test1; # 展示test1表的数据 +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | LiuYi | NULL | | 2 | ChenEr | NULL | | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 4 rows in set (0.00 sec)mysql> SELECT * FROM test2; # 展示test2表的数据 +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 1 | LiuYi | NULL | NULL | | NULL | 2 | ChenEr | NULL | NULL | | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 4 rows in set (0.00 sec)mysql> SELECT t1.id, t1.name FROM test1 t1 JOIN test2 t2 ON t1.id=t2.id WHERE t2.id IN (1,2); # 查询表内相关数据, 即符合条件的test1的id与name字段数据 +----+--------+ | id | name | +----+--------+ | 1 | LiuYi | | 2 | ChenEr | +----+--------+ 2 rows in set (0.00 sec)mysql> DELETE t1 FROM test1 t1 JOIN test2 t2 ON t1.id=t2.id WHERE t2.id IN (1,2);# 执行删除操作 Query OK, 2 rows affected (0.00 sec)mysql> SELECT * FROM test1; # 删除后展示test1表内数据 +----+----------+------+ | id | name | age | +----+----------+------+ | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 2 rows in set (0.00 sec)mysql> SELECT * FROM test2; # 删除后展示test2表内数据 +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 1 | LiuYi | NULL | NULL | | NULL | 2 | ChenEr | NULL | NULL | | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 4 rows in set (0.00 sec)mysql>
多张表JOIN
删除
多张表JOIN
删除与单张表的删除方式相同, 唯一不同的是DELETE
后跟的table
数量;
DELETE t1, t2, ... FROM table1 t1 JOIN table2 t2, ... ON t1.field=t2.field WHERE t2.field='value';
该段SQL
语句的解释可看上文;
-
示例:
mysql> SELECT * FROM test2; +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 1 | LiuYi | NULL | NULL | | NULL | 2 | ChenEr | NULL | NULL | | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 4 rows in set (0.00 sec)mysql> DROP TABLE test1; Query OK, 0 rows affected (0.01 sec)mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | LiuYi | NULL | | 2 | ChenEr | NULL | | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 4 rows in set (0.00 sec)mysql> DELETE t1, t2 FROM test1 t1 JOIN test2 t2 ON t1.id = t2.id WHERE t1.id IN (1,2); Query OK, 4 rows affected (0.00 sec)mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 2 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 2 rows in set (0.00 sec)mysql>
此处将
test1
与test2
两张表中相应的数据都进行了删除;
使用子查询删除
同样删除使用DELETE FROM
;
使用该方法时主要通过子查询方式来筛选(确认)需要删除表的某行数据;
DELETE FROM table_name WHERE field_name IN (SELECT field_name FROM another_table WHERE condition);
- 示例:
mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 2 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 2 rows in set (0.00 sec)mysql> DELETE FROM test1 WHERE id IN (3); Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM test1; +----+--------+------+ | id | name | age | +----+--------+------+ | 4 | LiSi_2 | NULL | +----+--------+------+ 1 row in set (0.00 sec)mysql> DELETE FROM test1 WHERE id IN (SELECT id FROM test2 WHERE id=4); Query OK, 1 row affected (0.01 sec)mysql> SELECT * FROM test1; Empty set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 2 rows in set (0.00 sec)
PS:
这里需要补充的是在MySQL
中IN
和ON
的区别:
ON
通常表示补充的条件(连接条件),IN
通常表示一组字段的值是否存在一组指定的数据中;
快速清空
TRUNCATE TABLE table_name;
该方法比DELETE
更快速, 缺点是无法回滚ROLLBACK
;
-
示例:
mysql> SELECT * FROM test2; +------+----+----------+------+------+ | ccc | id | name | a1 | a2 | +------+----+----------+------+------+ | NULL | 3 | ZhangSan | NULL | NULL | | NULL | 4 | LiSi_2 | NULL | NULL | +------+----+----------+------+------+ 2 rows in set (0.00 sec)mysql> TRUNCATE TABLE test2; Query OK, 0 rows affected (0.02 sec)mysql> SELECT * FROM test2; Empty set (0.00 sec)
数据修改
使用UPDATE
更新
UPDATE table_name SET field_name1 = value1, field_name2 = value2, ... [WHERE condition];
WHERE condition
为可选项, 该可选项选择与不选择有差异;
-
选择时
选择可选项
WHERE condition
时WHERE
后跟条件, 表示更新条件符合的行的数据;mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | LiuYi | NULL | | 2 | ChenEr | NULL | | 3 | ZhangSan | NULL | | 4 | LiSi_2 | NULL | +----+----------+------+ 4 rows in set (0.01 sec)mysql> UPDATE test1 SET name='LiSi' WHERE id=4; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | LiuYi | NULL | | 2 | ChenEr | NULL | | 3 | ZhangSan | NULL | | 4 | LiSi | NULL | +----+----------+------+ 4 rows in set (0.00 sec)
-
不选择
不选择时默认表示对表内所有行内数据进行更新;
mysql> SELECT * FROM test1; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | LiuYi | NULL | | 2 | ChenEr | NULL | | 3 | ZhangSan | NULL | | 4 | LiSi | NULL | +----+----------+------+ 4 rows in set (0.00 sec)mysql> UPDATE test1 SET name='Who'; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0mysql> SELECT * FROM test1; +----+------+------+ | id | name | age | +----+------+------+ | 1 | Who | NULL | | 2 | Who | NULL | | 3 | Who | NULL | | 4 | Who | NULL | +----+------+------+ 4 rows in set (0.00 sec)
使用表达式更新
使用表达式更新一般是表达式或者函数的方式进行更新;
-
表达式更新
UPDATE table_name SET field_name1 = field_name1 + 10, field_name2 = field_name2 * 2, ... WHERE condition;
举例:
mysql> SELECT * FROM test2; +------+----+----------+------+------+------+ | ccc | id | name | a1 | a2 | num | +------+----+----------+------+------+------+ | NULL | 1 | LiuYi | NULL | NULL | 10 | | NULL | 2 | ChenEr | NULL | NULL | 10 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | | NULL | 4 | LiSi_2 | NULL | NULL | 10 | +------+----+----------+------+------+------+ 4 rows in set (0.00 sec)mysql> UPDATE test2 SET num=num*1.8, id=id+1 WHERE name='LiSi_2'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test2; +------+----+----------+------+------+------+ | ccc | id | name | a1 | a2 | num | +------+----+----------+------+------+------+ | NULL | 1 | LiuYi | NULL | NULL | 10 | | NULL | 2 | ChenEr | NULL | NULL | 10 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | +------+----+----------+------+------+------+ 4 rows in set (0.00 sec)mysql>
-
用函数更新
更新方式相同, 只是数据的来源不同, 此处数据更新的来源于函数;
UPDATE table_name SET dat=NOW() [WHERE condition];
-
示例
mysql> DESC test2; +-------+-------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------------------+-------+ | ccc | int | YES | | NULL | | | id | int | NO | | 0 | | | name | varchar(10) | NO | | NULL | | | a1 | varchar(20) | YES | | NULL | | | a2 | varchar(10) | YES | | NULL | | | num | int | YES | | 10 | | | dat | datetime | YES | | 2001-01-01 08:00:01 | | +-------+-------------+------+-----+---------------------+-------+ 7 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+------+---------------------+ | ccc | id | name | a1 | a2 | num | dat | +------+----+----------+------+------+------+---------------------+ | NULL | 1 | LiuYi | NULL | NULL | 10 | 2025-09-22 00:00:00 | | NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 | +------+----+----------+------+------+------+---------------------+ 4 rows in set (0.00 sec)mysql> UPDATE test2 SET dat=NOW() WHERE ccc is NULL AND name='ZhangSan'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test2; +------+----+----------+------+------+------+---------------------+ | ccc | id | name | a1 | a2 | num | dat | +------+----+----------+------+------+------+---------------------+ | NULL | 1 | LiuYi | NULL | NULL | 10 | 2025-09-22 00:00:00 | | NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | 2025-09-22 19:56:46 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 | +------+----+----------+------+------+------+---------------------+ 4 rows in set (0.00 sec)
-
使用JOIN
更新多张表
使用JOIN
关联两张表, 两张表相互给予条件与数据从而能够达到JOIN
更新多张表, 一般适用于外键约束等表与表中存在关系的情况;
UPDATE table1 t1 JOIN table2 t2 ON t1.id = t2.table1_id SET t1.field1='value', t2.field2='value' WHERE condition;
-
示例:
mysql> SELECT * FROM test1; +----+------+------+ | id | name | age | +----+------+------+ | 1 | Who | 10 | | 2 | Who | NULL | | 3 | Who | NULL | | 4 | Who | NULL | +----+------+------+ 4 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+------+---------------------+ | ccc | id | name | a1 | a2 | num | dat | +------+----+----------+------+------+------+---------------------+ | NULL | 1 | LiuYi | NULL | NULL | 10 | 2025-09-22 00:00:00 | | NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | 2025-09-22 19:56:46 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 | +------+----+----------+------+------+------+---------------------+ 4 rows in set (0.00 sec)mysql> UPDATE test2 t2 JOIN test1 t1 ON t1.age=t2.num SET t1.age=15, t2.num=18 WHERE t2.name='LiuYi' AND t1.id=1; Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0mysql> SELECT * FROM test1; +----+------+------+ | id | name | age | +----+------+------+ | 1 | Who | 15 | | 2 | Who | NULL | | 3 | Who | NULL | | 4 | Who | NULL | +----+------+------+ 4 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+------+---------------------+ | ccc | id | name | a1 | a2 | num | dat | +------+----+----------+------+------+------+---------------------+ | NULL | 1 | LiuYi | NULL | NULL | 18 | 2025-09-22 00:00:00 | | NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | 2025-09-22 19:56:46 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 | +------+----+----------+------+------+------+---------------------+ 4 rows in set (0.00 sec)mysql>
使用子查询更新
更新方式相同, 数据来源不同, 数据来源于子查询结果与WHERE
条件配合的方式;
UPDATE table_name SET column1 = (SELECT field FROM author_table WHERE condition) WHERE condition;
-
示例:
mysql> SELECT * FROM test1; +----+------+------+ | id | name | age | +----+------+------+ | 1 | Who | 15 | | 2 | Who | NULL | | 3 | Who | NULL | | 4 | Who | NULL | +----+------+------+ 4 rows in set (0.00 sec)mysql> SELECT * FROM test2; +------+----+----------+------+------+------+---------------------+ | ccc | id | name | a1 | a2 | num | dat | +------+----+----------+------+------+------+---------------------+ | NULL | 1 | LiuYi | NULL | NULL | 18 | 2025-09-22 00:00:00 | | NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 | | NULL | 3 | ZhangSan | NULL | NULL | 10 | 2025-09-22 19:56:46 | | NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 | +------+----+----------+------+------+------+---------------------+ 4 rows in set (0.00 sec)mysql> UPDATE test1 t1 SET t1.name=(SELECT t2.name FROM test2 t2 WHERE t2.id=5 ) WHERE t1.id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | LiSi_2 | 15 | | 2 | Who | NULL | | 3 | Who | NULL | | 4 | Who | NULL | +----+--------+------+ 4 rows in set (0.00 sec)mysql>
使用CASE
语句进行条件更新
通过CASE
语句对不同条件的内容进行更新;
mysql> SELECT * FROM test2;
+------+----+----------+------+------+------+---------------------+
| ccc | id | name | a1 | a2 | num | dat |
+------+----+----------+------+------+------+---------------------+
| NULL | 1 | LiuYi | NULL | NULL | 18 | 2025-09-22 00:00:00 |
| NULL | 2 | ChenEr | NULL | NULL | 10 | 2015-01-01 00:00:00 |
| NULL | 3 | ZhangSan | NULL | NULL | 10 | 2025-09-22 19:56:46 |
| NULL | 5 | LiSi_2 | NULL | NULL | 18 | 2015-01-01 00:00:00 |
+------+----+----------+------+------+------+---------------------+
4 rows in set (0.00 sec)mysql> UPDATE test2 SET num=CASE-> WHEN id=1 THEN num*1-> WHEN id=2 THEN num*2-> WHEN id=3 THEN num*3-> WHEN id=4 THEN num*4-> ELSE num*5-> END;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 4 Changed: 3 Warnings: 0mysql> SELECT * FROM test2;
+------+----+----------+------+------+------+---------------------+
| ccc | id | name | a1 | a2 | num | dat |
+------+----+----------+------+------+------+---------------------+
| NULL | 1 | LiuYi | NULL | NULL | 18 | 2025-09-22 00:00:00 |
| NULL | 2 | ChenEr | NULL | NULL | 20 | 2015-01-01 00:00:00 |
| NULL | 3 | ZhangSan | NULL | NULL | 30 | 2025-09-22 19:56:46 |
| NULL | 5 | LiSi_2 | NULL | NULL | 90 | 2015-01-01 00:00:00 |
+------+----+----------+------+------+------+---------------------+
4 rows in set (0.00 sec)mysql>