• oracle、mysql、postgresql数据库的几种表关联方法


    目录

    简介

    创建测试数据

    语法

    左关联

    右关联

    ​编辑

    内关联(交集)

    补集

    并集

    简介

    数据开发过程中,常常需要判断几个表直接的数据包含关系,便需要使用到一些特定的关键词进行处理。在数据库中常见的几种关联关系,本文以oracle、mysql、postgresql三种做演示

    创建测试数据

    oracle

    1. -- 创建表 p1
    2. CREATE TABLE p1 (
    3. txt VARCHAR2(100),
    4. id VARCHAR2(100)
    5. );
    6. -- 插入数据到表 p1
    7. INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
    8. INSERT INTO p1 (txt, id) VALUES ('交通项目', '12');
    9. INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
    10. INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
    11. INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
    12. INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');
    13. -- 创建表 p2
    14. CREATE TABLE p2 (
    15. txt VARCHAR2(100),
    16. id VARCHAR2(100)
    17. );
    18. -- 插入数据到表 p2
    19. INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
    20. INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
    21. INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
    22. INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
    23. INSERT INTO p2 (txt, id) VALUES ('城建项目', '34');
    24. INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

    postgresql/mysql

    1. -- 创建表 p1
    2. CREATE TABLE p1 (
    3. txt VARCHAR(100),
    4. id VARCHAR(100)
    5. );
    6. -- 插入数据到表 p1
    7. INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
    8. INSERT INTO p1 (txt, id) VALUES ('交通项目', '12');
    9. INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
    10. INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
    11. INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
    12. INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');
    13. -- 创建表 p2
    14. CREATE TABLE p2 (
    15. txt VARCHAR(100),
    16. id VARCHAR(100)
    17. );
    18. -- 插入数据到表 p2
    19. INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
    20. INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
    21. INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
    22. INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
    23. INSERT INTO p2 (txt, id) VALUES ('城建项目', '34');
    24. INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

    语法

    左关联

     

    在使用left join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

     重复数据:“社会事业项目” 两条数据行会出现数据重复

    右关联

     在使用right join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

     重复数据:“社会事业项目”,“工业区项目”  两条数据行会出现数据重复

     在使用right join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

     重复数据:“社会事业项目” 两条数据行会出现数据重复

    内关联(交集)

    1. select * from p1 inner join p2 on p1.id =p2.id
    2. --等效于
    3. select * from p1 join p2 on p1.id =p2.id

     在使用inner join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

     重复数据:“社会事业项目”   两条数据行会出现数据重复

    inner是一个可选关键字

     

     内链接的去重写法(此时exists 替换成not exists 便是补集结果)

    1. select * from p1 where exists (select 1 from p2 where p1.id = p2.id )

    --使用此写法不会因为匹配表有重复匹配记录而发生笛卡尔交叉,产生重复项,但是主表的重复项不会进行去重 

    1. --oracle、postgresql、mysql
    2. select id ,txt from p1
    3. intersect
    4. select id ,txt from p2

    --使用此写法不会因为匹配表有重复匹配记录而发生笛卡尔交叉,产生重复项,但是主表的重复项也会进行去重,此写法适用于mysql、postgresql、oracle  

    补集

    此时再加入一条数据,查看不同语法下的去重效果

    对p1表增加一条测试数据

    1. INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');

    此时p1表的数据状态 

     补集可以使用上文提到的eixsts 写法

    select   *  from p1 where not exists (select 1 from p2 where p1.id = p2.id )

     可以使用minus

    1. --oracle
    2. select id ,txt from p1
    3. minus
    4. select id ,txt from p2
    5. --postgresql,mysql
    6. select id ,txt from p1
    7. except
    8. select id ,txt from p2

    使用exits 不会对主表的重复数据进行去重,使用minus 会对结果进行去重后再展示。

    并集

     并集主要使用union  、union all 的语法,两者语法的区别主要在于对结果的去重处理 

    1. --oracle/postgresql/mysql
    2. --结果去重
    3. select id ,txt from p1
    4. union
    5. select id ,txt from p2
    6. --结果不去重
    7. select id ,txt from p1
    8. union all
    9. select id ,txt from p2

    union  结果去重效果

    union all结果不去重效果

            附加:进来国产数据信创政策下,很多数据库都在做迁移,学会这几种表关联关系,可以对比数据库之间的数据差异,方便更好的排错。

  • 相关阅读:
    kafka消费的完整解决方案
    k8s之service
    定个小目标之刷LeetCode热题(31)
    uniapp开发短视频系统仿哔哩哔哩
    零基础打靶—Glasgow Smile靶场
    Office在线协作(三)- O2OA连接本地部署的OnlyOffice Docs Server服务器 For Windows Server
    【iOS】暑假第二周——网易云APP 仿写
    SystemVerilog Assertions应用指南 Chapter 11.5SVA检验器的时序窗口
    二叉树的基础讲解
    开关柜太复杂看着头疼?三分钟带你看懂开关柜!
  • 原文地址:https://blog.csdn.net/weixin_73350116/article/details/133738324