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

在测试工作中,有时需要测试数据库数据经过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 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

group by 和聚合函数

group by 的基本用法                                                                  ...

30511
来自专栏张狗蛋的技术之路

Mysql探索(一):B-Tree索引

MySQL是目前业界最为流行的关系型数据库之一,而索引的优化也是数据库性能优化的关键之一。所以,充分地了解MySQL索引有助于提升开发人员对MySQL数...

1723
来自专栏向治洪

百度地图之收索视野内的建筑物

根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过my...

1769
来自专栏java一日一条

数据库性能优化之SQL语句优化

在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着...

1272
来自专栏算法channel

SQL|语句执行逻辑

01 SQL SQL,脚本查询语言,处理代码的顺序不是按照脚本语言的顺序,这点是不同于其他编程语言的最明显特征。 SQL语言常见的比如,Mysql,HiveQ...

3577
来自专栏自由而无用的灵魂的碎碎念

分享:Oracle sql语句优化

最近做查询时,写的一条查询语句用了两个IN,导致tuexdo服务积压了不少,用户没骂就不错了。最后经过技术经理的点拨,sql语句性能提升了大约10倍,主要用了表...

1391
来自专栏乐沙弥的世界

SQL 基础-->创建和管理表

(列名 数据类型 [ default 默认值] [ 约束条件] [ , ......] )

501
来自专栏乐沙弥的世界

PL/SQL --> 动态SQL

使用动态SQL是在编写PL/SQL过程时经常使用的方法之一。很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行

691
来自专栏数据和云

明理知意:复合索引优化及索引访问原理

熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 这个案例发生在某天早上,运行在配置为128GB内存、64CPU的HP Superd...

2947
来自专栏数据之美

explain 深入剖析 MySQL 索引及其性能优化指南

0.SQL标准的执行流程(select) (8) SELECT (9) DISTINCT (11) <TOP_specification> <select_...

3166

扫码关注云+社区

领取腾讯云代金券