平常连接类型
归类
本文中运用数据库环境:MySQL 5.7
SQL joins 经典图
准备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 NULLAUTO_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 INTOt_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 ;结果:
笛卡尔积结果
内连接 (inner join)
内连接是最常用的连接操作。从数学的方向讲便是求两个表的交集;从笛卡尔积的方向讲便是从笛卡尔积中挑出ON子句要求成立的记录。 通常内连接on要求都运用=,因此让大众觉得内连接便是等值连接。
实现方式:
select * from t_dept td innerjoin t_emp te on td .id > te.id ;
结果:
备注:只是说明一个例子,可能无实质业务道理。
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 joint_emp teon td .id = te.deptId ;结果如下:
自然连接(natural join)
自然连接是一种特殊的等值连接,它需求两个关系中进行比较的分量必要是相同的属性组(字段),并且在结果中把重复的属性列去掉。
实现方式: select * from t_dept td natural joint_emp te结果:
左连接(left join)
左连接的含义便是求两个表左表和右表的交集外加左表剩下的数据。依旧从笛卡尔积的方向讲,便是先从笛卡尔积中挑出ON子句要求成立的记录,而后加上左表中剩余的记录。
实现方式: select * from t_dept td left join t_emp te ontd .id = te.deptId ;结果:
右连接
右连接RIGHT JOIN便是求两个表左和右表的交集外加右表B剩下的数据。再次从笛卡尔积的方向描述,右连接便是从笛卡尔积中挑出ON子句要求成立的记录,而后加上右表中剩余的记录。
实现方式: select * from t_dept td right join t_emp te ontd .id = te.deptId ;结果:
全连接
全外连接便是求两个表A和B集合的并集。从笛卡尔积的方向讲便是从笛卡尔积中挑出ON子句要求成立的记录,而后加上左表中剩余的记录,最后加上右表中剩余的记录。另一MySQL不支持OUTER JOIN,然则咱们能够对左连接和右连接的结果做 UNION 操作来实现。
实现方式: 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 ;结果:
|