隐式连接和显式连接

目录

文档用途

详细信息

文档用途

连接有多种形式,例如内连接,外连接,交叉连接,自连接等。但是最重要的区别之一是隐式连接和显式连接之间的区别。

本文将对隐式连接和显式连接进行介绍。

详细信息

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)

但是,从结果中可以看到,使用隐式连接和显式连接的结果存在一些小差异,隐式连接会返回更多的列。

更多详情请登录【瀚高技术支持平台]查看

https://support.highgo.com/#/index/docImportantResult/0d03d87418/6c2fb85bbc9ea44af802eccc96https://support.highgo.com/#/index/docImportantResult/0d03d87418/6c2fb85bbc9ea44af802eccc96

你可能感兴趣的:(Highgo,DB)