当前位置: 首页 > news >正文

『 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关联多张表时表内的字段存在歧义(如table1table2表中都存在名为idfield, 这种重复的情况被称为字段歧义);

使用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> 
    

    此处将test1test2两张表中相应的数据都进行了删除;


使用子查询删除

同样删除使用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:
这里需要补充的是在MySQLINON的区别:

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 conditionWHERE后跟条件, 表示更新条件符合的行的数据;

    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> 
http://www.dtcms.com/a/394895.html

相关文章:

  • 3005. 最大频率元素计数
  • ACP(七)优化RAG应用提升问答准确度
  • 鸿蒙:使用bindPopup实现气泡弹窗
  • Langchan4j 框架 AI 无限循环调用文件创建工具解决方案记录
  • Python GIS 开发里最核心的4个基础组件(理论+实操篇)
  • 关于跨域和解决方案
  • 学习日报 20250921|LoadingCache
  • 聚力赋能|竹云受邀出席2025华为全联接大会
  • 抓取 Dump 文件与 WinDbg 使用详解:定位 Windows 程序异常的利器
  • 计算机组成原理:指令周期
  • 老题新解|简单算术表达式求值
  • RustFS与其他新兴存储系统(如SeaweedFS)相比有哪些优势和劣势?
  • WPS标点符号换行问题解决
  • 开发团队的文档自动化革命:WPS+cpolar实战录
  • 【Linux】文本编辑器Vim
  • flink1.18下游配置多个sink
  • 如何删除 MySQL 数据库中的所有数据表 ?
  • win10加域后,控制面板中的,internet 时间就没有了
  • Unity移动平台笔记
  • 【图像算法 - 27】基于YOLOv12与OpenCV的无人机智能检测系统
  • html css js网页制作成品——圣罗兰护肤html+css+js 4页附源码
  • 21届-3年-Java面经-华为od
  • 计算机视觉(opencv)实战三十一——CascadeClassifier 详解与实战人脸检测
  • 计算机视觉:基于YOLOv11 实例分割与OpenCV 在 Java 中的实现图像实例分割
  • 【实战】Spring Boot 3.x整合Redis:注解式缓存与分布式锁最佳实践
  • 密钥耳语-一个轻量、易备份、支持命令行与图形界面的口令派生加密工具 具有 CLI 和 GUI 的轻量级密码衍生加密工具
  • AI重塑流量背后,微软广告打造下一代广告生态
  • 低代码数字化时代的开发新范式
  • 微信小程序“无损去水印精灵”技术解析大纲
  • 少儿舞蹈小程序(18)订单确认