PostgreSQL连接(JOIN)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL JOIN子句用于把两个或多个表的行结合起来,基于这些表之间的共同变量。在PostgreSQL中,JOIN有五种连接类型:CROSS JOIN:交叉连接内连接:内连接LEFT OUTER JOIN:左外连接右外连接:右外连接FULL OUTER JOIN:全外连接接下来让我们创建两张表COMPANY和DEPARTMENT。

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 ,名称,部门;

  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 ;

  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 ;

  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 ;

  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 ;

  1 | 保罗| IT账单1 | 保罗| IT 账单    
  2 | 艾伦| 工程2 | 艾伦| 工程    
  7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
    | 詹姆斯|
    | 大卫|
    | 保罗|
    | 金|
    | 马克|
    | 泰迪
    | 詹姆斯|

(10列)

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 PostgreSQL
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
1317 0
|
4月前
|
关系型数据库 Shell C#
PostgreSQL修改最大连接数
在使用PostgreSQL时,可能遇到“too many clients already”错误,这是由于默认最大连接数(100)不足。要增加此数值,需修改`postgresql.conf`中的`max_connections`参数
227 5
|
1月前
|
关系型数据库 数据库 PostgreSQL
深入理解 PostgreSQL 的 JOIN 连接
深入理解 PostgreSQL 的 JOIN 连接
97 4
|
3月前
|
SQL 关系型数据库 数据库
PostgreSQL常用命令,启动连接,pg_dump导入导出
PostgreSQL常用命令,启动连接,pg_dump导入导出
|
4月前
|
JavaScript 关系型数据库 API
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
这篇文章介绍了什么是Prisma以及如何在Node.js和TypeScript后端应用中使用它。Prisma是一个开源的下一代ORM,包含PrismaClient、PrismaMigrate、PrismaStudio等部分。文章详细叙述了安装PrismaCLI和依赖包、初始化Prisma、连接数据库、定义Prisma模型、创建Prisma模块的过程,并对比了Prisma和Sequelize在Nest.js中的使用体验,认为Prisma更加便捷高效,没有繁琐的配置。
172 7
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
|
3月前
|
关系型数据库 MySQL 数据库
postgresql使用mysql_fdw连接mysql
通过以上步骤,你可以在PostgreSQL中访问和查询远程MySQL服务器的数据,这对于数据集成和多数据库管理非常有用。
211 0
|
4月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之使用连接串模式新增PostgreSQL数据源时遇到了报错"not support data sync channel, error code: 0001",该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
SQL 关系型数据库 数据库
EF Core连接PostgreSQL数据库
EF Core连接PostgreSQL数据库
45 0
|
6月前
|
SQL JSON 关系型数据库
[UE虚幻引擎插件DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据库说明
本插件主要是支持在UE蓝图中连接和操作PostgreSQL 数据库。
59 2
|
SQL 关系型数据库 数据库
postgresql中连接两张表更新第三张表(updata)
如何结合两张表的数据来更新第三张表
297 0
下一篇
无影云桌面