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;
相关推荐
好望角雾眠12 小时前
第三阶段数据库-7:sql中函数,运算符,常用关键字
数据库·笔记·sql·学习·sqlserver·c#
帧栈18 小时前
开发避坑指南(31):Oracle 11g LISTAGG函数使用陷阱,缺失WITHIN子句解决方案
oracle
小马哥编程20 小时前
【软考架构】第6章 数据库基本概念
数据库·oracle·架构
做一个AC梦1 天前
MiniOB环境部署开发(使用Docker)
数据库·sql·miniob·ob·海扬数据库
ALLSectorSorft1 天前
搭子交友 app 动态分享与打卡系统设计实现
java·服务器·数据库·人工智能·oracle·交友
l1t1 天前
分析xml标签属性和压缩级别对xlsx文件读取解析的影响
xml·开发语言·python·sql·duckdb
DONG9131 天前
Redis内存架构解析与性能优化实战
数据库·redis·sql·database
武昌库里写JAVA2 天前
使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程
java·vue.js·spring boot·sql·学习
水涵幽树2 天前
MySQL 时间筛选避坑指南:为什么格式化字符串比较会出错?
数据库·后端·sql·mysql·database
funfan05172 天前
在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句
sql·intellij-idea·mybatis