前言
通过具体的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,4(σ3=6(R×S))与关系代数表达式(8)等价。
2015年(7)
A.6和6
B.4和6
C.3和6
D.3和4
2015年(8)
A.πA,D(σC=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 内连接”的处理方式:虽然重复,但两份都保留
关于连接的几何表示图: