一、多表连接查询

1、连接方式概览
[inner] join
内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的内容。
left [outer] join
左外连接:在内连接的基础上,将A中有但C中没有的元组也加上。由于C的列数比A的行数多,所以这新增的元组左边照搬A,右边为null。
right [outer] join
右外连接:在内连接的基础上,将B中有但C中没有的元组也加上。由于C的列数比B的行数多,所以这新增的元组右边照搬B,左边为null。
full [outer] join
全外连接:相当于在内连接的基础上同时做左连接和右连接,表A和表B中的都要,两边不满足条件的都为null。
 
cross join
与上述内外连接可接连接条件不同,这一个本质是 select * from tableName1, tableName2 这种无条件交叉连接的简写,如
select * from tableName1 cross join tableName2
仅是做笛卡尔积,表A的每一行都和表B的每一行相连接,没有条件,不可后接on,结果是两表行的乘积和列的和。
 
2、条件语法概览
table1 { [inner] | { left| right| full} [outer] } join table2 on boolean_expression
用 ON 关键词后接连接条件,结果中会包含两表中条件引用到的列(条件列无论是否同名皆可)
注:select * from table1,table2 where table1.column1=table2.column1 这是一种可替代select *from table1 [inner] join table2 on boolean_expression 的快捷语法
单纯使用内连接的话可以像前者这样写,简便直白
table1 { [inner] | { left| right| full} [outer] } join table2 using ( join column list )
用 USING 关键词后接一个用逗号分隔的字段名列表,这些字段必须是连接表共有的并且其值必须相同,连接结果去重。(条件列同名,手动指定,去重)
因此,USING (a, b, c) 等效于 ON (table1.a = table2.a AND table1.b = table2.b AND table1.c = table2.c) ,结果中abc字段各仅一个。
table1 natural { [inner] | { left| right| full} [outer] } join table2
NATURAL 是 USING 的缩写形式:它自动形成一个由两个表中同名的字段组成的 USING 列表。
USING 和 NATURAL 的原理是一样的,靠两表中同名的字段连接值相同的部分,不够灵活。(条件列同名,自动寻列,去重)
 
3、简单的栗子
有两表A和B
A
 
无条件连接
select * from A cross join B
 
有条件连接
select * from A full join B on A.name = B.name
[指定条件,全外连接]
select * from A full join B using(name)
[指定条件,全外连接,去重]
select * from A natural join B
[自动寻找同名字段为条件,内连接,去重]
select * from A natural full join B
[自动寻找同名字段为条件,全外连接,去重]
 
4、更多表连接
连接ABCDE多个表可以这样: 也可以这样:
select * from (((
A inner join B on A.a = B.b)
inner join C on C.c = A.a)
inner join D on D.d = C.c)
inner join E on E.e = D.d
select * from
A inner join B on A.a = B.b
inner join C on C.c = A.a
inner join D on D.d = C.c
inner join E on E.e = D.d
 
大多数数据库系统会分析整个from子句,然后尝试确定组合连接表的最有效方式,也就是说数据库不不一定会从最里边的括号开始执行查询。这很可能打乱你的逻辑设计,得到意外的结果。一些数据库系统中的优化器对于join定义的顺序很敏感。如果你发现使用很多join的查询在一个较大的数据库上执行花很长时间,通过改变join顺序很可能能够使它运行的更快。
 

二、子查询(subquery)

在子查询中用到一些关键字,分别是“ANY、EXISTS、IN、SOME”,在这些关键字之前还可以添加“NOT”。
通常的用法如:
EXISTS (subquery)
expression [NOT] IN (subquery)
row_constructor [NOT] IN (subquery)
expression operator ANY (subquery)
expression operator SOME (subquery)
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)
 
半连接:对于“subquery”,使用IN、EXISTS等谓词表示存在即可,称之为半连接。
SELECT * FROM D
WHERE EXISTS
( SELECT * FROM E WHERE D.id= E.id
AND E.s > 2500)
ORDER BY x
 
反半连接:对于“subquery”,使用NOT IN谓词表示不存在即可,称之为反半连接。
SELECT * FROM E
WHERE id NOT IN
(SELECT id FROM D WHERE lid=1700)
ORDER BY id
 
 
 

整理自:
——
[原创]多表连接(join)小结 - ybwang1989 - 博客园
——
数据库查询中的表连接(一) - 那海蓝蓝的日志 - 网易博客
数据库查询中的表连接(二) - 那海蓝蓝的日志 - 网易博客
——
JOIN操作PostgreSql » InBi's Blog

PostgreSQL-join多表连接查询和子查询的更多相关文章

  1. SQL编程之高级查询(子查询)以及注意事项

    SQL编程之高级查询(子查询)以及注意事项   1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...

  2. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  3. Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  4. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  5. 一步步学习NHibernate(9)——连接查询和子查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...

  6. join多表连接和group by分组

    join多表连接和group by分组 上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组. 一.多表连接 多表连接的时间是数据库一个非常耗时的操作, ...

  7. mysql之连接查询、联合查询、子查询

    本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接 ...

  8. mysql查询语句 和 多表关联查询 以及 子查询

    原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指 ...

  9. 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询

    上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...

  10. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

随机推荐

  1. 移动端 h5调试技巧

    一 安卓 一 chrome 1.安卓手机安装chrome浏览器,手机打开开发者模式,用usb线链接电脑,并且允许调试. 2.电脑chrome地址栏输入 chrome://inspect 进入后点击 i ...

  2. java读写file

    private static String encoding = "utf-8"; public static void readTxt(String filePath) thro ...

  3. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  4. Nancy之Pipelines三兄弟(Before After OnError)

    一.简单描述 Before:如果返回null,拦截器将主动权转给路由:如果返回Response对象,则路由不起作用. After : 没有返回值,可以在这里修改或替换当前的Response. OnEr ...

  5. ASP.NET Core开发-如何配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...

  6. 【配置属性】—Entity Framework 对应表字段的类型的设定配置方法

    摘自:http://www.cnblogs.com/nianming/archive/2012/11/07/2757997.html Entity Framework Code First的默认行为是 ...

  7. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

  8. iPhone开发与cocos2d 经验谈

    转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...

  9. nginx concat模块配置 页面返回400 bad request

    在1.4.x版本的nginx没有发现这个问题,但是在1.5.x版本就遇到了这个问题 由于Nginx在新版本中,使用了标准的 MIME-Type:application/javascript.而在ngi ...

  10. git的使用以及github

    现在公司使用的是svn,然而,技多不压身,现在学习一下github http://blog.csdn.net/llf369477769/article/details/51917557这篇博客总结的很 ...