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
- PostgreSQL JOINS子句
- PostgreSQL LIMIT子句
- PostgreSQL with子句 递归
- PostgreSQL with子句使用
- Joins
- PostgreSQL的LIMIT子句解析
- sqlserver2005 joins
- outer joins
- 认识Joins
- ClassMethods -- joins
- SQL Joins
- SQL Joins
- SQL joins
- SQLite Joins
- semi joins
- getting joins
- SQL JOINS
- SQL : joins
- div加height auto的必要性
- bingo小游戏介绍以及概率问题
- 何谓最优解
- HDOJ1001Sum Problem
- 数据库 (逻辑图)
- PostgreSQL JOINS子句
- 【26.09%】【codeforces 579C】A Problem about Polyline
- CODEVS 1497取余运算
- [LeetCode]149. Max Points on a Line
- 如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
- solution of POJ: 1328.Radar Installation
- 395.Coins in a Line II-硬币排成线 II(中等题)
- vim 使用
- [NOIP 2011] Mayan游戏:搜索,模拟