mysql update 语句 子查询(带条件)

本文介绍了如何在MySQL中使用update语句进行特殊操作,包括单表中一列值赋给另一列以及多表间列值的相互赋值。通过示例说明了如何在单表情况下将books的simple_name赋值给full_name,以及在多表情况下,如何根据book_order表的full_name更新book表的full_name字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

update语句介绍
这是官网对update的介绍UPDATE Statement
开发中,一般我们都是写这种 update table a set field =value where id=x语句
不过也会遇到特殊的.比如想把table a 中的b列赋值给c列.或者说把table c 中的d列赋值给table a中的b列,这种情况下应该怎么做呢?

情况一 单表a列赋值给b列

情景:需要将书籍简称字段的值给书籍全程的字段赋值过去
首先来个简单的表结构

CREATE TABLE `book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `simple_name` varchar(10) DEFAULT NULL COMMENT '书籍简称',
  `full_name` varchar(50) DEFAULT NULL COMMENT '书籍全称',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='书籍信息表';

然后插入两条数据

INSERT INTO `book` (`id`, `simple_name`, `full_name`, `price`) VALUES ('1', '哈利波特', NULL, '12.00');
INSERT INTO `book` (`id`, `simple_name`, `full_name`, `price`) VALUES ('2', '冰与火之歌', NULL, '20.00');

效果如下
在这里插入图片描述
这时候发现full_name字段为空,这时候需要将simple_name 给赋值过去
编写sql语句:

UPDATE book a ,(SELECT simple_name,id from book) b set a.full_name =b.simple_name where a.id=b.id;

这样就可以将full_name列给赋值了.
注意表名别名要有语义

情况二 多表a表 a列赋值给b表b列

复用book表
创建一个book_order表

CREATE TABLE `book_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `book_id` int(10) DEFAULT NULL COMMENT '书籍id',
  `full_name` varchar(50) DEFAULT NULL COMMENT '书籍全称',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='书籍信息表';
INSERT INTO `book_order` (`id`, `book_id`, `full_name`, `price`) VALUES ('1', '1', '哈利波特3', '100.00');
INSERT INTO `book_order` (`id`, `book_id`, `full_name`, `price`) VALUES ('2', '2', '冰与火之歌2', '300.00');

情景:来了个需求book表中的full_name字段的值要以book_order表中的full_name为准.要问为啥就是历史遗留问题
编写sql:

UPDATE book a ,(SELECT full_name,id,book_id from book_order) b set a.full_name =b.full_name where a.id=b.book_id;

即可解决

update语法

Single-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

value:
    {expr | DEFAULT}

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

Multiple-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值