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

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

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

返回的数据条数,可以通过集合求算。假如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
-----------+--------+----------+-------------
2 | 1 | 张三 | 大学英语
4 | 1 | 张三 | 电影欣赏
4 | 2 | 李四 | 电影欣赏
4 | 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
-----------+--------+----------+-------------
2 | 1 | 张三 | 大学英语
4 | 1 | 张三 | 电影欣赏
4 | 2 | 李四 | 电影欣赏
4 | 3 | 王五 | 电影欣赏
NULL | 4 | 麻子 | NULL
(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
-----------+--------+----------+-------------
2 | 1 | 张三 | 大学英语
4 | 1 | 张三 | 电影欣赏
4 | 2 | 李四 | 电影欣赏
4 | 3 | 王五 | 电影欣赏
3 | NULL | NULL | 大学物理
1 | 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
-----------+--------+----------+-------------
2 | 1 | 张三 | 大学英语
4 | 1 | 张三 | 电影欣赏
4 | 2 | 李四 | 电影欣赏
4 | 3 | 王五 | 电影欣赏
NULL | 4 | 麻子 | NULL
3 | NULL | NULL | 大学物理
1 | 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
--------+----------+-----------
4 | 麻子 | 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
-----------+--------+-------------
1 | NULL | 高等数学
3 | 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
3 | NULL | NULL | 大学物理
1 | NULL | NULL | 高等数学
(3 rows)


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



postgresql 多表联查的更多相关文章

  1. mybatis.net 多表联查

    mybatis.net针对多表联查,其实不用讲联查出的所有的列全部做一个新的resultMap,我们完全可以通过集成关系来实现,真是上一次说的懒加载,在一定程度上可以提高其性能,但这并不是说懒加载性能 ...

  2. CDH中,执行HIVE脚本表联查权限问题。。

    文章来自http://www.cnblogs.com/hark0623/p/4174641.html 转发请注明 有时候执行表联查的时候总会出现没有权限写文件的情况. 这个时候使用sudo -H hi ...

  3. Postgresql两表联结更新

    Postgresql两表联合更新近日使用Postgresql感到有点不好用,一个联合更新非要这样写语法才对:update d_routetripset name=b.name ,    descrip ...

  4. MVC +EF+linq 多表联查

    关于linq的多表联查效果的实现: 后台多表查询  内连接: SELECT [Extent2].[partID] AS [partID], [Extent1].[userName] AS [userN ...

  5. 使用mybatis多表联查的时候结果异常及springmvc的理解

    今天使用mybatis多表联查的时候,在dos窗口查询时可以出结果集,但是使用mybatis查询的时候最后返回的结果只有最后一个结果 然后研究了半天没弄出来,后来无意中发现添加了最外层从表的ID字段后 ...

  6. asp.net mvc 三层加EF两表联查

    首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...

  7. SQLServer多表联查,多表分页查询

    多表联查: select p.*,s.Sheng , i.Shifrom  [dbo].[ProductRecordInfo]   --表名 p left join [ShengInfo] s on ...

  8. [工作日志] 2018-11-30 重要: 1. 多条件+ 分页 + 多表联查 2. idea拉新分支

    多条件+ 分页 + 多表联查 多条件查询 1.pom依赖 <dependency> <groupId>commons-dbutils</groupId> <a ...

  9. .NET MVC+ EF+调用存储过程 多表联查以及VIEW列表显示

    直接上干活,至于网上的一大堆处理方式不予评论,做好自己的就是最好的,供大家不走弯路 1.view页面 <link href="~/Content/bootstrap.css" ...

随机推荐

  1. 【转】JDBC学习笔记(3)——复习和练习

    转自:http://www.cnblogs.com/ysw-go/ 复习部分 一.获取数据库连接 1)方式一 1 // 获取数据库连接 2 @Test 3 public void testGetCon ...

  2. POJ 1741/1987 树的点分治

    树的点分治,主要思想是每次找子树的重心,计算经过根节点的情况数,再减去点对属于同一子树的情况. #include <iostream> #include <vector> #i ...

  3. Nodejs进阶:MD5入门介绍及crypto模块的应用

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 简介 MD5(Message-Digest Algorithm) ...

  4. cmd中关闭windows2008错误弹窗

    net stop sharedaccess reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Windows /v ErrorMode / ...

  5. java集合的核心知识

    1.    集合 1.1. 什么是集合 存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式. 集合的出现就是为了持有对象. ...

  6. 厉害了我的雅虎!卖掉主业后更名为阿里他爸(Altaba)

    据雅虎周一向美国证券交易委员会(SEC)提交的文件显示,在美国通信巨头Verizon斥资48亿美元收购雅虎的交易完成后,该公司首席执行官玛丽莎o梅耶尔(Marissa Mayer)将退出公司董事会. ...

  7. FrameBuffer系列 之 显示图片

     摘自:http://blog.csdn.net/luxiaoxun/article/details/7622988 #include <unistd.h> #include < ...

  8. iOS开发 - CocoaPods安装和使用教程

    一.CocoaPods简介 1.什么是CocoaPods CocoaPods是iOS的包管理工具. 2.为什么要使用CocoaPods 在开发iOS项目时,经常会使用第三方开源库,手动引入流程复杂,并 ...

  9. 蓝桥杯-打印十字图-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  10. [刷题]算法竞赛入门经典(第2版) 5-8/UVa230 - Borrowers

    //又开学啦,不知不觉成为大二的老人了...时间过得好快啊,感觉好颓废... 题意:建立一个借书/归还系统.有借.还.把还的书插到书架上这三个指令. 代码:(Accepted, 0ms) //UVa2 ...