SQL语句中JOIN的用法

article/2025/9/16 1:24:38

记录:257

写SQL最高境界:SELECT * FROM 表名。当然这是一句自嘲。探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟。

一、场景

把关系型数据库A中表TEST_TB01和TEST_TB02迁移到大数据平台M(MaxCompute大数据平台)。TEST_TB01单表1000万条记录,TEST_TB02单表80万条记录。

在关系型数据库中,TEST_TB01和TEST_TB02中有主键约束。在产生新增业务数据时,不会存在重复数据插入。但是,当数据迁移到大数据平台后,由于在大数据平台中无主键约束功能。在产生新增业务数据时,TEST_TB01和TEST_TB02均均插入了重复数据。

在一个计算任务中,TEST_TB01和TEST_TB02根据某个字段JOIN连接,计算出了一份结果数据,数据推送到使用方的关系型数据库C。直接导致了C数据库的对应表的表空间撑爆,监控预警。

原因:TEST_TB01和TEST_TB02有重复数据,使用JOIN连接后,生成了10亿+条数据,共计200G+数据,直接推送到C数据库。

那次考虑不周,瞬间懵了,感觉SQL语句中的JOIN变得陌生极了。于是想探究一下以作记录。

二、建表

TEST_TB01建表语句:

create table TEST_TB01
(sensor_id   BIGINT,part_id     BIGINT)
COMMENT '数据表一';

TEST_TB02建表语句:

create table TEST_TB02
(part_id    BIGINT,elem_id    BIGINT)COMMENT '数据表二';

三、SQL语句中使用JOIN无重复数据情况

在SQL语句中使用JOIN无重复数据情况,即在TEST_TB01和TEST_TB02表中均无重复数据情况。分别使用JOIN、INNER JOIN、LEFT JOIN、LEFT OUTER JOIN、RIGHT JOIN、FULL JOIN验证。

在TEST_TB01插入数据:

insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);

在TEST_TB02插入数据:

insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
insert into TEST_TB02 (part_id,elem_id) values(9916,8906);

查看TEST_TB01数据:

 查看TEST_TB02数据:

 1.在SQL中使用JOIN

TEST_TB01和TEST_TB02根据part_id使用JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。

SQL语句:

SELECT*
FROMTEST_TB01 aa
JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 2.在SQL中使用INNER JOIN

TEST_TB01和TEST_TB02根据part_id使用INNER JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。INNER JOIN和JOIN效果等价。

SQL语句:

SELECT*
FROMTEST_TB01 aa
INNER JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 3.在SQL中使用LEFT JOIN

TEST_TB01和TEST_TB02根据part_id使用LEFT JOIN连接,左连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。

SQL语句:

SELECT*
FROMTEST_TB01 aa
LEFT JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 4.在SQL中使用LEFT OUTER JOIN

TEST_TB01和TEST_TB02根据part_id使用LEFT OUTER JOIN连接,左外连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。LEFT OUTER JOIN

和LEFT  JOIN等价。

SQL语句:

SELECT*
FROMTEST_TB01 aa
LEFT OUTER JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 5.在SQL中使用RIGHT JOIN

TEST_TB01和TEST_TB02根据part_id使用RIGHT JOIN连接,右连接,返回右表(TEST_TB02)中所有的记录以及左表(TEST_TB01)中连接字段相等的记录

SQL语句:

SELECT*
FROMTEST_TB01 aa
RIGHT JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 6.在SQL中使用FULL JOIN

TEST_TB01和TEST_TB02根据part_id使用FULL JOIN连接,外连接,返回两个表中的行:LEFT JOIN + RIGHT JOIN所有行记录。

SQL语句:

​SELECT*
FROMTEST_TB01 aa
FULL JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

四、SQL语句中使用JOIN有重复数据情况

在SQL语句中使用JOIN有重复数据情况,即在TEST_TB01和TEST_TB02表中均有重复数据情况。分别使用JOIN、INNER JOIN、LEFT JOIN、LEFT OUTER JOIN、RIGHT JOIN、FULL JOIN验证。

在TEST_TB01插入数据:

insert into TEST_TB01 (sensor_id,part_id) values(2101,9911);
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);
insert into TEST_TB01 (sensor_id,part_id) values(2104,9914);
insert into TEST_TB01 (sensor_id,part_id) values(2105,9915);
--造重复数据
insert into TEST_TB01 (sensor_id,part_id) values(2102,9912);
insert into TEST_TB01 (sensor_id,part_id) values(2103,9913);

在TEST_TB02插入数据:

insert into TEST_TB02 (part_id,elem_id) values(9911,8901);
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);
insert into TEST_TB02 (part_id,elem_id) values(9916,8906);
--造重复数据
insert into TEST_TB02 (part_id,elem_id) values(9912,8902);
insert into TEST_TB02 (part_id,elem_id) values(9913,8903);

查看TEST_TB01数据:

 查看TEST_TB02数据:

1.在SQL中使用JOIN

TEST_TB01和TEST_TB02根据part_id使用JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。

SQL语句:

SELECT*
FROMTEST_TB01 aa
JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 2.在SQL中使用INNER JOIN

TEST_TB01和TEST_TB02根据part_id使用INNER JOIN连接,只返回两个表(TEST_TB01和TEST_TB02)中连接字段相等的记录。INNER JOIN和JOIN效果等价。

SQL语句:

SELECT*
FROMTEST_TB01 aa
INNER JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 3.在SQL中使用LEFT JOIN

TEST_TB01和TEST_TB02根据part_id使用LEFT JOIN连接,左连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。

SQL语句:

SELECT*
FROMTEST_TB01 aa
LEFT JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 4.在SQL中使用LEFT OUTER JOIN

TEST_TB01和TEST_TB02根据part_id使用LEFT OUTER JOIN连接,左外连接,返回左表(TEST_TB01)中所有的记录以及右表(TEST_TB02)中连接字段相等的记录。LEFT OUTER JOIN

和LEFT  JOIN等价。

SQL语句:

SELECT*
FROMTEST_TB01 aa
LEFT OUTER JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 5.在SQL中使用RIGHT JOIN

TEST_TB01和TEST_TB02根据part_id使用RIGHT JOIN连接,右连接,返回右表(TEST_TB02)中所有的记录以及左表(TEST_TB01)中连接字段相等的记录

SQL语句:

SELECT*
FROMTEST_TB01 aa
RIGHT JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

 6.在SQL中使用FULL JOIN

TEST_TB01和TEST_TB02根据part_id使用FULL JOIN连接,外连接,返回两个表中的行:LEFT JOIN + RIGHT JOIN所有行记录。

SQL语句:

SELECT*
FROMTEST_TB01 aa
FULL JOIN TEST_TB02 bbON aa.part_id = bb.part_id
ORDER BY aa.sensor_id ASC;

执行结果:

五、SQL中使用JOIN有重复与无重复数据区别

在SQL语句中使用JOIN有重复数据情况,使用JOIN连接,符合连接字段相等的记录的结果集是笛卡尔积,第一个表的行数乘以第二个表的行数。

六、解决方式

1.先去重再使用JOIN连接

根据业务规则先对TEST_TB01和TEST_TB02分别去重再使用JOIN连接。

2.先使用JOIN连接再去重

根据业务规则先对TEST_TB01和TEST_TB02使用JOIN连接生成结果集,再对结果集去重。

3.建议

在生产环境特别是数据量大场景,推荐使用第一种方式,先逐个表去重再使用JOIN连接。

七、关系型数据库验证表结构

本例是在DataWorks环境(即MaxCompute大数据平台)下验证,即在关系型数据库验证除表结构差异,其它均相同。

在ORACLE数据库建表语句:

create table TEST_TB01
(sensor_id  NUMBER(16),part_id  NUMBER(16));create table TEST_TB02
(part_id  NUMBER(16),elem_id  NUMBER(16) );

在MySQL数据库建表语句:

 CREATE TABLE TEST_TB01
(sensor_id  BIGINT,part_id  BIGINT);CREATE TABLE TEST_TB02
(part_id  BIGINT,elem_id  BIGINT );

以上,感谢。


http://chatgpt.dhexx.cn/article/vEMwWDhR.shtml

相关文章

SQL中连接(JOIN)子句介绍

本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。 说明:本文的用法示例是面向 MySQL 数据库的。 1 概述 SQL 中 JOIN 子句用于把来自两个…

SQL 中 JOIN 的用法

一、概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操作。 图片是很容易被接受和理解,所以尝试使用图片来说明一下。 二、JOIN分类 客…

思科三层交换机IPv6静态和默认路由配置

基础配置: SWA: Switch>ena Switch#conf t Switch(config)#host SWA SWA(config)#vlan 10 SWA(config-vlan)#vlan 100 SWA(config-vlan)#int vlan 10 SWA(config-if)#ipv6 add 2001:10::1/64 SWA(config-if)#int vlan 100 SWA(config-if)#i…

Cisco 三层交换机与路由器ospf协议配置多区域area

分布操作: 1.划分vlan 2.ospf、area 3.测试ping 三层交换机2 路由器2 PC机4 路由器使用WIC-2T模块 使用DCE串口线连接 其余设备间均用直通线连接 各种预配置信息: 设备从左往右,从上往下依次为 S1,R2,R3&#…

三层交换机配置的步骤

网管不会配置三层交换机怎么办? 学啊! 交换机是企业组网的重要设备,掌握交换机配置是作为网管的必备技能。这里以三层交换机的配置为例子,说一说配置的步骤。 配置管理地址 每个交换机需要配置一个管理地址,方便后期的…

思科利用三层交换机实现 VLAN 间路由

一、实验目的 掌握三层交换机基本配置方法 掌握三层交换机VLAN路由的配置方法 通过三层交换机实现VLAN间相互通信 二、实验原理 三层交换机具备网络层的功能,实现VLAN相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的IP地址…

Cisco Packet Tracer中配置三层交换机

三层交换机介绍: 三层交换机就是具有部分路由器功能的交换机,三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。对于数据包转发等规律性的过程…

思科三层交换机配置SVI 实现VLAN 间路由

本次SVI实验参数如图: 依次三层交换我们命名为SW1,二层交换命名为SW2 下面我们开始先对二层交换机SW2进行配置 Switch>en Switch#conf t Switch(config)#host SW2 SW2(config)#vlan 20 SW2(config-vlan)#vlan 30 SW2(config-vlan)#vlan 40 SW2(config…

关于Cisco Packet Tracer三层交换机路由配置

步骤1:交换机trunk配置 交换机sw1配置 Switch>en Switch#conf t Switch(config)#ho sw1 sw1(config)#int f0/2 sw1(config-if)#sw mo tr sw1(config-if)#exit 交换机sw2配置 Switch>en Switch#conf t Switch(config)#ho sw2 sw2(config)#int f0/2 sw2(config-…

三层交换机dhcp服务器性能,CISCO三层交换机怎么配置DHCP服务?

利用CISCO三层交换机自带的DHCP功能,可以实现多VLAN的IP地址自动分配,在三层交换机上如何配置DHCP服务呢,下面由小编介绍下具体操作吧, 1、首先将三层交换机开机,电脑telnet 远程连接,并进入全局模式下&…

思科三层交换机配置ACL(访问控制列表)的步骤讲解

ACL访问控制列表是构建安全规范的网络不可缺少的,但在三层交换机上配置ACL却不为一些刚进企业的初级网络管理维护人员所知。下面介绍一下在三层交换机上配置ACL的试验过程。 三层交换机上配置本地Vlan 实现下层接入层交换机不同Vlan互通。 PC1 192.168.20.10 VLAN …

思科单臂路由与三层交换机配置

注:配置开始前,需要在R1,R2添加网卡用延时线连接,否则上下分开配置后,需要连接时再断电插网卡,再次启动后R1上的配置会失效,所以需要提前插网卡连延时线,或者完成所有配置后再插网卡&#xff0c…

Cisco三层交换机的配置详解

当公司网络规模较小、划分的VLAN比较少时,可能单臂路由就可以满足各VLAN间的通信,但是当VLAN较多、网络规模比较大时。那么使用单臂路由技术就显得有点力不从心了,这是我们就要引入三层交换机了。 现在大多数新型的catalyst交换机都支持CEF&a…

Cisco简单配置(九)—三层交换机

三层交换机就是具有部分路由功能的交换机,工作在OSI网络标准模型的第三层:网络层。三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。 一般会将…

在思科三层交换机配置网关的两种方式

随着交换技术的发展,三层交换机在网络汇聚层与核心层的应用越来越多。在内网中子网与子网之间的通讯越来越少依赖于路由(几乎见不到了),而是使用带有路由功能的三层交换机,这对于内网中子网之间的通信效率的提高是显著…

思科三层交换机配置命令

思科三层交换机配置命令,从五个方面分享:交换机基本状态,交换机口令设置,交换机vlan设置,交换机设置IP地址,交换机显示命令。

思科三层交换机配置不同VLAN相互通信

三层交换机配置: Switch>enable Switch#configure terminal Switch(config)#vlan 10 Switch(config-vlan)#vlan 20 Switch(config-vlan)#vlan 30 Switch(config-vlan)#vlan 40 Switch(config-vlan)#exit Switch(config)#int vlan 10 Switch(config-if)#ip add…

思科三层交换机配置DHCP中继

三层交换机配置DHCP中继 网络内配置了VLAN,VLAN能隔离广播,而DHCP协议使用广播,也就是说,默认情况下DHCP协议只能在VLAN内部使用。DHCP服务器在VLAN100中,就是要该VLAN内的客户机能从DHCP服务器哪里获取IP地址如果VLAN…

交换机三层配置(思科)

交换机三层配置(思科) 1、网络规划 网络拓扑图 2、交换机配置 (1)交换机SW2_1配置 enable 进入特权模式 configure terminal 进入全局模式 hostname SW2_1 vlan 2 创建vlan 2 exit vlan 3 创建 vlan 3 interface f 0/1 进入f0/1…

Cisco 三层交换详解

当公司网络规模较小、划分的VLAN比较少时,可能单臂路由就可以满足各VLAN间的通信,但是当VLAN较多、网络规模比较大时。那么使用单臂路由技术就显得有点力不从心了,这是我们就要引入三层交换机了。 现在大多数新型的catalyst交换机都支持CEF&a…