2023-11-24--oracle--实验--[Merge 语句]

oracle--实验---Merge语句

1.认知Merge 语句

merge 语句是 sql 语句的一种。在 SQL server Oracle 数据库中可用, MySQL 中不可用。
merge 用来合并 update insert 语句。目的:通过 merge 语句,根据一张表( 原数据表, source table 对另外一张( 目标表, target table 表进行查询,连接条件 匹配上 的进行 update 无法匹配 的执行 INSERT 。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于 insert+update
何为匹配,何为不匹配?

/*示例程序块2 重要*/

sql 复制代码
/*示例程序块2   重要*/
  DECLARE
	    v_xm varchar2(8):='Jame';
		v_zym varchar2(10):='计算机';
		v_zxf number(2):=45;    /*定义变量类型*/
	BEGIN
               UPDATE XS  SET zxf=v_zxf
		           WHERE xm=v_xm;
    		IF SQL%NOTFOUND THEN
                DBMS_OUTPUT.PUT_LINE('没有该人,需要插入该人');
		      INSERT INTO XS(XH,XM,ZYM,ZXF)          VALUES('007',v_xm,v_zym,v_zxf);
	    END IF;
end;      

Merge应用场合

sql 复制代码
构建平台
create table PRODUCTS
    (
    PRODUCT_ID             INTEGER,
    PRODUCT_NAME      VARCHAR2(60),
    CATEGORY                VARCHAR2(60)
    );

create table NEWPRODUCTS
    (
    PRODUCT_ID                 INTEGER,
    PRODUCT_NAME          VARCHAR2(60),
    CATEGORY                    VARCHAR2(60)
    );

构建平台

sql 复制代码
        insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');    insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');    insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');    insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');    commit;


          Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');    insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');    insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');    commit;

Merge 用法--1

Merge 根据对 源表 联接的结果对 目标表 执行修改操作 ( 插入,更新,删除 )
应用场合:对于特定的数据,在 一次批量操作 过程中 ,如果数据已经 存在 ,则对存在的数据按照现有情况进行 更新 ,如果不存在,则需要将数据添加到数据库的表中。
具体操作: - 根据与 源表 联接的结果,对 目标表 执行插入、更新或删除操作。

Merge 语句:

sql 复制代码
Merge 插入记录、更新记录的语法格式:

•MERGE INTO tdest d
 USING  tsrc  s
    ON  (s.srckey = d.destkey)
          WHEN NOT MATCHED THEN
            INSERT  (destkey, destdata) VALUES  (srckey, srcdata)
•        WHEN MATCHED THEN
             UPDATE SET   d.destdata = d.destdata + s.srcdata;
•--  USING 子句用于指定要与目标联接的数据源。
•--  ON 子句用于指定决定目标与源的匹配位置的联接条件。
•--  WHEN 子句用于根据ON 子句的结果指定要执行的操作。

注意:当数据不匹配时,执行insert 语句的不同(省略了into 和

目标 表的名称);

当数据匹配时,执行update 语句的不同(省略了update之后的

目标表名称)。

使用表时必须使用表的别名。

Merge 用法--2

考虑有可能的情况是:

1. 原表 xs_s 中有该学生,但是 目的表 xs_d 中没有该学生 ,则需要将 原表中的学生 insert 到目的表

2. 原表 xs_s 有该学生,而且 xs_d 中也有该学生 ,则需要根据 原表中的学生信息 update 目的表,或者删除目的表中的部分记录
检查表 XS_JSJ 中的数据是否和表 XS 的数据相匹配,

如果匹配则使用 INSERT 子句执行插入数据行。

搭建平台 :create table xs1 as select * from xs ;

•INSERT INTO XS1(XH,XM,ZYM,XB,CSSJ,ZXF)
• VALUES(007' ,'test', '计算机','男', TO_DATE('19900130','YYYYMMDD'),36);
已知条件: 存在两个表 xs_s xs_d , 两个表的结构一致,内容

不统一。目前的想法是,合并两个表中所有的记录到 xs_d 中。

sql 复制代码
-- 使用MERGE语句XS_JSJ表中新增的数据插入表XS中:
		    MERGE INTO XS a
                  USING XS1  b
                  ON(a.XH=b.XH)
		    WHEN NOT MATCHED THEN             INSERT(a.xh,a.xm,a.zym,a.xb,a.cssj,a.zxf)
		    Values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf);

    

Merge 用法--3

构建平台

sql 复制代码
-- 构建平台
create table PRODUCTS
    (
    PRODUCT_ID             INTEGER,
    PRODUCT_NAME      VARCHAR2(60),
    CATEGORY                VARCHAR2(60)
    );

create table NEWPRODUCTS
    (
    PRODUCT_ID                 INTEGER,
    PRODUCT_NAME          VARCHAR2(60),
    CATEGORY                    VARCHAR2(60)
    );

构建平台

sql 复制代码
-- 构建平台

        insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');    insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');    insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');    insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');    commit;


          Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');    insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');    insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');    insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');    commit;

具体实现:

sql 复制代码
-- 具体实现: 
begin
      insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');
      insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');
      insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');
      insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');
      insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');
      commit;
      Insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');
      insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');
      insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');
      insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');
      commit;
    end;

Merge 用法--4

说明:products为目标表,newproducts为源表,则若产品号相匹配,根据源表信息修改目标表的产品名(product_name)和产品类别(category)

sql 复制代码
merge into products p
     using newproducts np
          on (p.product_id=np.product_id)
when matched then
           update set
           p.product_name=np.product_name,
           p.category=np.category;


•加结果图和表原始数据图
•强调目标表
说明:products为目标表,newproducts为源表,则若产品号不匹配,则根据源表将新的纪录添加到目标表。

sql 复制代码
Merge into products p
 using newproducts np
  on (p.product_id = np.product_id)
   when  not matched then
     insert 
       values (np.product_id,np.product_name,
     np.category);

Merge 用法--5

sql 复制代码
-- 一个merge例子带update,delete 和insert 三种操作。
MERGE INTO products p
 USING newproducts np
 ON (p.product_id = np.product_id)
  WHEN MATCHED THEN
     UPDATE
    SET p.product_name = np.product_name,
    p.category = np.category
    DELETE WHERE (p.category = 'ELECTRNCS')
 WHEN NOT MATCHED THEN
    INSERT
    VALUES (np.product_id, np.product_name, np.category)

2.实验--实战

首先导入xskc.dmp文件

导入xskc.dmp文件:

输入命令:

sql 复制代码
SQL> $imp system/test tables=(xs,kc,xs_kc) file=C:\xskc.dmp

测试是否成功:

输入查询语句:

sql 复制代码
SQL> select * from xs;
相关推荐
发仔1234 小时前
Oracle与MySQL核心差异对比
mysql·oracle
GEEK零零七4 小时前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode
椰椰椰耶5 小时前
【MyBatis】XML实现,配置方法和增、删、改、查
xml·oracle·mybatis
赵渝强老师6 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头6 小时前
Oracle注释详解
数据库·oracle
御控工业物联网7 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
GJCTYU8 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
Code季风8 小时前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql
kk在加油9 小时前
Mysql锁机制与优化实践以及MVCC底层原理剖析
数据库·sql·mysql
满昕欢喜18 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver