通过具体的SQL实例,通俗易懂的搞清楚笛卡尔积、内连接、外连接、自然连接的区别

前言

通过具体的SQL实例,通俗易懂的搞清楚内连接、外连接、自然连接的区别,本例采用的mysql5.7版本,依次来验证软考中的自然连接考题的正确性!

×是笛卡尔积的符号,π是投影的符号,σ是选择的符号,是自然连接

建表及填数据

CREATE TABLE `r` (
  `a` bigint(255) DEFAULT NULL,
  `b` bigint(255) DEFAULT NULL,
  `c` bigint(255) DEFAULT NULL,
  `d` bigint(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 3, 1,5);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 1, 5,1);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 5, 7,4);
INSERT INTO `test`.`r`(`a`, `b`, `c`, `d`) VALUES (6, 3, 7,4);


CREATE TABLE `s` (
  `c` bigint(255) DEFAULT NULL,
  `d` bigint(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `test`.`s`(`c`, `d`) VALUES (1,5);
INSERT INTO `test`.`s`(`c`, `d`) VALUES (7,4);

笛卡尔积

产生的结果最多,排列出所有可能组合,无null,连接属性ID出现2次。

select * from `test`.`r`,`test`.`s`

内连接

内连接:查询出来的结果肯定会满足所有的条件
select  columns from table1 [inner] join table2 on table1.column = table2.cloumn;

如具体的SQL实例:

select  * from `test`.`r` inner join `test`.`s` on `test`.`r`.`c` = `test`.`s`.`c`;

外连接

左/右外连接

左/右外连接:查询出来的结果,存在满足条件的可能

(左连接)(右连接)
select columns from table1 left/right join table2 on table1.col = table2.col;

如具体的左外连接SQL实例:

select * from `test`.`r` left join `test`.`s` on `test`.`r`.`c` = `test`.`s`.`c`;

全外链接

全外链接:MySQL不支持,Oracle支持
select columns from table1 full join table2 on table1.col = table2.col;

自然连接

自然连接:两张表中的名称和类型完全一致的列进行内连接

通俗来讲:根据数量最少的为准!
select columns from table1 natural join table2;

select * from `test`.`r` natural join `test`.`s`;

软考案例

若关系R、S如下图所示,则关系R与S进行自然连接运算后的元组个数和属性列数分别为(7);关系代数表达式π1,43=6(R×S))与关系代数表达式(8)等价。

2015年(7)

A.66           

B.46

C.36

D.3和4

2015年(8)

A.πA,DC=D(R×S))                   

B.πA,R,D(σS.C=R.D(R×S))

C.πA,R,D(σR.C=S.D(R×S))         

D.πA,R,D(σS.C=S.D(R×S))

解析

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

  • natrual join 自然连接"的处理方式:既然重复了,就丢掉一份,好比distinct(优胜劣汰,自然法则
  • inner join 内连接”的处理方式:虽然重复,但两份都保留

关于连接的几何表示图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿啄debugIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值