【概念区分】笛卡尔积,自然连接,内连接,外连接(左,右,全)

您所在的位置:网站首页 连接和连结有何区别 【概念区分】笛卡尔积,自然连接,内连接,外连接(左,右,全)

【概念区分】笛卡尔积,自然连接,内连接,外连接(左,右,全)

#【概念区分】笛卡尔积,自然连接,内连接,外连接(左,右,全)| 来源: 网络整理| 查看: 265

本文章尝试解决一下问题

1.笛卡尔积存在的意义是什么?

2.”cross join 笛卡尔积“和”full join 全连接“和"inner join内连接"的区别在哪里?

3. 既然”连接条件“可以写在where字句里面,为什么还要用on关键字?

4.自然连接和内连接有什么关系吗?

 

 

1.笛卡尔积存在的意义是什么?

虽然”笛卡尔积“在实际问题中很少会用到,但”笛卡尔积“不仅仅存在数学意义,也存在现实意义的,比如集合A是一个班的学生,集合B是所有的选修课,A与B的笛卡尔积,表示了学生选择课程的所有可能性

mysql> select * from A; +--------------+ | student_name | +--------------+ | 张学友 | | 刘德华 | +--------------+ 2 rows in set (0.00 sec) mysql> select * from B; +--------------+ | subject_name | +--------------+ | 语文 | | 数学 | | 法律 | +--------------+ 3 rows in set (0.00 sec)

那么”学生选课“就拥有6种可能性,数学中的”排列组合“通过2*3=6得出来,MySQL用”corss join“来计算笛卡尔积

mysql> select * from A cross join B order by student_name; +--------------+--------------+ | student_name | subject_name | +--------------+--------------+ | 刘德华 | 数学 | | 刘德华 | 法律 | | 刘德华 | 语文 | | 张学友 | 法律 | | 张学友 | 语文 | | 张学友 | 数学 | +--------------+--------------+ 6 rows in set (0.00 sec)

有同样效果的是

select * from A , B

 

2.”cross join 笛卡尔积“和”full join 全连接“和"inner join内连接"的区别在哪里?

cross join 象征着返回所有的情况,默认不使用 where进行过滤的,因为筛选之后就失去了”所有可能性“这种意义了,而 inner join默认使用on进行”匹配“,如果不使用on返回的是 cross join的所有可能性,也就失去了意义了

 

集合a(1,2,3),集合b(1,2,3)

1.笛卡尔积——返回3 * 3 =9 条记录,默认不用where

2.内连接——返回3条记录,默认使用on

 

3. 既然”连接条件“可以写在where字句里面,为什么还要用on关键字?

这是因为有两个原因

a. 更加清晰的把表与表之间”做连接”的条件,与其他条件区分开来,这好比小工的人力资源和行政是一体的,但公司大了,两者就可以分开,分工更清晰

b. 在 ”inner join 内连接“ 中,on和where虽然意义不同,但结果相同,但在 outer join 中,结果就不一样了,匹配条件放在where中是不会产生NULL值的

 

4.自然连接和内连接有什么关系吗?

“自然连接”和“内连接”的区别,在于对“重合的相同的部分”处理方式不同

1."natrual join 自然连接"的处理方式:既然重复了,就丢掉一份,好比distinct

2.“inner join 内连接”的处理方式:虽然重复,但两份都保留

假设有A,B两个集合,其中有两个字段是重复的

自然连接是“去重”,有点像distinct

mysql> select * from A natural join B; +------+------+-----------+-----------+ | b | c | a | d | +------+------+-----------+-----------+ | 1111 | 2222 | 刘德华 | 投名状 | | 3333 | 4444 | 梁朝伟 | 花样年 | +------+------+-----------+-----------+ 2 rows in set (0.00 sec)

“内连接”的方式,是把所有重复的都保留(当然额外用where条件筛选是另外一回事了)

mysql> select * from A inner join B on A.b=B.b; +-----------+------+------+------+------+-----------+ | a | b | c | b | c | d | +-----------+------+------+------+------+-----------+ | 刘德华 | 1111 | 2222 | 1111 | 2222 | 投名状 | | 梁朝伟 | 3333 | 4444 | 3333 | 4444 | 花样年 | +-----------+------+------+------+------+-----------+ 2 rows in set (0.00 sec)

 

最后附上一张关于连接的图

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3