PostgreSQL JOINS子句

来源:互联网 发布:web服务器 并发 java 编辑:程序博客网 时间:2024/05/22 03:30

原文:http://www.yiibai.com/html/postgresql/2013/080569.html

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

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

  • CROSS JOIN

  • INNER JOIN

  •  LEFT OUTER JOIN yiibai.com

  •  RIGHT OUTER JOIN

  •  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  

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

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 );  

最后,我们已经按照部门表中的记录列表: 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的语法:

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

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

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

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

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创建一个新的结果表,通过结合两个表(表1和表2)根据联接谓词的列值。查询比较table1中的每一行,每一行表2,找到所有对满足连接谓词的行。当联接谓词满足table1和table2每个对相匹配的行,列的值合并成一个结果行。

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

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

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

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

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 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的语法:

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中的每一行。

以下是LEFT 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; yiibai.com 

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

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

FULL OUTER JOIN

首先,进行内部联接。然后,表T1中的每一行并不满足连接条件的T2表中的任何行,参加行加上T2的列中的空值。此外,T2的每一行并不满足连接条件的T1中的任何行,在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 | www.yiibai.com 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在野外被蚂蚁咬怎么办 娱乐之太帅了怎么办 鞋舌头歪没有孔怎么办 万一吃了母猪肉怎么办 我的手机丢了怎么办 欠了赌债还不起怎么办 车库门前被堵了怎么办 别人车停我车位怎么办 怎么办能防止锁眼被堵 别人堵着我车了怎么办 马桶被排骨堵了怎么办 马桶被刷子堵了怎么办 屎太大马桶堵了怎么办 大便硬马桶堵了怎么办 马桶让大便堵了怎么办 出了月子奶水少怎么办 木瓜没熟切开了怎么办 小孩被蚊虫叮咬红肿怎么办 下巴歪导致脸歪怎么办 全民k歌有杂音怎么办 录歌换气声很大怎么办 网易云没有的歌怎么办 qq空间给封了怎么办 酒店住最后一间怎么办 妻子起诉离婚丈夫不离怎么办 老婆对我没感情怎么办 老婆要跟我离婚怎么办 眼睛里进了沙子怎么办 耳塞孔进沙子了怎么办 斜挎包链子长了怎么办 爱上大15岁大叔怎么办 老板不给发工资怎么办 4个月婴儿感冒了怎么办 9个月宝宝感冒了怎么办 婆婆去世了我该怎么办 腰疼得睡不着觉怎么办 长期抱孩子腰疼怎么办 抱孩子累的腰疼怎么办 带孩子带的腰疼怎么办 生完孩子后便秘怎么办 生完宝宝下面松怎么办