常见连接类型
文章插图
分类
本文中使用数据库环境: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 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 ;
结果:文章插图
笛卡尔积结果
内连接 (inner join)内连接是最常用的连接操作 。从数学的角度讲就是求两个表的交集;从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录 。一般内连接on条件都使用=,所以让大家觉得内连接就是等值连接 。
实现方式:
select * from t_dept td inner join 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 join t_emp te on td .id = te.deptId ;
结果如下:文章插图
自然连接(natural join)自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组(字段),并且在结果中把重复的属性列去掉 。
实现方式:
select * from t_dept td natural join t_emp te
结果:文章插图
左连接(left join)左连接的含义就是求两个表左表和右表的交集外加左表剩下的数据 。依旧从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录 。
文章插图
实现方式:
select * from t_dept td left join t_emp te on td .id = te.deptId ;
结果:文章插图
右连接【内连接,外连接,全连接 数据库连接总结】右连接RIGHT JOIN就是求两个表左和右表的交集外加右表B剩下的数据 。再次从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录 。
文章插图
实现方式:
select * from t_dept td right join t_emp te on td .id = te.deptId ;
结果:推荐阅读
- 内裤用开水洗?内裤首次清洗
- 刮刮乐内容可以写什么?老人?刮刮乐内容可以写什么?家庭局
- 三十而已主要内容,三十而已主要演员-
- 内存|十铨发布工业级DDR5-5600内存:RGB信仰灯终于有点正经用了
- 畅享|外形神似Mate 40 华为畅享50 Pro参数曝光:骁龙680加持
- 饿了么|免费吃外卖火了!饿了么免单活动被指无法提交订单 客服回应
- 医院|杭州男子野外钓鱼,把朋友“钓”进医院,还惊动了当地消防
- 婚内出轨算违法行为吗,婚内出轨是违法还是犯罪-
- 外交部对美方打压TikTok表态-外交部回应美方打压TikTok
- 外交部对美方打压TikTok表态-美不要打开潘多拉的盒子