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

news/2024/7/9 22:53:51 标签: 数据库, postgresql, mysql, dba, oracle

简介

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

创建测试数据

oracle

-- 创建表 p1
CREATE TABLE p1 (
    txt VARCHAR2(100),
    id VARCHAR2(100)
);

-- 插入数据到表 p1
INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p1 (txt, id) VALUES ('交通项目', '12'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');

-- 创建表 p2
CREATE TABLE p2 (
    txt VARCHAR2(100),
    id VARCHAR2(100)
);

-- 插入数据到表 p2
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
INSERT INTO p2 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

postgresql/mysql

-- 创建表 p1
CREATE TABLE p1 (
    txt VARCHAR(100),
    id VARCHAR(100)
);

-- 插入数据到表 p1
INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p1 (txt, id) VALUES ('交通项目', '12'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');

-- 创建表 p2
CREATE TABLE p2 (
    txt VARCHAR(100),
    id VARCHAR(100)
);

-- 插入数据到表 p2
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
INSERT INTO p2 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

语法

左关联

 

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

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

右关联

 

 

 

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

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

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

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

内关联(交集)

 

select   *  from p1 inner join p2 on p1.id =p2.id 

--等效于
select   *  from p1  join p2 on p1.id =p2.id 
 

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

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

inner是一个可选关键字

 

 

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

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

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

 

--oraclepostgresqlmysql
 select  id ,txt  from p1 
intersect
 select  id ,txt from p2

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

 

补集

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

对p1表增加一条测试数据


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

--oracle 
 select  id ,txt  from p1 
  minus 
 select  id ,txt from p2

--postgresqlmysql
 select  id ,txt  from p1 
  except 
 select  id ,txt from p2

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

并集

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

--oracle/postgresql/mysql 
--结果去重
select  id ,txt  from p1 
union
 select  id ,txt from p2
--结果不去重
 select  id ,txt  from p1 
union  all
 select  id ,txt from p2

union  结果去重效果

union all结果不去重效果

 


http://www.niftyadmin.cn/n/5088181.html

相关文章

【linux】基础IO+系统文件IO+文件描述符分配规则

基础IO系统文件IO文件描述符文件描述符分配规则 1.重新谈论文件2.重谈文件操作(C语言)2.1C文件接口 3.系统文件IO3.1open3.2close3.3write3.4read3.5lseek3.6总结 4.如何理解文件5.文件描述符(fd)分配规则 自我名言:只…

GEE错误——利用selector选择指定的属性列表进行表格的导出(相关错误解析)

本文主要是利用目的是利用selector选择指定的属性列表进行表格的导出,这里的目的是我们就用这个表格选取指定的属性列表即可。 相关错误: 我正在尝试获取每个点的平均土壤值。代码运行良好,但我得到一个空白列。我可能必须添加 .set 或 .get 或其他东西,我尝试过但没有运气…

minio桶命名规则

一、背景 今天做项目需要上传图片到minio,上传失败,查看错误是桶未创建成功。 minio桶的创建具有自己的命名规则,不符合则无法创建。 二、命名规则 1、存储桶名称的长度必须介于 3(最小)到 63(最大&…

资源共享共赢系统应用

1.访问地址 http://www.gxcode.top/code 2.收益功能说明 上传共享收益资源信息,审核通过后获取收益。 3.具体操作如下图

Redis HyperLogLog的使用

Redis HyperLogLog知识总结 一、简介二、使用 一、简介 Redis HyperLogLog是一种数据结构,用于高效地计算基数(集合中唯一元素的数量)。它的主要作用是用于在内存中高效地存储和计算大量数据的基数,而无需完全存储所有的数据。Hy…

springboot中如何在测试环境下进行web环境模拟测试

web环境模拟测试 模拟端口 SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) public class WebTest {Testvoid testRandomPort () {} }

ubuntu下yolov6 tensorrt模型部署

文章目录 ubuntu下yolov6 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov6源码中导出onnx文…

美妆穿搭带货直播稿 话术 脚本

美妆穿搭带货直播稿序号时长流程步骤直播稿内容备注11开场自我介绍哈喽大家好,欢迎各位老铁来到咱的直播间,我是XXX主播,欢迎XXX。今天是XXXX节日,是女神的狂欢节日,我们推出了直播间独有超低打折日。在这个特别的节日,先预祝各位女神购物愉快,买得爽爽,看得爽爽。XX今…