目录
文档用途
连接有多种形式,例如内连接,外连接,交叉连接,自连接等。但是最重要的区别之一是隐式连接和显式连接之间的区别。
本文将对隐式连接和显式连接进行介绍。
详细信息
1.隐式连接
FROM子句后面直接列出多个表名,这种连接方式即属于内连接,是隐式连接。
示例:
创建两张测试表test_1和test_2,分别插入数据,然后查询两张表中id列相同的记录。
postgres=# CREATE TABLE test_1(id int, class_no int); CREATE TABLE postgres=# CREATE TABLE test_2(id int, course_no int); CREATE TABLE postgres=# INSERT INTO test_1 VALUES (1,15),(2,24),(3,10); INSERT 0 3 postgres=# INSERT INTO test_2 VALUES (2,24),(3,30),(4,20); INSERT 0 3 postgres=# SELECT * FROM test_1,test_2 WHERE test_1.id = test_2.id; id | class_no | id | course_no -----+--------------+-----+----------- 2 | 24 | 2 | 24 3 | 10 | 3 | 30 (2 rows) |
在这种情况下,FROM子句中列出了所有的表,并在之后的WHERE子句中进行了连接,结果显示为笛卡尔积。
2.显式连接
在FROM子句中使用JOIN,这种连接方式是进行显式连接。
以下示例展示了显式连接:
postgres=# SELECT * FROM test_1 JOIN test_2 ON (class_no = course_no); id | class_no | id | course_no -----+--------------+-----+----------- 2 | 24 | 2 | 24 (1 row) |
在这种情况下,表使用ON子句直接连接。ON子句只包含连接这些表的条件,结果显示为经过ON子句过滤后的笛卡尔积。
显式连接支持两种类型的语法结构:ON子句和USING子句。如果要将不同的列相互连接,ON子句是最佳选择。USING子句具有相同的含义,但只有在两侧的列具有相同名称时才能使用它,否则会发出语法错误,例如:
postgres=# SELECT * FROM test_1 JOIN test_2 USING (class_no = course_no); 2018-12-06 10:22:03.847 CST [2417] ERROR: syntax error at or near "=" at character 50 2018-12-06 10:22:03.847 CST [2417] STATEMENT: SELECT * FROM test_1 JOIN test_2 USING (class_no = course_no); ERROR: syntax error at or near "=" LINE 1: SELECT * FROM test_1 JOIN test_2 USING (class_no = course_no... |
USING子句通常用于将键相互连接,如下一个示例所示:
postgres=# SELECT * FROM test_1 JOIN test_2 USING (id); id | class_no | course_no -----+--------------+----------- 2 | 24 | 24 3 | 10 | 30 (2 rows) |
在两张测试表中,都有一个名为“id”的列,因此可以在此处使用USING子句。
通常,显式连接不仅用于连接两个表,而是用于连接更多数量的表。
示例:
创建第三张测试表test_3并插入数据。
postgres=# CREATE TABLE test_3(id int,dept_no int); CREATE TABLE postgres=# INSERT INTO test_3 VALUES (3,30), (4,20), (5,45); INSERT 0 3 |
要执行显式连接,只需在语句中添加附加JOIN和USING子句。例如:
postgres=# SELECT * FROM test_1 INNER JOIN test_2 USING (id) JOIN test_3 USING (id); id | class_no | course_no | dept_no -----+--------------+---------------+--------- 3 | 10 | 30 | 30 (1 row) |
当然,也可以使用隐式连接:
postgres=# SELECT * FROM test_1,test_2,test_3 WHERE test_1.id = test_2.id and test_2.id = test_3.id; id | class_no | id | course_no | id | dept_no -----+--------------+----+----------------+-----+--------- 3 | 10 | 3 | 30 | 3 | 30 (1 row) |
但是,从结果中可以看到,使用隐式连接和显式连接的结果存在一些小差异,隐式连接会返回更多的列。
更多详情请登录【瀚高技术支持平台]查看