现在位置:首页 > 数据库 > PostgreSQL > PostgreSQL JOINS子句

PostgreSQL JOINS子句

来源:原创文章    由 易百 更新版本    浏览:人次

PostgreSQL的联接(Joins)子句用于从两个或多个数据库中的表的记录相结合。一个JOIN是一种手段,从两个表中使用常见于每个值相结合的字段。

yiibai.com

在PostgreSQL的Join 类型是:: www.yiibai.com

  • CROSS JOIN www.yiibai.com

  • INNER JOIN www.yiibai.com

  •  LEFT OUTER JOIN yiibai.com

  •  RIGHT OUTER JOIN

    www.yiibai.com

  •  FULL OUTER JOIN yiibai.com

在我们开始之前,让我们考虑两个表COMPANY 和DEPARTMENT。我们已经看到了INSERT语句来填充COMPANY表。所以只是让我们假设公司表的记录列表: www.yiibai.com

 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 

yiibai.com

另一张表是部门有以下定义: yiibai.com

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

这里是填充DEPARTMENT表的INSERT语句列表:

www.yiibai.com

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 ); 
www.yiibai.com

最后,我们已经按照部门表中的记录列表: yiibai.com

 id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7 www.yiibai.com 

CROSS JOIN

交叉连接匹配的第一个表与第二个表中的每一行的每一行。如果输入表,结果表x和y列,分别有X + Y列。由于交叉联接有可能产生非常大的表,必须谨慎,只在适当的时候使用它们。 yiibai.com

以下是CROSS JOIN的语法:

yiibai.com

SELECT ... FROM table1 CROSS JOIN table2 ... www.yiibai.com 

根据上面的表上,我们可以写一个交叉连接如下: www.yiibai.com

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT; yiibai.com 

上面的查询会产生以下结果: www.yiibai.com

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
 www.yiibai.com 

INNER JOIN

INNER JOIN创建一个新的结果表,通过结合两个表(表1和表2)根据联接谓词的列值。查询比较table1中的每一行,每一行表2,找到所有对满足连接谓词的行。当联接谓词满足table1和table2每个对相匹配的行,列的值合并成一个结果行。 yiibai.com

内部联接联接类型是最常见的,并且是默认的联接类型。您可以使用可选INNER关键字。 www.yiibai.com

以下是INNER JOIN的语法: www.yiibai.com

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field; yiibai.com 

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

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

www.yiibai.com

上面的查询会产生以下结果:

yiibai.com

 emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
 www.yiibai.com 

LEFT OUTER JOIN

OUTER JOIN是一个扩展的INNER JOIN。 SQL标准定义了三种类型的外联接:左,右,并充分和PostgreSQL支持所有这些。 yiibai.com

LEFT OUTER JOIN的情况下,先进行内部联接。然后,表T1中的每一行并不满足连接条件的T2表中的任何行,参加行加上T2的列中的空值。因此,加入表总是至少有一个排T1中的每一行。 yiibai.com

以下是LEFT OUTER JOIN的语法:

yiibai.com

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

yiibai.com

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

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

上面的查询会产生以下结果:

www.yiibai.com

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

RIGHT OUTER JOIN

首先,进行内部联接。然后,T2表中的每一行并不满足连接条件的在T1表中的任何行,参加行添加T1的列中的空值。这是跟左连接相反的,将永远有一个结果表行T2中的每一行。

www.yiibai.com

以下是LEFT OUTER JOIN的语法:

www.yiibai.com

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

www.yiibai.com

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

www.yiibai.com

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

上面的查询会产生以下结果:

yiibai.com

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

FULL OUTER JOIN

首先,进行内部联接。然后,表T1中的每一行并不满足连接条件的T2表中的任何行,参加行加上T2的列中的空值。此外,T2的每一行并不满足连接条件的T1中的任何行,在T1的列用空值添加一个连接行。

yiibai.com

以下是FULL OUTER JOIN的语法: www.yiibai.com

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

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

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

www.yiibai.com

上面的查询会产生以下结果:

yiibai.com

 emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James | www.yiibai.com 
本站文章除注明转载外,均为本站原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,传播学习教程;
转载请注明:文章转载自:易百教程 [http://www.yiibai.com]
本文标题:PostgreSQL JOINS子句
转载请保留原文链接:http://www.yiibai.com/html/postgresql/2013/080569.html
上一篇:PostgreSQL约束条件      下一篇:PostgreSQL UNIONS子句