精华内容
下载资源
问答
  • 数据库的外联和内联知识 Inner Join 数据库的外联和内联知识 Inner Join
  • 数据库外联和内联

    2011-06-17 11:35:00
    下面是inner join(内联和外联的区别: 举个例子:     假设a表b表的数据是这样的。    a b   id name   id stock       1     a  1 15   2  b  2 50   3  c    ...

    left join== left outer join 

    inner join==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       --


    下面是inner join(内联)和外联的区别:

    举个例子:  
      
    假设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   joinleft   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.Codd1970年提出的。
    在关系代数的形式化语言中:
            
    用表、或者数据集合表示关系或者实体。r
            
    用行表示元组。r
            
    用列表示属性。r
    关系代数包含以下8个关系运算符
            
    选取――返回满足指定条件的行。r
            
    投影――从数据集合中返回指定的列。r
            
    笛卡尔积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。r
            
    ――关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。r
            
    ――返回两个数据集合所共有的行。r
            
    ――返回只属于一个数据集合的行。r
            
    连接――在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。r
            
    ――返回两个数据集之间的精确匹配。r
    此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
            
    子查询――类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。r
    本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。
    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 SQL92标准
    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 ServerInformix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到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 r2000 BilePaul Nielsen
            Paul Nielsen
    Web站点r
    [url]www.isnotnull.com[/url]
    3.2 
    注文章所有SQLIBM 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 数据类型数据的字段,将会发生错误。

     

    展开全文
  •  并――关系的加法减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。  交――返回两个数据集合所共有的行。  差――返回只属于一个数据集合的行。  连接――在水平方向上...

     

    使用关系代数合并数据 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条件子句

    转载于:https://www.cnblogs.com/servant/archive/2012/05/23/2515293.html

    展开全文
  •  并――关系的加法减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。  交――返回两个数据集合所共有的行。  差――返回只属于一个数据集合的行。  连接――在水平...
    使用关系代数合并数据
    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测试通过
    展开全文
  • 在功能上,它等价于对这两个数据集合分别进行左外连接右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。 在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外...

    使用关系代数合并数据
    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测试通过


    展开全文
  • 块元素(block element)一般是其他元素的容器元素块元素一般都从新行开始,它可以容纳内联元素其他块元素,常见块元素是段落标签‘P"。“form"这个块元素比较特殊,它只能用来容纳其他块元素。如果没有css的作用,块...
  • FROM子句关键字 相应的结果集 ...LEFT OUTER JOIN 一个表满足条件的行,另一个表的所有行 RIGHT OUTER JOIN 与LEFT相同,但两个表的角色互换 FULL OUTER JOIN LEFT OUTER RIGHT OUTER中所有行的超集
  • HTML外联样式和内联样式的优先

    千次阅读 2018-04-05 19:06:28
    最近在W3C上面学习Web,发现一个小错误,现在已经提交纠错如下外联样式表:链接:内联样式表:W3C上面是这样的:而实际上:颜色字体的尺寸是由外联样式表决定的而内联样式表决定的是他的文字对齐方式~~~...
  • 1,内联式css样式就是把css代码直接写在现有的HTML标签中,如下面代码:这里文字是红色。css样式代码要写在style=""双引号中,如果有多条css样式代码设置可以写在一起,中间用分号隔开。如下代码:这里文字是红色。2,...
  • Oracle内联和外联查询

    2019-10-23 16:51:12
    Oracle内联和外联查询 文章目录Oracle内联和外联查询案例1. 查询员工001及其所属部门名称(内联查询)2. 查询所有部门及其下员工信息(左、右外联查询)3. 查询所有部门及所有员工信息(全外联查询)案例分析总结 ...
  • 内联外联CSSJS

    千次阅读 2018-03-13 15:19:35
    内联CSS 代码示例: &lt;p style="color:red;font-size:18px"&...内联CSS也可称为行内CSS或者行级CSS,它直接在标签内部引入,显著的优点是十分的便捷、高效;...外联CSS 外部式...
  • 下面小编就为大家带来一篇浅谈jscss内联外联注意事项。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 数据库内联外联

    2017-07-21 11:34:38
    很多东西在学校只是接触过就忘了,在昨天做项目的时候接触到SQL语句得自己写的情况,然后小了解了一下内联和外联,根据自己在网上找到的资料小总结一下。 说说内联和外联的区别 外联 select ...
  • sql中内联和外联区别

    2009-02-24 20:55:48
    简单介绍sql中内联和外联区别(用实例说明问题,简单明了)
  • sql 内联和外联

    2013-12-15 10:18:38
    (1)完整外部联接返回左表右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 (2)sql语句: select * from table1 ...
  • MySQL内联和外联查询

    2019-07-19 10:05:00
    内连: 内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。...如果没有任何条件,INNER JOIN CROSS JOIN 在语法上是等同的,两者可以互换。语法格式如下: SELECT <...
  • 内联和外联的区别

    千次阅读 2011-01-13 13:23:16
    1.内联 a inner join b on a.id=b.id 查两张表都有的id记录。 2.左外联 a left join b on a.id=b.id 只要a表有,而b可没有对应的记录。...3.右外联 ...外联相反,只要b表有,...
  • -- 导入外部样式 --> <link rel="stylesheet" href="./test.css"> <title>css内联外联和外部样式研究</title> <style> .blue{ color: blue !important; } </style> </head> <body> <!-- 比较外联与外部 全部显示 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 719
精华内容 287
关键字:

外联和内联