SQL中的left outer join,inner join,right outer join用法 (左右内连接)

SQL语句中的left outer join,inner join,right outer join用法

left outer join=left join ,   right outer join=right join,     inner join=join.
使用关系代数合并数据
1 关系代数
合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。
在关系代数的形式化语言中:
           用表、或者数据集合表示关系或者实体。
           用行表示元组。
           用列表示属性。
关系代数包含以下8个关系运算符
           选取――返回满足指定条件的行。

           投影――从数据集合中返回指定的列。
          笛卡尔积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。
           并――关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。

           交――返回两个数据集合所共有的行。
          差――返回只属于一个数据集合的行。
          连接――在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。
          除――返回两个数据集之间的精确匹配。
此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
          子查询――类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。
本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。
2 使用连接
2.1 连接类型
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
连接类型           定义
内连接           只连接匹配的行
左外连接           包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接           包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接           包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
(H)(theta)连接           使用等值以外的条件来匹配左、右两个表中的行
交叉连接           生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
在INFORMIX中连接表的查询
如果FROM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。
SELECT语句的FROM子句可以指定以下几种类型的连接
FROM子句关键字           相应的结果集
CROSS JOIN           笛卡尔乘积(所有可能的行对)
INNER JOIN           仅对满足连接条件的CROSS中的列
LEFT OUTER JOIN           一个表满足条件的行,和另一个表的所有行
RIGHT OUTER JOIN           与LEFT相同,但两个表的角色互换
FULL OUTER JOIN         LEFT OUTER 和 RIGHT OUTER中所有行的超集

2.2 内连接(Inner Join)
内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
下面是ANSI SQL-92标准
select *
from     t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等价于早期的连接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外连接
2.3.1           左外连接(Left Outer Jion)
select *
from     t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略。
2.3.2           右外连接(Rigt Outer Jion)
select *
from     t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3           全外连接(Full Outer)
全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。
select *
from     t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4           外连接与条件配合使用
当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:
条件在join子句
select *
from     t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
结果是:
inst_no       inst_name               inst_no       teller_no     teller_name
5801         天河区                 5801         0001         tom
5801         天河区                 5801         0002         david
5802         越秀区
5803         白云区
条件在where子句
select *
from     t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
结果是:
inst_no       inst_name               inst_no       teller_no     teller_name
5801         天河区                 5801         0001         tom
5801         天河区                 5801         0002         david

2.4 自身连接
自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。
下面例子是在机构表中查找本机构和上级机构的信息。
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

结果是:
superior_inst sup_inst_name           inst_no       inst_name
800             广州市                 5801         天河区
800             广州市                 5802         越秀区
800             广州市                 5803         白云区

2.5 交叉(无限制) 连接
交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
select *
from     t_institution i
cross join t_teller t
在交叉连接中没有on条件子句


Inner Join
Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法
Select <要选择的字段> From <主要资料表>
<Join 方式> <次要资料表> [On <Join 规则>]
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers
Products.Suppliers = Suppliers.SupplierId
Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉,
譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉
Outer Join
这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的SQL语句和语法
Select <要查询的字段> From <Left 资料表>
<Left | Right> [Outer] Join <Right 资料表> On <Join 规则>
语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料
总结:inner join是内部连接,outer join是外部接。inner求出的是交集,outer表示某个表的所有行,不管另一个表有没有这一行
INNER Join code as the following:
Select * from A a, B b where a.categoryID = b.categoryID;
equals:
Select * from A a inner join B b on a.categoryID = b.categoryID;
OUTER Join code as the following
select * from A a full(left/right) outer   join B b   on a on a.categoryID = b.categoryID;
left/right outer join claus specific   for MSSQL:
Select * from A a, B b where a.categoryID   *=     bcategoryID;
elect * from A a, B b where a.categoryID       =*   b.categoryID;
left/right outer join claus specific for Oracle:
Select * from A a, B b where a.categoryID       =   b.categoryID(+);
Select * from A a, B b where a.categoryID (+) =   b.categoryID;

 

A final thing worth discussing here is the use of aliases. Aliases aren’t necessarily related to table joins, but they become especially useful (and sometimes necessary) when joining tables, and they assign different (and usually shorter) names for the tables involved. Aliases are necessary when joining a table with itself, in which case you need to assign different aliases for its different instances to differentiate them. The following query returns the same products as the query before, but it uses aliases:


SELECT p.ProductID, p.Name
FROM ProductCategory pc INNER JOIN Product p
ON p.ProductID = pc.ProductID
WHERE pc.CategoryID = 5

转载于:https://www.cnblogs.com/elock/archive/2009/12/05/1617706.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利旧IBM X3650m2 安装esxi5.1提供云桌面(备忘)

上面左边是我的个人微信&#xff0c;如需进一步沟通&#xff0c;请加微信。 右边是我的公众号“Openstack私有云”&#xff0c;如有兴趣&#xff0c;请关注。公司有一台旧服务器&#xff0c;原来的IBM X3650m2 服务器&#xff0c;2物理CPU&#xff0c;24G内存&#xff0c;8块3…

asp登录页面跳转到注册页面_Java 添加页面跳转按钮到PDF文档

概述当我们在查阅含有大量页面的PDF时&#xff0c;可通过在页面上添加跳转按钮来实现页面转换&#xff0c;以达到节约时间&#xff0c;提高效率的目的。本文将通过Java程序来演示如何给PDF文档添加页面跳转按钮。通常来说跳转可分为两种情况&#xff1a;一是跳转至特殊页面(首页…

和我一起学WCF(6):宿主(Hosting)

WCF所支持的宿主服务: 1.Self-hosting:控制台应用程序,Windows应用程序,Windows服务,HTTP,TCP,named pipes,MSMQ 2.IIS/ASP.NET 3.Windows Activation Service ServiceHost实例必须进行初始化为服务暴露出端点(endpoint) 每个ServiceHost与指定的服务类型相关联 核心方法: Open…

.Net FrameWork

.NET Micro Framework白皮书http://download.microsoft.com/download/3/1/9/319f7469-70bd-4e7c-a6cc-e5ad96939af4/net_micro_framework_whitepaper_v_1.0.docWhat is "Type" in managed heap?http://www.cnblogs.com/artech/archive/2007/06/04/769805.html转载于…

Retrofit+RxJava联网工具类

在python 进程、线程 (一)中简单的说过&#xff0c;CPython中的GIL使得同一时刻只能有一个线程运行&#xff0c;即并发执行。并且即使是多核CPU&#xff0c;GIL使得同一个进程中的多个线程也无法映射到多个CPU上运行&#xff0c;这么做最初是为了安全着想&#xff0c;慢慢的也成…

确定最佳聚类数matlab代码_详解DBSCAN聚类

使用DBSCAN标识为员工分组照片由Ishan seefromthesky 在 Unsplash拍摄基于密度的噪声应用空间聚类(DBSCAN)是一种无监督的ML聚类算法。无监督的意思是它不使用预先标记的目标来聚类数据点。聚类是指试图将相似的数据点分组到人工确定的组或簇中。它可以替代KMeans和层次聚类等流…

Arrays.asList 使用细节

通常初始化后使用如下&#xff0c;但是报错 UnsupportOperationException.... 根据提示信息&#xff0c;就是调用add()方法时抛出了异常。顺着堆栈信息往上找&#xff0c;提示的是AbstractList类的108行出了异常&#xff0c;这一行所在方法的具体实现如下&#xff1a; //108行 …

[分享] 精神崩溃的老鼠

李国栋床上堆着书&#xff0c;每天晚上睡在榻榻米上&#xff0c;读书读到凌晨一两点&#xff0c;读到两眼充血&#xff0c;像针扎一样痛苦&#xff0c;才把书放开。蜷缩到榻榻米上&#xff0c;用绳子把左腿跟一只桌脚绑在一起&#xff0c;熄了灯睡觉。 “这样一来&#xff0…

(七)整合spring cloud云服务架构 - common-service 项目构建过程

我们将对common-service整个项目进行剖析&#xff0c;将整个构建的流程给记录下来&#xff0c;让更多的关注者来参考学习。首先在构建spring cloud的common-service之前&#xff0c;我们需要准备的技术&#xff1a;Maven&#xff08;项目构建&#xff09;、Spring Boot、Spring…

python list元素合并_python list 合并连接字符串的方法

python list 合并连接字符串的方法 更新时间&#xff1a;2013年03月09日 22:02:18 作者&#xff1a; python 列表合并字符串&#xff0c;我们一般会用到字符串的join方法来操作。下面通过代码的形式&#xff0c;详细的说下list怎么拼成字符串&#xff1f; 相关文章这篇文章主要…

修改citrix 默认侦听端口的命令和XML Service端口

修改citrix 默认侦听端口的命令&#xff1a; 在命令行下输入icaport /port&#xff1a;2494&#xff0c;或你所想改成的端口 如果输入 icaport /reset 恢复默认侦听端口 ctxxmlss /r8080 在citrix的外部客户端通过web方式登陆时&#xff0c;提示“the alternate address cannot…

spfa算法

1 转载于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法&#xff08;ensemble method&#xff09;又叫元算法&#xff08;meta-algorithm&#xff09;&#xff1a;将不同的分类器组合起来。 通俗的说&#xff1a;就是三个臭皮匠赛过诸葛亮。做决定时&#xff0c;考虑多个人的意见&#xff0c;不是一个人的意见 集成方法&…

单片机按键防抖程序_这些单片机按键设计方案,请拿好,不谢!

在单片机系统里&#xff0c;按键是常见的输入设备&#xff0c;在本文中介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上&#xff0c;一般有四种方案&#xff0c;创客学院带你零基础学习电子产品设计。一是GPIO口直接检测单个按键&#xff0c;如图1.1所示;二是按键…

Oracle 11G 安装详解

oracle官网下载地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官网下载需要注册orcale账号&#xff0c;比较繁琐&#xff0c;这里直接放已经下载好的安装包链接 Oracle11G下载链接: https://pan.baidu.com/s/1v6oD4jAt…

程序员何苦为难程序员?

有时候想想程序员为何为难程序员呢&#xff1f; 扳扳手指走上码农这个行业也有几年了&#xff0c;但是越来越觉得这个行业很累&#xff0c;有人说程序员就是二代农民工&#xff0c;我个人还是比较赞同的&#xff0c;对于刚入道的同仁们来说确实就是个体力(脑力&#xff0c;眼力…

kubeadm部署k8s_用 kubeadm 部署生产级 k8s 集群

概述kubeadm 已⽀持集群部署&#xff0c;且在1.13 版本中 GA&#xff0c;⽀持多 master&#xff0c;多 etcd 集群化部署&#xff0c;它也是官⽅最为推荐的部署⽅式&#xff0c;⼀来是由它的 sig 组来推进的&#xff0c;⼆来 kubeadm 在很多⽅⾯确实很好的利⽤了 kubernetes 的许…

poj 题目分类

1000 AB Problem 送分题 1001 Exponentiation 高精度 1003 Hangover 送分题 1004 Financial Management 送分题 1005 I Think I Need a Houseboat 几何 1006 Biorhythms 送分题 1007 …

模板的语法

我已经碰到过好几次这种错误了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…