越觉得厚重的情绪越荒诞得遥远,越难于去细致地描述,便惊觉语言是多么的苍白无力。我想,这恐怕便是人类音乐与绘画等艺术诞生的起源。

# 测试数据

1
2
3
4
5
6
7
8
9
10
11
12
create table t_a(id number);
create table t_b(id number);

insert into t_a values(1);
insert into t_a values(2);
insert into t_a values(3);

insert into t_b values(1);
insert into t_b values(2);
insert into t_b values(4);

commit;
1
select * from t_a;
ID
1
2
3
1
select * from t_b;
ID
1
2
4

# 左外连接

左外连接会显示左边表的所有数据。

1
2
3
4
5
6
7
-- 主流数据库通用的方法
select * from t_a left join t_b on t_a.id = t_b.id;
-- 或者
select * from t_a left outer join t_b on t_a.id = t_b.id; -- outer 可以省略

-- Oracle特有的方法
select * from t_a, t_b where t_a.id = t_b.id(+);
ID ID
1 1
2 2
3

# 右外连接

右外连接会显示右边表所有数据。

1
2
3
4
5
-- 主流数据库通用的方法
select * from t_a right join t_b on t_a.id = t_b.id;

-- Oracle特有的方法
select * from t_a, t_b where t_a.id(+) = t_b.id;
ID ID
1 1
2 2
4

# 内连接

1
2
3
4
5
-- 主流数据库通用的方法
select * from t_a join t_b on t_a.id = t_b.id;

-- WHERE 关联
select * from t_a, t_b where t_a.id=t_b.id;
ID ID
1 1
2 2

# 全外连接

1
2
3
4
5
6
7
-- 主流数据库通用的方法
select * from t_a full join t_b on t_a.id=t_b.id;

-- Oracle 特有的方法
select * from t_a, t_b where t_a.id = t_b.id(+)
union
select * from t_a, t_b where t_a.id(+) = t_b.id;
ID ID
1 1
2 2
3
4

# 完全连接 / 交叉连接 / 笛卡尔积

1
2
3
4
-- 主流数据库通用的方法
select * from t_a, t_b;
-- 或者
select * from t_a cross join t_b;
ID ID
1 1
1 2
1 4
2 1
2 2
2 4
3 1
3 2
3 4

# 注意事项

ON 条件里应该只写表连接条件,数据筛选放在 WHERE 里。

左外连接不筛选右边数据。

1
2
3
4
5
6
7
select *
from t_a left join t_b
on t_a.id = t_b.id;

select *
from t_a, t_b
where t_a.id = t_b.id(+);
ID ID
1 1
2 2
3

左外连接使用 WHERE 筛选右边数据。

1
2
3
4
5
6
7
8
9
select *
from t_a left join t_b
on t_a.id = t_b.id
where t_b.id = 2;

select *
from t_a, t_b
where t_a.id = t_b.id(+)
and t_b.id = 2;
ID ID
2 2

左外连接使用 ON/+ 筛选右边数据。符合 t_b.id = 2 的数据只有一条,但是左外连接需要显示左边所有数据,所以 t_a.id = 1 这条数据对应的右边数据为空。在 ON 条件里应该只写连接条件,数据筛选放在 WHERE 里。

1
2
3
4
5
6
7
8
select *
from t_a left join t_b
on t_a.id = t_b.id and t_b.id = 2;

select *
from t_a, t_b
where t_a.id = t_b.id(+)
and t_b.id(+) = 2;
ID ID
2 2
3
1
Edited on