专栏首页测试开发架构之路分分钟 搞懂 各种类型的关联

分分钟 搞懂 各种类型的关联

在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值。

针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言而喻,

不同的关联条件会得到不同的结果集。

  废话不多说,下面开始做个实验。

建表 data_stock1, data_stock2

drop table if exists data_stock1;
drop table if exists data_stock2;

-- 区分二表,通过amount取不同字段

create table data_stock1(
account varchar(20),
amount1 int(10),
init_date varchar(10)
);

create table data_stock1(
account varchar(20),
amount2 int(10),
init_date varchar(10)
);

insert into data_stock1(account,amount1,init_date) values('2001',200,'20170101');
insert into data_stock1 (account,amount1,init_date) values('2001',30,'20170102');
insert into data_stock1 (account,amount1,init_date) values('2002',210,'20170102');
insert into data_stock1 (account,amount1,init_date) values('2003',70,'20170102');
insert into data_stock1(account,amount1,init_date) values('2002',10,'20170101');

表data_stock1,select * from data_stock1;

表data_stock2,自行插入值吧,数据如下,select * from data_stock2;

---------------------------------------------------我是分割线-------------------------------------

一切准备就绪;下面实验开始;将两个表进行关联,关联 分为 外联,内联。

内联 inner join ,内联 的结果集 是data_stock2,data_stock1表中共同存在的结果;data  in (data_stock2,data_stock1)

外联 outer join ,分为全联(full outer join),左联(left join),右联(right join),区别如下:

-- --左关联, a.account=b.account

select * 

from data_stock1 a left join data_stock2 b on (a.account=b.account);

-- --左关联,a.account=b.account and a.init_date=b.init_date select * from data_stock1 a left join data_stock2 b on (a.account=b.account and a.init_date=b.init_date);

-- --左关联,a.account=b.account,再做聚合 求平均值 select a.account,(AVG(a.amount1)+AVG(b.amount2)) as dispersion from data_stock1 a left join data_stock2 b on (a.account=b.account ) group by a.account;

-- --左关联,a.account=b.account,再做聚合 求平均值

select a.account,(AVG(a.amount1)+AVG(b.amount2)) as dispersion from data_stock1 a left join data_stock2 b on (a.account=b.account and a.init_date=b.init_date) group by a.account;

-- --右关联, a.account=b.account select * from data_stock1 a RIGHT JOIN data_stock2 b on (a.account=b.account);

-- --右关联,a.account=b.account and a.init_date=b.init_date select * from data_stock1 a RIGHT JOIN data_stock2 b on (a.account=b.account and a.init_date=b.init_date);

-- --内联, a.account=b.account --写法1 ,select * from data_stock1 a INNER JOIN data_stock2 b on a.account=b.account;

--写法2, select * from data_stock1 a , data_stock2 b where a.account=b.account;

-- --内联,a.account=b.account and a.init_date=b.init_date select * from data_stock1 a INNER JOIN data_stock2 b on (a.account=b.account and a.init_date=b.init_date);

select * from data_stock1 a ,data_stock2 b where (a.account=b.account and a.init_date=b.init_date);

-- --右关联,a.account=b.account,再做聚合 求平均值 select a.account,(AVG(a.amount1)+AVG(b.amount2)) as dispersion from data_stock1 a RIGHT JOIN data_stock2 b on (a.account=b.account ) group by a.account;

-- --右关联,a.account=b.account,再做聚合 求平均值,再做聚合 求平均值

select a.account,(AVG(a.amount1)+AVG(b.amount2)) as dispersion from data_stock1 a RIGHT JOIN data_stock2 b on (a.account=b.account and a.init_date=b.init_date) group by a.account;   

注意,此时出现了 NULL账号,是因为右联的时候,结果集为NULL,而以 group by a.account做聚合,会有NULL

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算累计收益

    计算累计收益,fund_account, init_date, total_income  drop table if exists data_stock; c...

    互联网金融打杂
  • MySQL实现全关联 full outer join

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中...

    互联网金融打杂
  • hbase常用操纵操作——增删改查

    互联网金融打杂
  • 来看看一个大二学生的Spark练习题

    23. 总成绩大于150分,且数学大于等于70,且年龄大于等于19岁的学生的平均成绩是多少?

    王知无
  • 机器学习实战:8大分类器识别树叶带源码

    今天我想送给大家两句话:1:在这个浮躁的社会中,每个人都想找到捷径,那么我想认真踏实地做好一件事也便是最大的捷径了。2:不要管别人做什么,有自己的目标,可能你现...

    CDA数据分析师
  • mongodb 定时切割日志 lock

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aeolus_pu/article/details/6075...

    拓荒者
  • HR不招收跳槽程序员惹众怒,程序员:不跳槽你们还想有饭吃?

    跳槽几乎是程序员加薪的一条常见的途径,甚至都有很多程序员分享自己跳槽加薪的心得。我们几乎很难看到一个人或者程序员在一家公司干个5年以上,因为始终在一个岗位上让自...

    一墨编程学习
  • Vim 快捷键说明及常用命令

    SkyRiN
  • Go语言实战笔记(十六)| Go 并发示例-Pool

    这篇文章演示使用有缓冲的通道实现一个资源池,这个资源池可以管理在任意多个goroutine之间共享的资源,比如网络连接、数据库连接等,我们在数据库操作的时候,比...

    飞雪无情
  • 随开随用,六度CRM联合腾讯云推教培数字化|腾讯SaaS加速器·学员动态

    ? 来源 |  腾讯SaaS加速器首期项目-六度人和 ---- 腾讯SaaS加速器 二期30席项目招募 报名方式 腾讯SaaS加速器,作为腾讯产业加速器的一个...

    腾讯SaaS加速器

扫码关注云+社区

领取腾讯云代金券