left join 和 left outer join 的区别的总结

个人通俗的讲:

  A   left   join   B   的连接的记录数与A表的记录数同

  A   right   join   B   的连接的记录数与B表的记录数同

  A   left   join   B   等价B   right   join   A

  table   A:

Field_K,   Field_A

  1                       a

  3                       b

  4                       c

  table   B:

  Field_K,   Field_B

  1                       x

  2                       y

  4                       z

  select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B

  from   a   left   join   b   on   a.Field_K=b.Field_K

  Field_K         Field_A         Field_K         Field_B

  ----------   ----------   ----------   ----------

  1                     a                     1                     x

  3                     b                     NULL               NULL

  4                     c                     4                     z

  select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B

  from   a   right   join   b   on   a.Field_K=b.Field_K

  Field_K         Field_A         Field_K         Field_B

  ----------   ----------   ----------   ----------

  1                     a                     1                     x

  NULL               NULL               2                     y

  4                     c                     4                     z      
--

举个例子:

  假设a表和b表的数据是这样的。

  a                         b

  id     name  id     stock 

  1  a             1         15

  2         b             2         50

  3         c                

  select   *   from   a   inner   join   b   on   a.id=b.id

  这个语法是连接查询中的内连接,它产生的结果是

  两个表相匹配的记录出现在结果列表中。

  根据上面的表,出现的结果是这样的

  a.id     name     b.id     stock

  1       a             1         15

  2             b             2         50

  ----------------------------

  select   *   from   a,b   where   a.id=b.id

  这个语法是内连接的另外一种写法,其执行结果与inner   join   一样

  --------------------------------

  select   *   from   a   left/right   join   b   on   a.id=b.id

  这个是外连接语法中的左外连接或右外连接

  如果是左外连接的话,它将显示a表的所有记录,

  select   a.*,b.*   from   a   left   join   b   on   a.id=b.id

  查询的结果是这样的:

  a.id     name     b.id     stock

  1         a         1             15

  2               b         2             50

  3               c       null         null 

  --------------------------------------------

  如果是右外连接的话,它将显示b表的所有记录,

  select   a.*,b.*   from   a   right   join   b   on   a.id=b.id

  查询的结果是这样的:

  a.id     name     b.id     stock

  1         a         1             15

  2               b         2             50

--

select   a.*,b.*   from   a   left   join   b   on   a.k   =   b.k

  select   a.*,b.*   from   a   left   outer   join   b   on   a.k   =b.k

  ----------上面两种一样left   join是left   outer   join的简写

  select   a.*,b.*   from   a   left   inner   join   b   on   a.k   =   b.k

  没有这种写法,错误的语句.

--

在你要使用多个left   join的时候

  比如说10个

  我们把10个全都写成left   join的形式

  然后再SQL让他自动运行一下,它会把最后一次出现的left   join变成left   outer   join

  所以依此推理,最后一个left   join会以left   outer   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条件子句

3 APPENDIX

3.1 A 参考资料与资源

        《Microsoft SQL Server 2000 Bile》Paul Nielsen

        Paul Nielsen的Web站点

[url]www.isnotnull.com[/url]

3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1测试通过

--

表A记录如下:

aID        aNum

1           a20050111

2           a20050112

3           a20050113

4           a20050114

5           a20050115

表B记录如下:

bID        bName

1            2006032401

2           2006032402

3           2006032403

4           2006032404

8           2006032408

实验如下:

1.left join

sql语句如下:

select * from A

left join B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

5            a20050115         NULL       NULL

(所影响的行数为 5 行)

结果说明:

        left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).

B表记录不足的地方均为NULL.

2.right join

sql语句如下:

select * from A

right join B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

NULL    NULL                   8              2006032408

(所影响的行数为 5 行)

结果说明:

        仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join

sql语句如下:

select * from A

innerjoin B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

结果说明:

        很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

-----------------[以下为网上的一点资料]------------------

LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

说明:table1, table2参数用于指定要将记录组合的表的名称。

field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。

compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。

如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。

时间: 2024-10-02 08:34:07

left join 和 left outer join 的区别的总结的相关文章

Linq表连接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)

转载http://www.cnblogs.com/shenqiboy/p/3260105.html 我们知道在SQL中一共有五种JOIN操作:INNER JOIN.LEFT OUTER JOIN.RIGHT OUTER JOIN.FULL OUTER JOIN.CROSS JOIN        内连接.Sql: SELECT [t0].[GroupName], [t1].[UserName] FROM [Group] AS [t0] INNER JOIN [User] AS [t1] ON (

关于sql server中的 jion,inner join, left join ,left outer join, right join,right outer join 的几点使用心得

平时我们做关联,一般都是2~3张表,不太关注这样繁杂的写法,那今天咱们就看看这些写法吧 对将要说的这三种,先说一下要介绍的要点:on后面的条件可以放几个?什么时候结合着where条件一起使用? 大家可以先看看这个帖子,帖子的名字是:sqlserver left join的on中如何添加多个查询条件?? 链接:http://bbs.csdn.net/topics/270023422 开始咱们的介绍吧 首先对于join 分三块: 1.  join .join inner (内联) 我们平时的写法是:

图解SQL的inner join、left join、right join、full outer join、union、union all的区别

转自:http://blog.csdn.net/jz20110918/article/details/41806611 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同 A表 id name 1 Pirate 2 Monkey 3 Ninja 4 Spaghetti B表 id name 1 Rutabaga 2 Pirate 3 Darth Vade 4 Ninja 1.INNER

INNER JOIN, LEFT JOIN, RIGHT JOIN和FULL OUTER JOIN的区别

不用长篇大论,看四张图就OK了. 阴影部分表示返回的结果集. INNER JOIN LEFT JOIN RIGHT JOIN FULL OUTER JOIN 图片足以说明一切..

Hive中join, outer join, semi join区别

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 最常用的就是多表关联查询,主要讲解下join.outer join和semi join的具体使用. join是最简单的关联操作,两边关联只取交集. outer join分为left outer join.right outer join和full outer join. left outer join是以左表驱动,右表不存在的

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

原文链接:http://www.powerxing.com/sql-join/ 总的来说,四种JOIN的使用/区别可以描述为: left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行. right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配 full outer join 全连接,返回左右表中的所有记录 在表中存在至少一个匹配时,inner join 返回行. 关键字inner可省略. 具体可以看sta

关于SqlServer的内连接,外链接以及left join,right join之间的一些问题与区别。

就我个人理解通俗点来说内连接和外连接区别: 内连接 inner join或者 join (被默认为内连接) : 内连接的原理是:先进行语句判断和运行得出结果,然后在将结果连接起来,一般是横着连接. 外连接是 outer join或者left outer join 或者left join同样适用于right 外连接的原理是:先进行全连,然后在进行语句判断和运行得出结果. 以下内容发自 2017年5月25日0点05分  转载于http://www.jb51.net/article/39432.htm

SQL:OUTER JOIN使用方法具体解释

SQL--JOIN使用方法 外联接. 外联接能够是左向外联接.右向外联接或完整外部联接. 在 FROM 子句中指定外联接时,能够由下列几组keyword中的一组指定: LEFT JOIN 或 LEFT OUTER JOIN. 左向外联接的结果集包含 LEFT OUTER 子句中指定的匹配条件的行和左表的全部行. RIGHT JOIN 或 RIGHT OUTER JOIN. 右向外联接是左向外联接的反向联接.将返回匹配条件的行和右表的全部行. FULL JOIN 或 FULL OUTER JOIN

外连接OUTER JOIN

外连接OUTER JOIN 1   LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id\G; 现在我们发现一共得到了23条记录,我们来看一下第23条记录,我们发现他的