ITPub博客

首页 > IT职业 > > PostgreSQL连接(JOIN)

PostgreSQL连接(JOIN)

作者:格伯纳 时间:2020-05-08 14:11:07 0 删除 编辑

PostgreSQL JOIN子句用于把两个或多个表的行结合起来,基于这些表之间的共同变量。

在PostgreSQL中,JOIN有五种连接类型:

  • CROSS JOIN:交叉连接
  • 内连接:内连接
  • LEFT OUTER JOIN:左外连接
  • 右外连接:右外连接
  • FULL OUTER JOIN:全外连接

接下来让我们创建两张表COMPANY和DEPARTMENT。

实例

创建COMPANY表(下载COMPANY SQL文件),数据内容如下:

runoobdb#select * from COMPANY;
 id | 名称| 年龄| 地址| 薪水
---- + ------- + ----- + ----------- + --------
  1 | 保罗| 32 | 加利福尼亚| 20000
  2 | 艾伦| 25 | 德州| 15000
  3 | 泰迪 23 | 挪威| 20000
  4 | 马克| 25 | 富蒙德| 65000
  5 | 大卫| 27 | 德州| 85000
  6 | 金| 22 | 南厅| 45000
  7 | 詹姆斯| 24 | 休斯顿| 10000
(7列)

我们往表里添加几条数据:

插入公司价值(8,'Paul',24,'Houston',20000.00);
插入公司值(9,“詹姆斯”,44,“挪威”,5000.00);
插入公司值(10,“詹姆斯”,45,“德州”,5000.00);

此时,COMPANY表的记录如下:

id | 名称| 年龄| 地址| 薪水
 ---- + ------- + ----- + -------------- + --------
   1 | 保罗| 32 | 加利福尼亚| 20000
   2 | 艾伦| 25 | 德州| 15000
   3 | 泰迪 23 | 挪威| 20000
   4 | 马克| 25 | 富蒙德| 65000
   5 | 大卫| 27 | 德州| 85000
   6 | 金| 22 | 南厅| 45000
   7 | 詹姆斯| 24 | 休斯顿| 10000
   8 | 保罗| 24 | 休斯顿| 20000
   9 | 詹姆斯| 44 | 挪威| 5000
  10 | 詹姆斯| 45 | 德州| 5000
(10列)

创建一张DEPARTMENT表,添加三个区段:

创建表格部门(
   ID INT PRIMARY KEY NOT NULL,
   DEPT CHAR(50)NOT NULL,
   EMP_ID INT非空
););

向DEPARTMENT表插入三条记录:

插入部门(ID,DEPT,EMP_ID)值(1,'IT Billing',1);(ID ,DEPT ,EMP_ID )VALUES (1 ,'IT Billing' ,1 );   

插入部门(ID,DEPT,EMP_ID)值(2,'工程',2);(ID ,DEPT ,EMP_ID )VALUES (2 ,'Engineering' ,2 );   

插入部门(ID,DEPT,EMP_ID)值(3,'Finance',7);(ID ,DEPT ,EMP_ID )VALUES (3 ,'Finance' ,7 );   

此时,DEPARTMENT表的记录如下:

id | 部门| emp_id| 部门         | emp_id
---- + ------------- + ------------ + ------------- + --------
  1 | IT帐单| 1个1 | IT 帐单| 1个     
  2 | 工程| 22 | 工程| 2     
  3 | 财务| 73 | 财务| 7         

交叉连接

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有x和y行,则结果表有x * y行。

由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

下面是CROSS JOIN的基础语法:

SELECT ... FROM table1交叉联接table2 ...... 来自表1交叉联接表2 ...

基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:

runoobdb =#从公司交叉联接部门选择EMP_ID,名称,名称;=#从公司交叉联接部门选择EMP_ID ,名称,部门;

得到结果如下:

runoobdb =#从公司交叉联接部门选择EMP_ID,名称,名称;=#从公司交叉联接部门选择EMP_ID ,名称,部门;
 emp_id | 名称| 部门| 名称   |        部门
-------- + ------- + ---------------------------- + ------- + --------------------
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      1 | 艾伦| IT账单1 | 艾伦| IT 账单   
      1 | 泰迪 IT账单1 | 泰迪| IT 账单   
      1 | 马克| IT账单1 | 马克| IT 账单    
      1 | 大卫| IT账单1 | 大卫| IT 账单   
      1 | 金| IT账单1 | 金| IT 账单     
      1 | 詹姆斯| IT账单1 | 詹姆斯| IT 账单   
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      1 | 詹姆斯| IT账单1 | 詹姆斯| IT 账单   
      1 | 詹姆斯| IT账单1 | 詹姆斯| IT 账单   
      2 | 保罗| 工程2 | 保罗| 工程     
      2 | 艾伦| 工程2 | 艾伦| 工程    
      2 | 泰迪 工程2 | 泰迪| 工程    
      2 | 马克| 工程2 | 马克| 工程     
      2 | 大卫| 工程2 | 大卫| 工程    
      2 | 金| 工程2 | 金| 工程      
      2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
      2 | 保罗| 工程2 | 保罗| 工程     
      2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
      2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
      7 | 保罗| 金融7 | 保罗| 金融     

内连接

内连接(INNER JOIN)根据连接谓词结合两个表(table1和table2)的列值来创建一个新的结果表。查询会把table1中的每一行与table2中的每一行进行比较,找到所有满足连接谓词的行的匹配对。

当满足连接谓词时,A和B行的每个匹配对的列值会合并成一个结果行。

内连接(INNER JOIN)是最常见的连接类型,是另一种的连接类型。

INNER关键字是任选的。

下面是内连接(INNER JOIN)的语法:

选择table1.column1,table2.column2 ...。column1 ,表2 。第2列...
从表1
内联接表2
开启table1.common_filed = table2.common_field;。common_filed = table2 。common_field ;

基于上面的表,我们可以写一个内连接,如下所示:

runoobdb =#从COMPANY.ID = DEPARTMENT.EMP_ID上的公司内部联接部门选择EMP_ID,名称,名称;=#从公司的内部连接部门选择EMP_ID ,名称,部门。ID = 部门。EMP_ID ;
 emp_id | 名称| 部门| 名称   |         部门
-------- + ------- + ---------------------- + ------- + --------------
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      2 | 艾伦| 工程2 | 艾伦| 工程    
      7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
(3列)(3 行)

左外连接

SQL标准定义了三种类型的外部连接:LEFT,RIGHT和FULL,PostgreSQL支持所有这些。

对于左外连接,首先执行一个内部连接。然后,对于表T1中不满足表T2中连接条件的每一行,其中T2的列中有空值也会添加一个连接行。因此,连接的表在T1中每一行至少有一行。

下面是左外连接(LEFT OUTER JOIN)的基础语法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...... FROM table1左外部联接table2 ON conditional_expression ...

基于上面两张表,我们可以写个左外连接,如下:

runoobdb =#从COMPANY.ID = DEPARTMENT.EMP_ID上的公司左外加入部门选择EMP_ID,名称,名称;=#从公司的左外连接部门选择EMP_ID ,名称,部门。ID = 部门。EMP_ID ;
 emp_id | 名称| 部门| 名称   |       部门
-------- + ------- + ------------------------ + ------- + ----------------
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      2 | 艾伦| 工程2 | 艾伦| 工程    
      7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
        | 詹姆斯|| 詹姆斯|   
        | 大卫|| 大卫|   
        | 保罗|| 保罗|    
        | 金|| 金|     
        | 马克|| 马克|    
        | 泰迪| 泰迪|   
        | 詹姆斯|| 詹姆斯|   
(10列)(10 行)

右外连接

首先,执行内部连接。然后,对于表T2中不满足表T1中连接条件的每一行,其中T1列中的变量空也会添加一个连接行。这与左联接相反;对于T2中的每一行,结果表总是有一行。

下面是右外连接(RIGHT OUT JOIN)的基本语法:

SELECT ... FROM table1右外连接table2 ON conditional_expression ...... FROM table1右OUTER JOIN table2 ON conditional_expression ...

基于上面两张表,我们建立一个右外连接:

runoobdb =#选择EMP_ID,名称,从COMPANY.ID上的公司右外加入部门中提取; = DEPARTMENT.EMP_ID;=#选择公司的外部联接部门的EMP_ID ,名称,部门。ID = 部门。EMP_ID ;
 emp_id | 名称| 部门| 名称   |     部门
-------- + ------- + ------------------------- + ------- + -----------------
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      2 | 艾伦| 工程2 | 艾伦| 工程    
      7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
(3列)(3 行)

外连接

首先,执行内部连接。然后,对于表T1中不满足表T2中任何行连接条件的每一行,如果T2的列中有null值也会添加一个到结果中。中的任何行连接条件的每一行,将会添加T1列中包含null值的到结果中。

下面是外连接的基本语法:

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

基于上面两张表,可以建立一个外连接:

runoobdb =#从COMPANY.ID = DEPARTMENT.EMP_ID上的公司完整外联部门选择EMP_ID,名称,名称。=#从公司的外部联接部门选择EMP_ID ,名称,部门。ID = 部门。EMP_ID ;
 emp_id | 名称| 部门| 名称   |       部门
-------- + ------- + ------------------------- + ------- + -----------------
      1 | 保罗| IT账单1 | 保罗| IT 账单    
      2 | 艾伦| 工程2 | 艾伦| 工程    
      7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
        | 詹姆斯|
        | 大卫|
        | 保罗|
        | 金|
        | 马克|
        | 泰迪
        | 詹姆斯|
(10列)


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3126244/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 秒杀系统架构!
请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984279