postgresql 多表联查

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:

使用语句的先后顺序并不是优先级的排序:

连接分为:内连接和外连接,外连接分为左外连接,右外连接,全连接

概念上解释,表之间联合后数据如何整合。

返回的数据条数,可以通过集合求算。假如A集合有10条数据,B集合有8条数据,交集的有3条数据。

左外连接:左表的数据全部保留,右表中如果没有满足条件的用null对应。返回数据条数假如A是左表,B是右表,那么返回10条。

内连接:两个表连接条件都存在数据保留,相当于数据集合的交集。返回数据条数假如A是左表,B是右表,那么返回3条。

右外连接:右表数据全部保留,左表中如果没有满足条件的用null对应。返回数据条数假如A是左表,B是右表,那么返回8条。

全连接:左表右表数据全部保留。返回数据条数假如A是左表,B是右表,那么返回13条。

语句:

内连接: table A inner join table B on(条件)/ table A inner join table B using(连接字段名称在两个表中相同)。

左外连接:table A left join table B on(条件)/table A left join table B on(连接字段名称在两个表中相同)。

右外连接:table A right join table B on(条件)/table A right join table B on(连接字段名称在两个表中相同)。

全连接(全外连接):table A full join table B on(条件)/table A full join table B on(连接字段名称在两个表中相同)。

测试实例:

测试表:

create table tbl_course(

course_id bigint not null primary key,
course_name varchar(12) not null

);

create table tbl_student(

stu_id bigint not null,
stu_name varchar(12),
constraint pk_tbl_student_stu_id primary key(stu_id)

);

create table tbl_student_course(

stu_id bigint not null,
course_id bigint not null,
constraint pk_tbl_student_course_stu_id_course_id primary key(stu_id,course_id),
constraint fk_tbl_student_course_stu_id foreign key(stu_id) references tbl_student(stu_id) ,
constraint fk_tbl_student_course_course_id foreign key(course_id) references tbl_course(course_id)

);

insert into tbl_course values(1,‘高等数学‘),(2,‘大学英语‘),(3,‘大学物理‘),(4,‘电影欣赏‘);
insert into tbl_student values(1,‘张三‘),(2,‘李四‘),(3,‘王五‘),(4,‘麻子‘);
insert into tbl_student_course values (1,2),(1,4),(2,4),(3,4);

二.内连接

INNER JOIN,其中INNER可以省略。

语法:

A INNER JOIN B ON (A.a = B.b)

如果ON条件中两张表的字段名称相同,还可以简单一点

A INNER JOIN B USING(a = b)

内连接的结果如下图中红色部分

示例:查询选课情况

test=# select * from tbl_student_course join tbl_student using(stu_id) join tbl_course using(course_id);

course_id stu_id stu_name course_name
1 张三 大学英语
1 张三 电影欣赏
2 李四 电影欣赏
3 王五 电影欣赏

(4 rows)

三.左外连接

左外连接其实是一个内连接然后加上左表独有的数据行,结果集中右表的字段自动补充NULL。

LEFT OUTTER JOIN ,其中OUTTER可以省略。

语法:

A LEFT JOIN B ON (A.a=B.b)

A LEFT JOIN B USING(a)

左外连接的结果如下图红色部分

示例:查询所有学生的选课信息,包括没选课的学生

test=# select * from tbl_student left join tbl_student_course using(stu_id) left join tbl_course using(course_id);

course_id stu_id stu_name course_name
1 张三 大学英语
1 张三 电影欣赏
2 李四 电影欣赏
3 王五 电影欣赏

(5 rows)

四.右外连接

右外连接其实是一个内连接然后加上右表独有的数据行,结果集中左表的字段自动补充NULL。

RIGHT OUTTER JOIN ,其中OUTTER可以省略。

语法:

A RIGHT JOIN B ON (A.a=B.b)

A RIGHT JOIN B USING(a)

右外连接的结果如下图红色部分

示例:查询所有课程被选情况

test=# select * from tbl_student right join tbl_student_course using(stu_id) right join tbl_course using(course_id);

course_id stu_id stu_name course_name
1 张三 大学英语
1 张三 电影欣赏
2 李四 电影欣赏
3 王五 电影欣赏
NULL NULL 大学物理
NULL NULL 高等数学

(6 rows)

五.全外连接

全外连接其实是一个内连接然后加上左表和右表独有的数据行,左表独有的数据行右表的字段补充NULL,右表独有的数据行左表字段补充NULL。

FULL OUTTER JOIN,其中OUTTER可以省略。

语法:

A FULL OUTTER JOIN B ON (A.a = B.b)

A FULL OUTTER JOIN B USING(a)

全外连接的结果如下图红色部分

示例:查询所有学生和课程的选课信息

test=# select * from tbl_student full join tbl_student_course using(stu_id) full join tbl_course using(course_id);

course_id stu_id stu_name course_name
1 张三 大学英语
1 张三 电影欣赏
2 李四 电影欣赏
3 王五 电影欣赏
NULL 4 麻子 NULL
NULL NULL 大学物理
NULL NULL 高等数学

(7 rows)

查询只在左表存在的数据

示例:查询没有选课的学生

test=# select * from tbl_student left join tbl_student_course using(stu_id) where tbl_student_course.stu_id is null;

stu_id stu_name course_id
麻子 NULL

(1 row)

NOT IN存在很大的性能瓶颈,除NOT EXISTS外,也可以使用这种查询方式作为替代方案。

查询只在右表中存在的数据

示例:查询没有被选的课程

test=# select * from tbl_student_course right join tbl_course using(course_id) where tbl_student_course.course_id is null;

course_id stu_id course_name
NULL 高等数学
NULL 大学物理

(2 rows)

查询只在左表或只在右表存在的数据

示例:查询没有选课的学生和没有被选的课程

test=# select * from tbl_student full join tbl_student_course using(stu_id) full join tbl_course using(course_id) where tbl_student.stu_id is null or tbl_course.course_id is null;

course_id stu_id stu_name course_name
NULL 4 麻子 NULL
NULL NULL 大学物理
NULL NULL 高等数学

(3 rows)

所有的JOIN查询,只要理解了下面的图,一切就OK了!

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
关系型数据库 PostgreSQL
postgresql中关联多表递归查询,并分组计数、求和
postgresql中关联多表递归查询,并分组计数、求和
|
SQL Cloud Native 关系型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
1246 1
|
数据可视化 关系型数据库 MySQL
将 PostgreSQL 迁移到 MySQL 数据库
将 PostgreSQL 迁移到 MySQL 数据库
1727 2
|
SQL 存储 自然语言处理
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
|
关系型数据库 测试技术 分布式数据库
PolarDB | PostgreSQL 高并发队列处理业务的数据库性能优化实践
在电商业务中可能涉及这样的场景, 由于有上下游关系的存在, 1、用户下单后, 上下游厂商会在自己系统中生成一笔订单记录并反馈给对方, 2、在收到反馈订单后, 本地会先缓存反馈的订单记录队列, 3、然后后台再从缓存取出订单并进行处理. 如果是高并发的处理, 因为大家都按一个顺序获取, 容易产生热点, 可能遇到取出队列遇到锁冲突瓶颈、IO扫描浪费、CPU计算浪费的瓶颈. 以及在清除已处理订单后, 索引版本未及时清理导致的回表版本判断带来的IO浪费和CPU运算浪费瓶颈等. 本文将给出“队列处理业务的数据库性能优化”优化方法和demo演示. 性能提升10到20倍.
828 4