美文网首页
PostgreSQL中的join

PostgreSQL中的join

作者: 三点水滴 | 来源:发表于2019-01-05 08:21 被阅读12次

join的概述

  • 关联表(joined table)是根据一定规则将两张表合并在一起
  • 一般join语法是:
T1 join_type T2 [join_condition]
  • 所有类型的join都是可以链式的、嵌套的。
  • 使用小括号可以控制关联的顺序

join的类型以及连接条件

从join的基本语法如下:

T1 { [INNER] | { left | right | full } [OUTTER]} JOIN T2 ON condition
T1 { [INNER] | { left | right | full } [OUTTER]} JOIN T2 USING(join_columns)
T1 NATURAL { [INNER] | { left | right | full } [OUTTER]} JOIN T2

由此可以知道join的类型有以下几种类型:

  • 内连接(INNER JOIN)
  • 左外连接(LEFT OUTTER JOIN)
  • 右外连接(RIGHT OUTTER JOIN)
  • 全外连接(FULL OUTTER JOIN)
  • 自然连接(NATURAL JOIN)

举例说明

假设有以下两张表

Table A:

id name
1 Tom
2 Jerry
3 Mary

Table B:

id age
1 20
3 22
5 34

要说连接,首先要知道一个概念——笛卡尔积。

什么是笛卡尔积

在PostgreSQL中笛卡尔积就是cross join,这是上面join类型中没有提到的。

select * from t_a corss join t_b

结果如下:

id name id_1 age
1 Tom 1 20
2 Jerry 1 20
3 Mary 1 20
1 Tom 3 22
2 Jerry 3 22
3 Mary 3 22
1 Tom 5 34
2 Jerry 5 34
3 Mary 5 34

简单来说,笛卡尔积就是把两张表所有的行拼起来。3行的表与3行的表连接,连接表就是9行。

内连接

内连接的 inner 是可以省略不写的。内连接会把满足连接条件的t_a和t_b的行连接起来,作为连接表的一行。

select * from t_a inner join t_b on t_a.id = t_b.id

结果如下:

id name id_1 age
1 Tom 1 20
3 Mary 3 22

只有满足条件:id相等的列才会出现在连接表里。

左外连接

首先会执行内连接,然后把左表的行都放进连接表,对于没有满足条件的右表的行,用空值代替

select * from t_a left outter join t_b on t_a.id = t_b.id

结果如下:

id name id_1 age
1 Tom 1 20
2 Jerry
3 Mary 3 22

右外连接

首先会执行内连接,然后把右表的行都放进连接表,对于没有满足条件的左表的行,用空值代替

select * from t_a right outter join t_b on t_a.id = t_b.id

结果如下:

id name id_1 age
1 Tom 1 20
3 Mary 3 22
5 34

全外连接

首先会执行内连接,然后把左表和右表的行都放进连接表,对于没有满足条件的右表的行,用空值代替;对于没有满足条件的左表的行,用空值代替。

select * from t_a left outter join t_b on t_a.id = t_b.id

结果如下:

id name id_1 age
1 Tom 1 20
2 Jerry
3 Mary 3 22
5 34

连接条件

on

on 后面只要跟上返回布尔值的条件表达式即可,没有强制要求一定要使用表中的列,类似于where条件。

using

using函数需要传入左表和右表都存在的列名。以上面的例子来说,
using(id)
等价于
on t_a.id = t_b.id
可以传入多个列名,就相当于用and连接多个条件。需要注意的点是:

  • using中的列名必须是两张表同时存在的。
  • 连接表中字段顺序是 using的参数字段,左表剩余字段,右表剩余字段。
select * from t_a inner join t_b using(id)

结果如下:

id name age
1 Tom 20
3 Mary 22

natural join

将natural join放在连接条件里而不是连接类型里面,主要是因为natural join是隐含的使用了using,并且参数是两张表中所有同名的列。

select * from t_a natural inner join t_b

结果如下:

id name age
1 Tom 20
3 Mary 22

相关文章

网友评论

      本文标题:PostgreSQL中的join

      本文链接:https://www.haomeiwen.com/subject/gjtrrqtx.html