[PostgreSQL]关于JOIN的内容

以下是关于Postgres JOIN的备忘录总结

“JOIN” 是什么意思?

在使用SQL语句进行表的连接时

什么时候会发生联合?

当需要同时参考两个或更多表中的记录时

使用JOIN语句,指定想要进行连接的列
比较该列的值,可以将具有相同值的数据进行连接

在JOIN操作中,有以下选项可供选择:
– 交叉连接(CROSS JOIN)
– 内连接(INNER JOIN)
– 左外连接(LEFT OUTER JOIN)
– 右外连接(RIGHT OUTER JOIN)
– 全外连接(FULL OUTER JOIN)

展示样品桌

版本为PostgreSQL 9.3.2的操作环境。

CREATE TABLE example1(
  id integer primary key, 
  name text NOT NULL,
  age integer
);

CREATE TABLE example2(
  id integer primary key, 
  user_id integer,
  hobby text,
  favorite_food text,
  FOREIGN KEY (user_id) references example1(id)
);

INSERT INTO example1(id, name, age)
VALUES 
    (1, 'ほげ太郎', 31),
    (2, 'ふが次郎', 25),
    (3, 'ぽよ美', 27);


INSERT INTO example2(id, user_id, hobby, favorite_food)
VALUES 
    (1, 1, '散歩', 'りんご'),
    (2, 2, '手芸', '秋刀魚'),
    (3, null, 'サッカー', 'ラーメン'),
    (4, null, '映画鑑賞', '寿司');

image.png
image.png

交叉连接

创建所有可能的组合连接方式
与其他JOIN语句不同,不需要指定通过ON进行连接时所匹配的列,
就像随意地进行表连接一样
执行结果的记录数是连接的表的记录数相乘的结果
在这种情况下,(example1的记录数)×(example2的记录数)
感觉实用性不太大

SELECT * FROM example1 CROSS JOIN example2;
image.png

* Ven diagrams are simplified.

(内)连接

在指定的关联列或记录之间,以表为轴进行连接的方式被称为内部连接。
在示例中,由于example1的id和example2的user_id是相关联的列,
我们将根据这个关系进行内部连接,以获取example1的记录。
在指定相应的列时,使用ON来进行指定。

SELECT * FROM example1 JOIN example2 ON example2.user_id = example1.id;

* 可以省略INNER。

image.png
image.png

LEFT OUTER JOIN 左外连接

即使在JOIN语句中指定的表中没有相应的记录,也会获取FROM语句中指定的表的所有记录的方式。在示例中,虽然在example1中id为3的记录在example2中不存在,但它被提取并在列中设置为null。

SELECT * FROM example1 LEFT JOIN example2 ON example2.user_id = example1.id;

* OUTER可以忽略不计

image.png
image.png

右(外)连接

与LEFT JOIN相反,即使在FROM子句中没有相应的记录,也会获取JOIN子句中指定的表的所有记录的方式。

我觉得不会经常使用,想到了可以把作为主要依据的表与LEFT JOIN的方式对调一下。
(因为我只是无知,所以如果有意义的话,请教一下)

SELECT * FROM example1 RIGHT JOIN example2 ON example2.user_id = example1.id;

*OUTER可以省略。

image.png
image.png

完全外连接

获取合并记录以及所有不对应的记录的方法。
这与LEFT JOIN、RIGHT JOIN的内连接+α被称为外连接。
我感觉这种方式也不太常用。
在Postgres中可以使用,但在其他数据库系统中可能无法使用。

SELECT * FROM example1 FULL OUTER JOIN example2 ON example2.user_id = example1.id;
image.png
image.png

总结

除了INNER JOIN和LEFT JOIN之外,我感觉其他的用法并不常见。
(如果有任何错误,请在评论中指出,谢谢)

广告
将在 10 秒后关闭
bannerAds