[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, '映画鑑賞', '寿司');


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

* Ven diagrams are simplified.
(内)连接
在指定的关联列或记录之间,以表为轴进行连接的方式被称为内部连接。
在示例中,由于example1的id和example2的user_id是相关联的列,
我们将根据这个关系进行内部连接,以获取example1的记录。
在指定相应的列时,使用ON来进行指定。
SELECT * FROM example1 JOIN example2 ON example2.user_id = example1.id;
* 可以省略INNER。


LEFT OUTER JOIN 左外连接
即使在JOIN语句中指定的表中没有相应的记录,也会获取FROM语句中指定的表的所有记录的方式。在示例中,虽然在example1中id为3的记录在example2中不存在,但它被提取并在列中设置为null。
SELECT * FROM example1 LEFT JOIN example2 ON example2.user_id = example1.id;
* OUTER可以忽略不计


右(外)连接
与LEFT JOIN相反,即使在FROM子句中没有相应的记录,也会获取JOIN子句中指定的表的所有记录的方式。
我觉得不会经常使用,想到了可以把作为主要依据的表与LEFT JOIN的方式对调一下。
(因为我只是无知,所以如果有意义的话,请教一下)
SELECT * FROM example1 RIGHT JOIN example2 ON example2.user_id = example1.id;
*OUTER可以省略。


完全外连接
获取合并记录以及所有不对应的记录的方法。
这与LEFT JOIN、RIGHT JOIN的内连接+α被称为外连接。
我感觉这种方式也不太常用。
在Postgres中可以使用,但在其他数据库系统中可能无法使用。
SELECT * FROM example1 FULL OUTER JOIN example2 ON example2.user_id = example1.id;


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