- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL语句中JOIN的用法场景分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
记录:256 。
写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建表语句:
1
2
3
4
5
6
|
create
table
test_tb01
(
sensor_id
bigint
,
part_id
bigint
)
comment
'数据表一'
;
|
test_tb02建表语句:
1
2
3
4
5
6
|
create
table
test_tb02
(
part_id
bigint
,
elem_id
bigint
)
comment
'数据表二'
;
|
在sql语句中使用join无重复数据情况,即在test_tb01和test_tb02表中均无重复数据情况。分别使用join、inner join、left join、left outer join、right join、full join验证.
在test_tb01插入数据:
1
2
3
4
5
|
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插入数据:
1
2
3
4
|
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
inner
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
left
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
left
outer
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
right
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
full
join
test_tb02 bb
on
aa.part_id = bb.part_id
order
by
aa.sensor_id
asc
;
|
执行结果:
在sql语句中使用join有重复数据情况,即在test_tb01和test_tb02表中均有重复数据情况。分别使用join、inner join、left join、left outer join、right join、full join验证.
在test_tb01插入数据:
1
2
3
4
5
6
7
8
|
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插入数据:
1
2
3
4
5
6
7
|
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
inner
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
left
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
left
outer
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
right
join
test_tb02 bb
on
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语句:
1
2
3
4
5
6
7
|
select
*
from
test_tb01 aa
full
join
test_tb02 bb
on
aa.part_id = bb.part_id
order
by
aa.sensor_id
asc
;
|
执行结果:
在sql语句中使用join有重复数据情况,使用join连接,符合连接字段相等的记录的结果集是笛卡尔积,第一个表的行数乘以第二个表的行数.
1.先去重再使用join连接 。
根据业务规则先对test_tb01和test_tb02分别去重再使用join连接.
2.先使用join连接再去重 。
根据业务规则先对test_tb01和test_tb02使用join连接生成结果集,再对结果集去重.
3.建议 。
在生产环境特别是数据量大场景,推荐使用第一种方式,先逐个表去重再使用join连接.
本例是在dataworks环境(即maxcompute大数据平台)下验证,即在关系型数据库验证除表结构差异,其它均相同.
在oracle数据库建表语句:
1
2
3
4
5
6
7
8
9
10
11
|
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数据库建表语句:
1
2
3
4
5
6
7
8
9
10
11
|
create
table
test_tb01
(
sensor_id
bigint
,
part_id
bigint
);
create
table
test_tb02
(
part_id
bigint
,
elem_id
bigint
);
|
以上,感谢.
到此这篇关于sql语句中join的用法的文章就介绍到这了,更多相关sql join的用法内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/zhangbeizhen18/article/details/118944620 。
最后此篇关于SQL语句中JOIN的用法场景分析的文章就讲到这里了,如果你想了解更多关于SQL语句中JOIN的用法场景分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
websocket的用途/场景 先总结:高即时性服务,比如聊天室的群聊,server顺序收到了张三,李四的消息,立即就推送给王五,不能让王五等半天。 Ajax也可以一秒一刷,让王五去问张三说话没,如果
前端的工作过程里,本地开发、提供测试环境,总得有个用着顺手的服务器软件,这个场景里nginx很流行。 介绍两个好用的配置项:rewrite try_files @xxxx rewrite 比较
我有一个场景的两个不同角度的 2 个视频文件,我想重建场景的 3D 估计。它类似于 3D 传感器的作用(例如 Kinect、PrimeSense)。我正在寻找一个库,甚至是一个完善的机器视觉算法,以便
我已阅读RebaseProject页面并尝试了一个不平凡的例子(不是对一个完整的分支进行 rebase )。这与 rebase D 的情况类似我场景B。 这是rebase之前的情况: default
有没有办法将我的场景保存在 JavaFx 应用程序中单独的 Java 文件中?我尝试过这样的事情: public class MyApp extends Application { pri
我有这样的场景:用户想要查看大量有关自己的信息。例如:年龄、姓名、地位、收入、工作、爱好、 child 的名字、妻子的名字、酋长的名字、祖父/祖母的名字。大约 50 个变量。他可以选择任何变量来显示信
我希望有人能帮助我解决这个问题:我有一个包含条目的表。我想执行查询并根据模式获取得分最高的记录。模式将是:如果我的话按原样出现,那么该条目的分数将是最高的。如果该单词出现在句子中,则该条目的分数将低于
我正在尝试在我的应用程序委托(delegate)方法中实现一些逻辑。了解当前正在运行哪种场景将非常有帮助。 [[CCDirector sharedDirector] runningScene] 返回当
好的,这是一个有趣的。我有 2 个表:tbl_notes、tbl_notes_categories 简单地说,tbl_notes 有一个 categoryid,我将 2 个表与该 ID 相关联。所以,
我有一个使用并行运行的 Specflow、selenium、NUnit 的测试解决方案在 AssemblyInfo 中添加了这个:[程序集:Parallelizable(ParallelScope.F
我正在尝试弄清楚如何在 SpriteKit 中添加更多场景。如果我在 GameViewController 中使用 SpriteKit 生成的行 if let scene = GameScene.un
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我是 Unity 的新手,所以修复起来可能非常简单。我使用了一个 3D Google SketchUp 模型,我想让玩家环顾模型。 super 简单。 我添加了 3D 平面,添加了相机并更新了设置以支
我需要标记要跳过的某些测试。但是,有些测试是参数化的,我只需要能够跳过某些场景。 我使用 py.test -m "hermes_only" 调用测试或 py.test -m "not hermes_o
我已经开始使用 SpecFlow 并想知道是否可以在规范之间重用场景 基本上我的想法是这样的(我可能从根本上是错误的:)) 我编写了一项功能来验证导航。 功能:导航 I should be able
在编写验证输入表单上的信息的 BDD 场景时,您将如何列出规则。 选项是: 1) 每个规则一个场景 2)场景大纲,每个领域和规则的例子 我们如何说某些不在特定字符集中的无效内容,例如: 鉴于我输入了一
我们如何使用 StoryQ 来测试预期出现异常的场景? 最佳答案 就实际代码而言,在测试代码的 .Then 部分,您需要创建一个 Action 或 Func 来确定正在测试的内容,然后在代码的 .Th
完成快速初学者努力通过点击按钮向场景添加节点。 我知道我可以使用点击手势来获取点击坐标并执行点击测试,然后在点击的 3D 空间中放置一个对象。但是,我想在设备屏幕的中央显示一个球体或十字准线,当点击屏
如何在表格中传递空格? Background: Given the following books |Author |(here several spaces)
我正在尝试从 Eric Haines' Standard Procedural Database (SPD) 渲染“mount”场景,但折射部分就是不想配合。我已经尝试了所有我能想到的方法来修复它。
我是一名优秀的程序员,十分优秀!