MySQL 内连接、外连接、左连接、右连接、全连接
建表语句:
CREATE TABLE `a_table` ( `a_id` int(11) DEFAULT NULL, `a_name` varchar(10) DEFAULT NULL, `a_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` ( `b_id` int(11) DEFAULT NULL, `b_name` varchar(10) DEFAULT NULL, `b_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
表测试数据: 一、内连接 关键字:inner join on 语句:select * from a_table a inner join b_table b on a.a_id = b.b_id; 执行结果: 说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
二、左连接(左外连接) 关键字:left join on / left outer join on 语句:select * from a_table a left join b_table b on a.a_id = b.b_id; 执行结果: 说明: left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
三、右连接(右外连接) 关键字:right join on / right outer join on 语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id; 执行结果: 说明: right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。 与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。 四、全连接(全外连接) MySQL目前不支持此种方式,可以用其他方式替代解决。 全外连接:左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充; 也就是: 左外连接=左表全部记录+相关联结果 右外连接=右表全部记录+相关联结果 全外连接=左表全部记录+右表全部记录+相关联结果=左外连接+右外连接-相关联结果(即去重复)
那么在MYSQL中谁可以做到呢? UNION UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
故实现全外连接可以使用:
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno UNION SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
注释:以上连接全为等值连接;Oracle中全外连接可以使用full join;请不要弄混。