数据库内连接和外连接的区别(数据库连接总结)

常见连接类型

数据库内连接和外连接的区别(数据库连接总结)(1)

分类

本文中使用数据库环境:MySQL 5.7

SQL joins 经典图

数据库内连接和外连接的区别(数据库连接总结)(2)

准备SQL语句

CREATE TABLE `t_emp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, PRIMARY KEY (`id`) , KEY `fk_dept_id`(`deptId`) )ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8; CREATE TABLE `t_dept` ( `id` int(11) NOT NULL AUTO_INCREMENT, `deptName` varchar(30) DEFAULT NULL, `locAdd` varchar(40) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8; INSERT INTO t_dept(deptName,locAdd) VALUES('研发部', 21); INSERT INTO t_dept(deptName,locAdd) VALUES('人力资源部', 22); INSERT INTO t_dept(deptName,locAdd) VALUES('市场部', 23); INSERT INTO t_dept(deptName,locAdd) VALUES('后勤部', 24); INSERT INTO t_dept(deptName,locAdd) VALUES('总经办', 25); INSERT INTO t_emp(NAME, deptId) VALUES('张三', 1); INSERT INTO t_emp(NAME, deptId) VALUES('李四', 1); INSERT INTO t_emp(NAME, deptId) VALUES('王五', 1); INSERT INTO t_emp(NAME, deptId) VALUES('赵六', 2); INSERT INTO t_emp(NAME, deptId) VALUES('刘一', 2); INSERT INTO t_emp(NAME, deptId) VALUES('钱七', 3); INSERT INTO t_emp(NAME, deptId) VALUES('关八', 4); INSERT INTO t_emp(NAME, deptId) VALUES('孙九', 51);

交叉连接(cross join)

交叉联接也称作笛卡尔积。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。

实现方式:

(1)隐式交叉连接(没有CROSS JOIN)

select * from t_dept td ,t_emp te ;

(2)显式交叉连接

select * from t_dept td cross join t_emp te ;

结果:

数据库内连接和外连接的区别(数据库连接总结)(3)

笛卡尔积结果

内连接 (inner join)

内连接是最常用的连接操作。从数学的角度讲就是求两个表的交集;从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录。 一般内连接on条件都使用=,所以让大家觉得内连接就是等值连接。

实现方式:

select * from t_dept td inner join t_emp te on td .id > te.id ;

结果:

数据库内连接和外连接的区别(数据库连接总结)(4)

备注:只是说明一个例子,可能没有实际业务意义。

1.1.1.6. 等值连接 (equijoin)

等值连接是关系运算-连接运算的一种常用的连接方式。是条件连接(或称θ连接)在连接运算符为“=”号时,即θ=0时的一个特例;等值连接是一种特殊内连接。

常见的实现方式:

select * from t_dept td inner join t_emp te on td .id = te.deptId ; select * from t_dept td, t_emp te where td .id = te.deptId ; select * from t_dept td join t_emp te on td .id = te.deptId ;

结果如下:

数据库内连接和外连接的区别(数据库连接总结)(5)

自然连接(natural join)

自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组(字段),并且在结果中把重复的属性列去掉。

实现方式:

select * from t_dept td natural join t_emp te

结果:

数据库内连接和外连接的区别(数据库连接总结)(6)

左连接(left join)

左连接的含义就是求两个表左表和右表的交集外加左表剩下的数据。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录。

数据库内连接和外连接的区别(数据库连接总结)(7)

实现方式:

select * from t_dept td left join t_emp te on td .id = te.deptId ;

结果:

数据库内连接和外连接的区别(数据库连接总结)(8)

右连接

右连接RIGHT JOIN就是求两个表左和右表的交集外加右表B剩下的数据。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录。

数据库内连接和外连接的区别(数据库连接总结)(9)

实现方式:

select * from t_dept td right join t_emp te on td .id = te.deptId ;

结果:

数据库内连接和外连接的区别(数据库连接总结)(10)

全连接

全外连接就是求两个表A和B集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做 UNION 操作来实现。

数据库内连接和外连接的区别(数据库连接总结)(11)

实现方式:

select * from t_dept td left join t_emp te on td .id = te.deptId union select * from t_dept td right join t_emp te on td .id = te.deptId ;

结果:

数据库内连接和外连接的区别(数据库连接总结)(12)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页