SQL 表连接通俗的讲:  
SQL 表连接  A   
left   join   B   的连接的记录数与A表的记录数同  
SQL 表连接  A   
right   join   B   的连接的记录数与B表的记录数同    
SQL 表连接  A   
left   join   B   等价B   right   join   A  
SQL 表连接   
SQL 表连接   
SQL 表连接  
table   A:  
Field_K,   Field_A  
SQL 表连接  1                       a  
SQL 表连接  
3                       b  
SQL 表连接  
4                       c  
SQL 表连接   
SQL 表连接  
table   B:  
SQL 表连接  Field_K,   Field_B  
SQL 表连接  
1                       x  
SQL 表连接  
2                       y  
SQL 表连接  
4                       z  
SQL 表连接   
SQL 表连接  
select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
SQL 表连接  
from   a   left   join   b   on   a.Field_K=b.Field_K  
SQL 表连接   
SQL 表连接  Field_K         Field_A         Field_K         Field_B          
SQL 表连接  
----------   ----------   ----------   ----------    
SQL 表连接
  1                     a                     1                     x                    
SQL 表连接  
3                     b                     NULL               NULL  
SQL 表连接  
4                     c                     4                     z                    
SQL 表连接   
SQL 表连接  
select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
SQL 表连接  
from   a   right   join   b   on   a.Field_K=b.Field_K  
SQL 表连接   
SQL 表连接  Field_K         Field_A         Field_K         Field_B          
SQL 表连接  
----------   ----------   ----------   ----------    
SQL 表连接
  1                     a                     1                     x                    
SQL 表连接  
NULL               NULL               2                     y                    
SQL 表连接  
4                     c                     4                     z       --

SQL 表连接举个例子:  
SQL 表连接  假设a表和b表的数据是这样的。  
SQL 表连接  a                         b    
SQL 表连接  id     name  id     stock   
SQL 表连接  
1  a             1         15  
SQL 表连接  
2         b             2         50  
SQL 表连接  
3         c                  
SQL 表连接   
SQL 表连接  
select   *   from   a   inner   join   b   on   a.id=b.id  
SQL 表连接  这个语法是连接查询中的内连接,它产生的结果是  
SQL 表连接  两个表相匹配的记录出现在结果列表中。  
SQL 表连接  根据上面的表,出现的结果是这样的  
SQL 表连接  a.id     name     b.id     stock  
SQL 表连接  
1       a             1         15  
SQL 表连接  
2             b             2         50  
SQL 表连接  
----------------------------  
SQL 表连接
  select   *   from   a,b   where   a.id=b.id  
SQL 表连接  这个语法是内连接的另外一种写法,其执行结果与inner   
join   一样  
SQL 表连接   
SQL 表连接  
--------------------------------    
SQL 表连接
   
SQL 表连接  
select   *   from   a   left/right   join   b   on   a.id=b.id  
SQL 表连接  这个是外连接语法中的左外连接或右外连接  
SQL 表连接  如果是左外连接的话,它将显示a表的所有记录,  
SQL 表连接  
select   a.*,b.*   from   a   left   join   b   on   a.id=b.id  
SQL 表连接  查询的结果是这样的:  
SQL 表连接  a.id     name     b.id     stock  
SQL 表连接  
1         a         1             15  
SQL 表连接  
2               b         2             50  
SQL 表连接  
3               c       null         null   
SQL 表连接  
--------------------------------------------  
SQL 表连接
  如果是右外连接的话,它将显示b表的所有记录,  
SQL 表连接  
select   a.*,b.*   from   a   right   join   b   on   a.id=b.id  
SQL 表连接  查询的结果是这样的:  
SQL 表连接  a.id     name     b.id     stock  
SQL 表连接  
1         a         1             15  
SQL 表连接  
2               b         2             50   


--

SQL 表连接select   a.*,b.*   from   a   left   join   b   on   a.k   =   b.k    
SQL 表连接  
select   a.*,b.*   from   a   left   outer   join   b   on   a.k   =b.k  
SQL 表连接  
----------上面两种一样left   join是left   outer   join的简写  
SQL 表连接
  select   a.*,b.*   from   a   left   inner   join   b   on   a.k   =   b.k    
SQL 表连接  没有这种写法,错误的语句.


--

SQL 表连接在你要使用多个left   join的时候  
SQL 表连接  比如说10个  
SQL 表连接  我们把10个全都写成left   join的形式  
SQL 表连接  然后再SQL让他自动运行一下,它会把最后一次出现的left   join变成left   
outer   join  
SQL 表连接  所以依此推理,最后一个left   join会以left   
outer   join的形式存在  
SQL 表连接  当然,不管变不变对结果的显示没有任何影响  
SQL 表连接  希望我的实验能对你有所帮助   


--

SQL 表连接使用关系代数合并数据
SQL 表连接
1 关系代数
SQL 表连接合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。
SQL 表连接在关系代数的形式化语言中:
SQL 表连接        用表、或者数据集合表示关系或者实体。
SQL 表连接        用行表示元组。
SQL 表连接        用列表示属性。
SQL 表连接关系代数包含以下8个关系运算符
SQL 表连接        选取――返回满足指定条件的行。
SQL 表连接        投影――从数据集合中返回指定的列。
SQL 表连接        笛卡尔积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。
SQL 表连接        并――关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。
SQL 表连接        交――返回两个数据集合所共有的行。
SQL 表连接        差――返回只属于一个数据集合的行。
SQL 表连接        连接――在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。
SQL 表连接        除――返回两个数据集之间的精确匹配。
SQL 表连接此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
SQL 表连接        子查询――类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。
SQL 表连接本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。
SQL 表连接
2 使用连接
SQL 表连接
2.1 连接类型
SQL 表连接在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。
SQL 表连接SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
SQL 表连接连接类型        定义
SQL 表连接内连接        只连接匹配的行
SQL 表连接左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
SQL 表连接右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
SQL 表连接全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
SQL 表连接(H)(theta)连接        使用等值以外的条件来匹配左、右两个表中的行
SQL 表连接交叉连接        生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
SQL 表连接在INFORMIX中连接表的查询
SQL 表连接如果FROM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。
SQL 表连接SELECT语句的FROM子句可以指定以下几种类型的连接
SQL 表连接FROM子句关键字        相应的结果集
SQL 表连接
CROSS JOIN        笛卡尔乘积(所有可能的行对)
SQL 表连接
INNER JOIN        仅对满足连接条件的CROSS中的列
SQL 表连接
LEFT OUTER JOIN        一个表满足条件的行,和另一个表的所有行
SQL 表连接
RIGHT OUTER JOIN        与LEFT相同,但两个表的角色互换
SQL 表连接
FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集
SQL 表连接
SQL 表连接
2.2 内连接(Inner Join
SQL 表连接内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
SQL 表连接下面是ANSI SQL-92标准
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
inner join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接
where i.inst_no = "5801"
SQL 表连接其中inner可以省略。
SQL 表连接等价于早期的连接语法
SQL 表连接
select *
SQL 表连接
from t_institution i, t_teller t
SQL 表连接
where i.inst_no = t.inst_no
SQL 表连接
and i.inst_no = "5801"
SQL 表连接
SQL 表连接
2.3 外连接
SQL 表连接
2.3.1        左外连接(Left Outer Jion)
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
left outer join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接其中outer可以省略。
SQL 表连接
2.3.2        右外连接(Rigt Outer Jion)
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
right outer join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接
2.3.3        全外连接(Full Outer)
SQL 表连接全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
SQL 表连接在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
full outer join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接
2.3.4        外连接与条件配合使用
SQL 表连接当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:
SQL 表连接条件在join子句
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
left outer join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接
and i.inst_no = “5801
SQL 表连接结果是:
SQL 表连接inst_no    inst_name            inst_no    teller_no  teller_name
SQL 表连接
5801       天河区               5801       0001       tom
SQL 表连接
5801       天河区               5801       0002       david
SQL 表连接
5802       越秀区
SQL 表连接
5803       白云区
SQL 表连接条件在where子句
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
left outer join t_teller t
SQL 表连接
on i.inst_no = t.inst_no
SQL 表连接
where i.inst_no = “5801
SQL 表连接结果是:
SQL 表连接inst_no    inst_name            inst_no    teller_no  teller_name
SQL 表连接
5801       天河区               5801       0001       tom
SQL 表连接
5801       天河区               5801       0002       david
SQL 表连接
SQL 表连接
2.4 自身连接
SQL 表连接自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。
SQL 表连接下面例子是在机构表中查找本机构和上级机构的信息。
SQL 表连接
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
SQL 表连接
from t_institution i
SQL 表连接
join t_institution s
SQL 表连接
on i.superior_inst = s.inst_no
SQL 表连接
SQL 表连接结果是:
SQL 表连接superior_inst sup_inst_name        inst_no    inst_name
SQL 表连接
800           广州市               5801       天河区
SQL 表连接
800           广州市               5802       越秀区
SQL 表连接
800           广州市               5803       白云区
SQL 表连接
SQL 表连接
2.5 交叉(无限制) 连接
SQL 表连接交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
SQL 表连接大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
SQL 表连接
select *
SQL 表连接
from  t_institution i
SQL 表连接
cross join t_teller t
SQL 表连接在交叉连接中没有on条件子句
SQL 表连接
SQL 表连接
3 APPENDIX
SQL 表连接
3.1 A 参考资料与资源
SQL 表连接        《Microsoft SQL Server 
2000 Bile》Paul Nielsen
SQL 表连接        Paul Nielsen的Web站点
SQL 表连接
[url]www.isnotnull.com[/url]
SQL 表连接
3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1测试通过


--

SQL 表连接表A记录如下:
SQL 表连接aID        aNum
SQL 表连接
1           a20050111
SQL 表连接
2           a20050112
SQL 表连接
3           a20050113
SQL 表连接
4           a20050114
SQL 表连接
5           a20050115
SQL 表连接
SQL 表连接表B记录如下:
SQL 表连接bID        bName
SQL 表连接
1            2006032401
SQL 表连接
2           2006032402
SQL 表连接
3           2006032403
SQL 表连接
4           2006032404
SQL 表连接
8           2006032408
SQL 表连接
SQL 表连接
SQL 表连接实验如下:
SQL 表连接
1.left join
SQL 表连接
SQL 表连接sql语句如下:
SQL 表连接
select * from A
SQL 表连接
left join B
SQL 表连接
on A.aID = B.bID
SQL 表连接
SQL 表连接结果如下:
SQL 表连接aID        aNum                   bID           bName
SQL 表连接
1            a20050111         1               2006032401
SQL 表连接
2            a20050112         2              2006032402
SQL 表连接
3            a20050113         3              2006032403
SQL 表连接
4            a20050114         4              2006032404
SQL 表连接
5            a20050115         NULL       NULL
SQL 表连接(所影响的行数为 
5 行)
SQL 表连接
SQL 表连接结果说明:
SQL 表连接        
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
SQL 表连接换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID 
= B.bID).
SQL 表连接B表记录不足的地方均为NULL.
SQL 表连接
SQL 表连接
2.right join
SQL 表连接
SQL 表连接sql语句如下:
SQL 表连接
select * from A
SQL 表连接
right join B
SQL 表连接
on A.aID = B.bID
SQL 表连接
SQL 表连接结果如下:
SQL 表连接aID        aNum                   bID           bName
SQL 表连接
1            a20050111         1               2006032401
SQL 表连接
2            a20050112         2              2006032402
SQL 表连接
3            a20050113         3              2006032403
SQL 表连接
4            a20050114         4              2006032404
SQL 表连接
NULL    NULL                   8              2006032408
SQL 表连接(所影响的行数为 
5 行)
SQL 表连接
SQL 表连接结果说明:
SQL 表连接        仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
SQL 表连接
SQL 表连接
3.inner join
SQL 表连接
SQL 表连接sql语句如下:
SQL 表连接
select * from A
SQL 表连接innerjoin B
SQL 表连接
on A.aID = B.bID
SQL 表连接
SQL 表连接结果如下:
SQL 表连接aID        aNum                   bID           bName
SQL 表连接
1            a20050111         1               2006032401
SQL 表连接
2            a20050112         2              2006032402
SQL 表连接
3            a20050113         3              2006032403
SQL 表连接
4            a20050114         4              2006032404
SQL 表连接
SQL 表连接结果说明:
SQL 表连接        很明显,这里只显示出了 A.aID 
= B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
SQL 表连接
SQL 表连接
SQL 表连接-----------------[以下为网上的一点资料]------------------
SQL 表连接
SQL 表连接
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
SQL 表连接
SQL 表连接语法:
FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
SQL 表连接
SQL 表连接说明:table1, table2参数用于指定要将记录组合的表的名称。
SQL 表连接field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
SQL 表连接compopr参数指定关系比较运算符:"
=", "<", ">", "<=", ">=" 或 "<>"。
SQL 表连接如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。

 

本文来自 http://www.cnblogs.com/cy163/archive/2008/10/16/1312920.html

 

其他资料:Wiki:http://en.wikipedia.org/wiki/Join_(SQL)

相关文章:

  • 2022-02-07
  • 2022-03-03
  • 2022-01-22
  • 2022-01-12
  • 2021-12-23
  • 2021-10-15
  • 2021-07-07
猜你喜欢
  • 2021-07-13
  • 2021-08-12
  • 2021-07-20
  • 2022-03-01
相关资源
相似解决方案