Mysql update delete
---update
UPDATE 语句用于中修改数据库表中的数据。
更新数据库中的数据
UPDATE 语句用于在数据库表中修改数据。
语法
UPDATE table_name SET column_name = new_value WHERE column_name = some_value
注释:SQL 对大小写不敏感。UPDATE 与 update 等效。
这里,关联的两张表为:tablename1、tablename2,如果需要进行关联更新tablename1里面的字段,
- update tablename1 a,tablename2 b
- set a.grouping=b.grouping,a.size=b.size,a.description=b.description
- where a.catalog=b.catalog and a.`schema`=b.`schema` and a.name=b.name
方法一:直接更新,同上面一样:
- UPDATE product p, productPrice pp
- SET pp.price = pp.price * 0.8
- WHERE p.productId = pp.productId
- AND p.dateCreated < '2014-01-01'
方法二:使用inner Join,然后更新:
- UPDATE product p
- INNER JOIN productPrice pp
- ON p.productId = pp.productId
- SET pp.price = pp.price * 0.8
- WHERE p.dateCreated < '2014-01-01'
方法三:使用left join,然后更新:
- UPDATE product p
- LEFT JOIN productPrice pp
- ON p.productId = pp.productId
- SET p.deleted = 1
- WHERE pp.productId IS null
其实MySQL还可以同时更新两张表的数据的,如下:
- UPDATE product p
- INNER JOIN productPrice pp
- ON p.productId = pp.productId
- SET pp.price = pp.price * 0.8,
- p.dateUpdate = CURDATE()
- WHERE p.dateCreated < '2014-01-01'
am_favorites_4表 | |||
af_user_id |
af_tag_id |
af_content_id |
af_content_type |
374 |
0 |
535522 |
3 |
374 |
0 |
535522 |
3 |
374 |
89 |
535522 |
3 |
am_tag_user_4表 | ||
atu_user_id |
atu_tag_id |
atu_num |
374 |
0 |
9 |
374 |
89 |
9 |
am_tag_user_4 表 | ||
atu_user_id |
atu_tag_id |
atu_num |
374 |
0 |
7 |
374 |
89 |
8 |
UPDATE am_tag_user_4 tag
INNER JOIN am_favorites_4 fav
ON tag.atu_tag_id=fav.af_tag_id and tag.atu_user_id=fav.af_user_id
INNER JOIN (SELECT af_user_id,af_tag_id,count(*) as cnt
FROM am_favorites_4,am_tag_user_4
where atu_tag_id=af_tag_id and atu_user_id=af_user_id and af_content_id = 535522 andaf_content_type=3 and af_user_id=374
group by af_user_id,af_tag_id) AS T1
ON tag.atu_tag_id=T1.af_tag_id and tag.atu_user_id=T1.af_user_id
SET tag.atu_num=tag.atu_num- T1.cnt
Solution 1: 1列
1
2
3
|
update student s, city c
set s.city_name = c. name
where s.city_code = c.code;
|
Solution 2: 多个列
1
2
3
4
|
update a, b
set a.title=b.title, a. name =b. name
where a.id=b.id
|
Solution 3: 子查询
1 |
update student s set city_name = ( select name from city where code = s.city_code);
|
我们再来看几个负责写的
例如: 把表 tk_zyt_scenery_order的 字段更新到 t_advs_order中去, 一般可能会这样写:
1
2
3
4
5
6
7
|
UPDATE t_advs_order SET
attribute1=( SELECT o.order_state FROM tk_zyt_scenery_order o WHERE o.order_id=` on `),
attribute2=( SELECT o.order_state FROM tk_zyt_scenery_order o WHERE o.order_id=` on `)
WHERE EXISTS ( SELECT o.order_state FROM tk_zyt_scenery_order o WHERE o.order_id=` on `);
|
这样效率比较低下, 优化写法:
1
2
3
4
5
|
UPDATE t_advs_order a INNER JOIN tk_zyt_scenery_order s ON s.order_id=a.` on ` SET
a.attribute1=s.order_id,
a.attribute2=s.order_id;
|
CREATE TABLE `product` ( `proID` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品表主键', `price` decimal(10,2) NOT NULL COMMENT '商品价格', `type` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `dtime` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`proID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='商品表'; CREATE TABLE `producttype` ( `ID` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `amount` int(11) COMMENT '每种类别商品总金额', UNIQUE KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品类别资金汇总表'
插入测试数据
INSERT INTO product(price,type,dtime) VALUES(10.00,0,now()),(10.00,1,now()),(10.00,1,now()),(20.00,2,now()),(30.00,3,now()); INSERT INTO producttype(ID) VALUES(1),(2),(3);
SELECT * FROM product; SELECT * FROM producttype;
单表更新操作
UPDATE product SET price='20.00',type=0 WHERE proID=2;
关联更新操作
UPDATE producttype,product SET producttype.amount=product.price where product.TYPE = producttype.ID AND product.TYPE=1;
1.查询所有字段
INSERT INTO producttype(ID) VALUES(4);
UPDATE producttype SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE);
注意:大家注意看到rows matched:4,表示符合条件的记录是4条,实际更新了三条,关联语句默认不去判断里面的关联的实际行。
2.只查询需要更新的字段
UPDATE producttype SET amount=null;
UPDATE producttype,product SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE) where product.TYPE = producttype.ID;
改用下面这种方法:Rows matched:3,查询到了符合条件的行是3行,没有查询无关联的行。
3.别名更新
update a tb1, b tb2 set tb1.num=tb1.num+tb2.num where tb1.id=tb2.id
总结
mysql的update的关联操作在5.6中后面不能直接接FROM语句,只能UPDATE 所有的连接表然后WHERE,如果之前有事情其它数据库产品的习惯在这里要注意了。
--------delete
CREATE TABLE `product` ( `proID` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品表主键', `price` decimal(10,2) NOT NULL COMMENT '商品价格', `type` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `dtime` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`proID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='商品表'; CREATE TABLE `producttype` ( `ID` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `amount` int(11) COMMENT '每种类别商品总金额', UNIQUE KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品类别资金汇总表'
插入测试数据
INSERT INTO product(price,type,dtime) VALUES(10.00,0,now()),(10.00,1,now()),(10.00,1,now()),(20.00,2,now()),(30.00,3,now()); INSERT INTO producttype(ID) VALUES(1),(2),(3);
SELECT * FROM product; SELECT * FROM producttype;
单表更新操作
UPDATE product SET price='20.00',type=0 WHERE proID=2;
关联更新操作
UPDATE producttype,product SET producttype.amount=product.price where product.TYPE = producttype.ID AND product.TYPE=1;
1.查询所有字段
INSERT INTO producttype(ID) VALUES(4);
UPDATE producttype SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE);
注意:大家注意看到rows matched:4,表示符合条件的记录是4条,实际更新了三条,关联语句默认不去判断里面的关联的实际行。
2.只查询需要更新的字段
UPDATE producttype SET amount=null;
UPDATE producttype,product SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE) where product.TYPE = producttype.ID;
改用下面这种方法:Rows matched:3,查询到了符合条件的行是3行,没有查询无关联的行。
3.别名更新
update a tb1, b tb2 set tb1.num=tb1.num+tb2.num where tb1.id=tb2.id
总结
mysql的update的关联操作在5.6中后面不能直接接FROM语句,只能UPDATE 所有的连接表然后WHERE,如果之前有事情其它数据库产品的习惯在这里要注意了。
从MySQL数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉
DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id
² 从MySQL数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉
DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.idWHERE t2.id IS NULL 或
DELETE FROM t1,USING t1 LEFT JOIN T2 ONt1.id=t2.id WHERE t2.id IS NULL
² 从两个表中找出相同记录的数据并把两个表中的数据都删除掉
DELETE t1,t2 from t1 LEFT JOIN t2 ONt1.id=t2.id WHERE t1.id=25(注意此处的delete t1,t2 from 中的t1,t2不能是别名)
如:delete t1,t2 from table_name as t1left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本不小于5.0在5.0中是可以的)
上述语句改写成
delete table_name,table2_name fromtable_name as t1 left join table2_name as t2 on t1.id=t2.id wheretable_name.id=25 在数据里面执行是错误的(MySQL 版本小于5.0在5.0中是可以的)
² 两张表关联删除:
DELETE a,b FROM table1 a INNER JOIN table2 b ON a.id = b.aid WHERE a.id = '1'或DELETE a,b FROM table1a,table2 b WHERE a.id = b.aid AND a.id = '1'
² 三张表删除:
DELETE a,b,c FROM table1 a INNER JOIN table2 b ON a.id = b.aid
INNER JOIN table3 c ON a.id = c.aid WHERE a.id = '1'
不过这样有一个问题,就是如果a表里数据,而b表或者c表里没数据,那么整个删除就失败,即删除0条数据
如果你的主表一定有数据,而关联的表有可能有数据也有可能没数据的话,我们可以通过左连接删除的方式,把两张表都删除。无论关联的表有没有数据,主表都可以删除成功
DELETE a ,b ,c FROM table1 a LEFT JOIN table2 b ONa.id = b.aid
LEFT JOIN table3 c ON a.id = c.aid WHERE a.id = 1
CREATE TABLE `product` ( `proID` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品表主键', `price` decimal(10,2) NOT NULL COMMENT '商品价格', `type` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `dtime` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`proID`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='商品表'; CREATE TABLE `producttype` ( `ID` int(11) NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)', `amount` int(11) COMMENT '每种类别商品总金额', UNIQUE KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品类别资金汇总表'
插入测试数据
INSERT INTO product(price,type,dtime) VALUES(10.00,0,now()),(10.00,1,now()),(10.00,1,now()),(20.00,2,now()),(30.00,3,now()); INSERT INTO producttype(ID) VALUES(1),(2),(3);
SELECT * FROM product; SELECT * FROM producttype;
单表更新操作
UPDATE product SET price='20.00',type=0 WHERE proID=2;
关联更新操作
UPDATE producttype,product SET producttype.amount=product.price where product.TYPE = producttype.ID AND product.TYPE=1;
1.查询所有字段
INSERT INTO producttype(ID) VALUES(4);
UPDATE producttype SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE);
注意:大家注意看到rows matched:4,表示符合条件的记录是4条,实际更新了三条,关联语句默认不去判断里面的关联的实际行。
2.只查询需要更新的字段
UPDATE producttype SET amount=null;
UPDATE producttype,product SET producttype.amount= (SELECT ifnull(SUM(product.price),0.00) FROM product WHERE product.TYPE = producttype.ID GROUP BY product.TYPE) where product.TYPE = producttype.ID;
改用下面这种方法:Rows matched:3,查询到了符合条件的行是3行,没有查询无关联的行。
3.别名更新
update a tb1, b tb2 set tb1.num=tb1.num+tb2.num where tb1.id=tb2.id
总结
mysql的update的关联操作在5.6中后面不能直接接FROM语句,只能UPDATE 所有的连接表然后WHERE,如果之前有事情其它数据库产品的习惯在这里要注意了。