merge into 用法详解

一、用途

可以同时从1个或者多个源头对表进行更新或者插入,删除  经常用于操作大量的数据,即对于大批量的数据更新、插入时效率极高。

二、语法

merge into table_name  alias1   --需要操作的表 可以用别名
using (table|view|sub_query) alias2      --数据来源 可以是表、视图、子查询
on (join condition)   --关联条件
when matched then              --当关联条件成立时 更新,删除,插入的where部分为可选 
  update  table_name set  col1=colvalue  where……
   --更新
   delete from table_name  where  col2=colvalue  where……--删除  可以只更新 删除 也可以只删除不更新
when not matched then      --当关联条件不成立时   0racle 10  以后 此处可以不用 
  insert (col3) values (col3values)  where……;

注意
1、只会操作“操作表”,源表不会有任何变化
2、不一定要把update,delete,insert 操作都写全,可以根据实际情况

三、实例演示

有三张表 部门表dept (部门id,部门名称),工资表salary(员工id,工资),
员工表 employess(员工id,姓名,职位,部门,工作年限)
具体数据如下:
部门表dept:
这里写图片描述
工资表salary:
这里写图片描述
员工表employess:

这里写图片描述
可知工资表中还没有诸葛亮 的信息,现在要求我们将工资表中删除马畜的工资信息,并将部门名称是销售部职位是员工的工资提升20%(注意这里我们并不知道信息技术部的部门代码,还是需要关联部门信息表),插入工号1012,工资为6000。
如果没有merge into 我们需要分开执行三个sql,分开写的sql如下:

  --删除
  delete from salary t
   where exists (select 1
            from employess a
           where a.e_id = t.e_id
             and a.e_name = '张飞')
   --更新
             update salary t
              set t.e_sal = t.e_id * 1.2
            where exists (select 1
                     from employess a, dept b
                    where a.e_id = t.e_id
                      and a.d_id = b.dept_id
                      and a.e_position = '员工'
                      and b.d_name = '销售部')

    --插入
   insert into salary values('1012',6000);

但是有了merge into,我们可以一个sql搞定:

            merge into salary t
            using (select t1.e_id,
                          t1.e_name,
                          t1.e_position,
                          t2.dept_id,
                          t2.d_name
                     from employess t1, dept t2
                    where t1.d_id = t2.dept_id) e
            on (t.e_id = e.e_id)
            when matched then
              update
                 set t.e_sal = t.e_sal * 1.2
               where e.e_position = '员工'
                 and e.d_name = '销售部' 
               delete where (e.e_name='张飞')
            when not matched
               then
              insert (e_id, e_sal) values ('1012', 6000);

执行结果
这里写图片描述‘’
可知 工资表中 工号1011的 张飞信息已被删除
并把1010的工资加了300同时 增加了1012的工资信息

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的中年程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值