CDA117513

2022-01-17   阅读量: 1160

SQL 笛卡尔乘积 SQL横向合并 表连接 MYSQL

MYSQL(横向连接)如何实现full join、左反连接、右反连接?

扫码加入数据分析学习群

目录:

1、常见数据分析工具的表格横向连接方式

2、几种常见表连接对应关系

(1)一对一

(2)一对多

(3)多对多

3、MYSQL实现横向连接的几种常见方式

(1)在SQL中创建上表

(2)几种连接函数

-- 内连接

-- 左连接

-- 右连接

--全连接(union去重)

-- 左反连接

-- 右反连接

(3)延伸:笛卡尔积连接与内连接有和异同?

--在什么情况下会使用到笛卡尔积连接?




正文:

1、常见数据分析工具支持的表格横向连接方式


Oracle/sql server/Tableau/Python:内连接(inner join)、左连接(left join)、右连接(right join)、全连接(full join)

MySQL:内连接(inner join)、左连接(left join)、右连接(right join)

Power BI:内连接、左连接、右连接、全连接、左反连接、右反连接



2、MYSQL实现横向连接的几种常见形式

(1)一对一

image.png

(2)一对多

image.png


(3)多对多

image.png

主表(左)每一条记录分别去匹配附表(右)公共字段数值相同的记录,如左表A103,A103去匹配右表的A103

公共字段:address_id


3、MYSQL实现横向连接的几种常见方式

image.png


以下通过两个表来介绍这7种连接方式:

t1
t2
Key1v1
Key2v2
a1
b10
a2
b11
b3
a12
c4
a13
a13
e14

image.png

如何通过SQL表达式实现?


(1)在SQL中创建上表

create table t1(key1 char,v1 int);

create table t2(key2 char,v2 int);

insert into t1 values('a',1),('a',2),('b',3),('c',4),('a',13);

insert into t2 values('b',10),('b',11),('a',12),('a',13),('e',14);


(2)几种连接函数

-- 内连接

select * from t1 innner join t2 on key1=key2;

(备注:当多表中的字段名一样的时候,需要完全“限定列名”来进行区分:t1 key=t2 key)

-- 左连接

select * from t1 left join t2 on key1=key2;

-- 右连接

select * from t1 right join t2 on key1=key2;

--全连接(union去重)

select * from t1 union select * from t2;

(union不去重:select * from t1 union all select * from t2;)

-- 左反连接

select * from t1 left join t2 on key1=key2 where key2 is null;

-- 右反连接

select * from t1 right join t2 on key1=key2 where key1 is null;


(3)延伸:笛卡尔积连接与内连接有和异同?

(同样是以t1和t2表为例子)

【不去重连接】笛卡尔乘积:select * from t1, t2 where key1=key2;

笛卡尔积连接会对两个表的每一条记录都进行匹配,内连接如果没有指定连接条件的话,(如:select * from t1 innner join t2;),和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,内连接的效率要高于笛卡尔积的交叉连接,因为内连接没有笛卡尔积那么复杂,要先生成行数乘积的数据表。

image.png

【去重连接】笛卡尔乘积去重:select distinct * from t1,t2 where t1.key1=t2.key2;

可以发现:消除笛卡尔乘积(使用条件筛选where)得到的查询结果与内连接增加(on)条件是一样的


通常情况下,考虑到MYSQL的执行效率,我们优先选择内连接,不过,在什么情况下会使用到笛卡尔积连接呢?


/*当两张表之间没有关键字段时候,使用笛卡尔积连接*/

这里以一道SQL面试真题作为例子(如下图)

image.png

题目要求:用SQL写出学生没有参加考试的课程,以下形式显示:学生、姓名、班级、课程

理解题目:学生没有参加考试意味着T-score表中的score为null,要求的字段学生、姓名、班级在T-stu_profile表和课程在T-lesson表中,并没有直接关联T-score表

解题思路1:可以考虑将3张表分别通过公共字段stu_id和lesson_id连接

解题思路1:对有select要求的字段的两表T_stu_profile表和T_lesson表用笛卡尔乘积,再用T_score表筛选score不为NULL的记录


solution 1:

select stu_id as 学生,stu_name as姓名, class_id as 班级, lesson_name as 课程

from T_stu_profile

right join T_score on T_stu_profile.stu_id= T_score.stu_id

right join T_lesson on T_score.lesson_id= T_lesson.lesson_id;


solution 2:

select stu_id as 学生,stu_name as姓名, class_id as 班级, lesson_name as 课程

from T_stu_profile,T_lesson

where score is not null;








添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
38.5548 12 0 关注作者 收藏

评论(0)


暂无数据

推荐课程