oracle 内连接(inner join)、外连接(outer join)、全连接(full join) union union all

liuqiang 2021年01月14日 102次浏览

内连接

SQL INNER JOIN 关键字

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

外连接

SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

全连接

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

select * from test_idx inner join test_idx1 on 1=1;

当 on 条件为 1=1 时, 内连接,外连接 ,全连接查询结果无差异

union 与 union all 的区别

union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
union All:对两个结果集进行并集操作,包括重复行,不进行排序;

demo:

Oracle

建表

DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1`  (
  `a1` int(64) NULL DEFAULT NULL,
  `a2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

INSERT INTO `test1` VALUES (1, 'a1');

DROP TABLE IF EXISTS `test2`;
CREATE TABLE `test2`  (
  `b1` int(64) NULL DEFAULT NULL,
  `b2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;


INSERT INTO `test2` VALUES (1, 'b1');
INSERT INTO `test2` VALUES (2, 'b2');

测试效果:

sql1:

select * from test1 LEFT JOIN test2 on 1=1
union  
select * from test1 right JOIN test2 on 1=1

sql1执行结果:

a1a2b1b2
1a11b1
1a12b2

sql2

select * from test1 LEFT JOIN test2 on 1=1
union  all
select * from test1 right JOIN test2 on 1=1

sql2 执行结果:

a1a2b1b2
1a11b1
1a12b2
1a11b1
1a12b2