内连接
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执行结果:
a1 | a2 | b1 | b2 |
---|---|---|---|
1 | a1 | 1 | b1 |
1 | a1 | 2 | b2 |
sql2
select * from test1 LEFT JOIN test2 on 1=1
union all
select * from test1 right JOIN test2 on 1=1
sql2 执行结果:
a1 | a2 | b1 | b2 |
---|---|---|---|
1 | a1 | 1 | b1 |
1 | a1 | 2 | b2 |
1 | a1 | 1 | b1 |
1 | a1 | 2 | b2 |