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里面的字段,

[html]  view plain  copy
  1. update tablename1 a,tablename2 b   
[html]  view plain  copy
  1. set a.grouping=b.grouping,a.size=b.size,a.description=b.description  
  2. where a.catalog=b.catalog and a.`schema`=b.`schema` and a.name=b.name  
当然多表更新,还有其他的方法,具体方法说明如下:

方法一:直接更新,同上面一样:

[sql]  view plain  copy
  1. UPDATE product p, productPrice pp  
  2. SET pp.price = pp.price * 0.8  
  3. WHERE p.productId = pp.productId  
  4. AND p.dateCreated < '2014-01-01'  

方法二:使用inner Join,然后更新:

[sql]  view plain  copy
  1. UPDATE product p  
  2. INNER JOIN productPrice pp  
  3. ON p.productId = pp.productId  
  4. SET pp.price = pp.price * 0.8  
  5. WHERE p.dateCreated < '2014-01-01'  

方法三:使用left join,然后更新:

[sql]  view plain  copy
  1. UPDATE product p  
  2. LEFT JOIN productPrice pp  
  3. ON p.productId = pp.productId  
  4. SET p.deleted = 1  
  5. WHERE pp.productId IS null  

其实MySQL还可以同时更新两张表的数据的,如下:

[sql]  view plain  copy
  1. UPDATE product p  
  2. INNER JOIN productPrice pp  
  3. ON p.productId = pp.productId  
  4. SET pp.price = pp.price * 0.8,  
  5. p.dateUpdate = CURDATE()  
  6. WHERE p.dateCreated < '2014-01-01'  
mysql关联多表进行update更新操作
UPDATE Track
INNER JOIN MV
ON Track.trkid=MV.mvid
SET Track.is_show=MV.is_show
WHERE trkid<6

等同于

UPDATE Track,MV
SET Track.is_show=MV.is_show
WHERE Track.trkid=MV.mvid and trkid<6

【扩展】
根据结果集进行update更新操作
原表信息
表1: am_favorites_4

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

表2: am_tag_user_4

am_tag_user_4

atu_user_id

atu_tag_id

atu_num

374

0

9

374

89

9


更新结果目标表: am_tag_user_4

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=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,如果之前有事情其它数据库产品的习惯在这里要注意了。

 

猜你喜欢

转载自blog.csdn.net/wrh_csdn/article/details/79730554