开发手册 欢迎您!
软件开发者资料库

PostgreSQL - JOINS联接

PostgreSQL JOINS - 从简单和简单的步骤学习PostgreSQL,从基本到高级概念,包括数据库编程,概述,环境设置,语法,数据类型,创建,选择,删除数据库,删除,创建表,架构,插入,选择,更新,删除查询,运算符,表达式,Where,Like,Limit,Order By,Group By,With,having Clause,AND AND OR运算符,Distinct Keyword,Constraints,Joins,Unions Clause,NULL Values,Alias Syntax,Triggers,Indexes ,更改表命令,截断表命令,视图,事务,锁,子查询,自动增量,权限,日期/时间函数和操作符,函数,有用函数,C / C ++,JAVA,PHP,Perl,Python接口。

PostgreSQL 联接子句用于组合数据库中两个或多个表的记录. JOIN是一种通过使用每个表共有的值组合来自两个表的字段的方法.

PostgreSQL中的连接类型是 :

  • CROSS JOIN

  • INNER JOIN

  • LEFT OUTER JOIN

  • RIGHT OUTER JOIN

  • FULL OUTER JOIN

在我们继续之前,让我们考虑两个表,公司和部门.我们已经看到INSERT语句填充COMPANY表.所以,让我们假设在COMPANY表中可用的记录列表 :

 id | name  | age | address   | salary | join_date----+-------+-----+-----------+--------+-----------  1 | Paul  |  32 | California|  20000 | 2001-07-13  3 | Teddy |  23 | Norway    |  20000 |  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13  5 | David |  27 | Texas     |  85000 | 2007-12-13  2 | Allen |  25 | Texas     |        | 2007-12-13  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13  9 | James |  44 | Norway    |   5000 | 2005-07-13 10 | James |  45 | Texas     |   5000 | 2005-07-13

另一个表是DEPARTMENT,具有以下定义 :

  CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50)NOT NULL, EMP_ID INT NOT NULL );

以下是填充DEPARTMENT表的INSERT语句列表 :

  INSERT INTO DEPARTMENT(ID,DEPT,EMP_ID) VALUES(1,'IT Billing',1);  INSERT INTO DEPARTMENT(ID,DEPT,EMP_ID) VALUES(2,'Engineering',2);  INSERT INTO DEPARTMENT(ID,DEPT,EMP_ID) VALUES(3,'Finance',7);

最后,我们在DEPARTMENT表中有以下记录列表 :

 id | dept        | emp_id----+-------------+--------  1 | IT Billing  |  1  2 | Engineering |  2  3 | Finance     |  7

CROSS JOIN

CROSS JOIN将第一个表的每一行与第二个表的每一行匹配.如果输入表分别具有x和y列,则结果表将具有x + y列.因为CROSS JOIN有可能生成非常大的表,所以必须注意只在适当的时候使用它们.

以下是CROSS JOIN的语法;

  SELECT ... FROM table1 CROSS JOIN table2 ...

基于以上表格,我们可以写下一个CROSS JOIN,如下所示;

  testdb = #EEC EMP_ID,NAME,DEPT FROM COMPANY CROSS JOINMENT;

上面给出的查询将产生以下结果 :

emp_id| name  |  dept------|-------|--------------    1 | Paul  | IT Billing    1 | Teddy | IT Billing    1 | Mark  | IT Billing    1 | David | IT Billing    1 | Allen | IT Billing    1 | Paul  | IT Billing    1 | James | IT Billing    1 | James | IT Billing    2 | Paul  | Engineering    2 | Teddy | Engineering    2 | Mark  | Engineering    2 | David | Engineering    2 | Allen | Engineering    2 | Paul  | Engineering    2 | James | Engineering    2 | James | Engineering    7 | Paul  | Finance    7 | Teddy | Finance    7 | Mark  | Finance    7 | David | Finance    7 | Allen | Finance    7 | Paul  | Finance    7 | James | Finance    7 | James | Finance

INNER JOIN

INNER JOIN通过组合两个表的列值(table1)创建一个新的结果表和table2)基于连接谓词.该查询将table1的每一行与table2的每一行进行比较,以查找满足join-predicate的所有行对.当满足连接谓词时,table1和table2的每对匹配行的列值将合并到结果行中.

INNER JOIN是最常见的连接类型,是默认的连接类型.您可以选择使用INNER关键字.

以下是INNER JOIN的语法;

SELECT table1.column1, table2.column2...FROM table1INNER JOIN table2ON table1.common_filed = table2.common_field;

根据上面的表格,我们可以编写一个INNER JOIN,如下所示;

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT        ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下结果 :

 emp_id | name  | dept--------+-------+------------      1 | Paul  | IT Billing      2 | Allen | Engineering

LEFT OUTER JOIN

OUTER JOIN是INNER JOIN的扩展. SQL标准定义了三种类型的OUTER JOIN:LEFT,RIGHT和FULL,PostgreSQL支持所有这些.

在LEFT OUTER JOIN的情况下,首先执行内连接.然后,对于表T1中不满足表T2中任何行的连接条件的每一行,在T2的列中添加具有空值的连接行.因此,连接表在T1中每行至少有一行.

以下是LEFT OUTER JOIN的语法;

  SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

根据上表,我们可以编写内部联接,如下所示 :

  testdb = #SELECT EMP_ID,NAME,DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT  ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下结果 :

 emp_id | name  | dept--------+-------+------------      1 | Paul  | IT Billing      2 | Allen | Engineering        | James |        | David |        | Paul  |        | Mark  |        | Teddy |        | James |

RIGHT OUTER JOIN

首先,执行内连接.然后,对于表T2中不满足表T1中任何行的连接条件的每一行,在T1的列中添加具有空值的连接行.这是左连接的逆转; T2中每行的结果表总是有一行.

以下是RIGHT OUTER JOIN的语法;

  SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

根据上面的表格,我们可以写一个内部联接如下 :

  testdb = #SELECT EMP_ID,NAME,DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT  ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下结果 :

 emp_id | name  | dept--------+-------+--------      1 | Paul  | IT Billing      2 | Allen | Engineering      7 |       | Finance

FULL OUTER JOIN

首先,执行内部联接.然后,对于表T1中不满足表T2中任何行的连接条件的每一行,在T2的列中添加具有空值的连接行.此外,对于不满足T1中任何行的连接条件的T2的每一行,添加T1列中具有空值的连接行.

以下是FULL OUTER JOIN的语法;

  SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

根据上面的表格,我们可以编写内部联接,如下所示;

  testdb = #SELECT EMP_ID,NAME,DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT  ON COMPANY.ID = DEPARTMENT.EMP_ID;

上面给出的查询将产生以下结果 :

 emp_id | name  | dept--------+-------+---------------      1 | Paul  | IT Billing      2 | Allen | Engineering      7 |       | Finance        | James |        | David |        | Paul  |        | Mark  |        | Teddy |        | James |