`

数据库中涉及到的几种连接方式

阅读更多
通俗的讲: 
  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站点
www.isnotnull.com
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
分享到:
评论

相关推荐

    连接数据库的几种方法

    根据提供的文件信息,本文将详细探讨连接数据库的几种方法,并结合具体的代码实例进行解析。主要涉及的方法包括:通过 JDBC 直接连接、使用数据源(DataSource)的方式以及配置文件加载方式来连接数据库。 ### 一、...

    java连接数据库的几种方式

    ### Java连接数据库的几种方式 在Java开发过程中,经常需要与数据库进行交互,这就涉及到如何用Java语言连接各种类型的数据库。本文将详细介绍八种常见的Java连接数据库的方式,并给出具体的示例代码。 #### 1. ...

    如何连接SQL数据库

    SQL数据库连接涉及几个关键要素:数据库服务器、数据库名、用户名、密码以及连接驱动。以下是一般的连接步骤: 1. **选择驱动**: SQL数据库支持多种驱动,如JDBC(Java Database Connectivity)用于Java程序,ODBC...

    【最新精选】博优软件数据库连接失败几种原因及解决方式.doc

    博优软件在运行过程中,如果出现数据库连接失败的情况,可能涉及以下几个方面的问题及其相应的解决方法: 1. **检查网络连接**: 当客户端登录时提示数据库连接失败,首先应确认服务器是否正常运行。通过执行...

    几种数据库连接

    在实际开发中,连接数据库通常涉及以下步骤: 1. 创建数据库连接:使用适当的连接类(如SqlConnection或OleDbConnection)并提供正确的连接字符串。 2. 打开连接:调用`Open()`方法建立到数据库的实际连接。 3. ...

    连接四种数据库之经典篇

    根据给定的文件信息,本文将详细介绍如何连接到四种不同的数据库:Oracle、DB2、MySQL以及SQL Server 2000。这些连接方法是通过Java编程语言实现的,并且涉及到了具体的驱动程序加载和数据库连接建立的过程。 ### 1...

    jsp入门实例,连接几种常用数据库

    在压缩包中的"jspExcises"文件,很可能是包含了一系列的示例项目,涵盖了不同的数据库连接方式和操作,例如: 1. 基本的JDBC连接示例,展示了如何打开和关闭数据库连接。 2. 使用PreparedStatement的示例,演示如何...

    c#几种常用数据库封装

    本文将深入探讨C#中几种常用的数据库封装技术,包括SQLite和BerkeleyDB,以及与数据库交互时涉及的序列化和通信机制。同时,我们将重点关注如何利用数据库连接池来优化性能。 首先,C#中的SQLite是一种轻量级、开源...

    常用的连接数据库的几种方法

    深入探讨连接数据库的几种常见方法,包括ODBC、JDBC驱动、以及针对特定数据库(如DB2、MySQL、Oracle、SQL Server、Sybase、Informix、PostgreSQL和Access)的连接方式。 ### 一、ODBC(Open Database Connectivity...

    JDBC连接Access数据库的几种方式

    总结,JDBC连接Access数据库主要涉及JDBC-ODBC桥接和使用第三方驱动如UCanAccess两种方式。每种方式都有其适用场景,开发者需要根据项目需求和环境选择合适的方法。理解这些基础知识对于进行Java数据库编程至关重要...

    数据库连接池代码

    Oracle数据库在JDBC中的使用则涉及到Oracle JDBC驱动,如ojdbc.jar。Oracle提供了两种类型的驱动: Thin驱动和 Thick驱动。Thin驱动是纯Java实现,轻量级且跨平台;Thick驱动包含Oracle客户端库,性能可能更好,但...

    ORACLE 数据库如何连接,连接方式

    首先,Oracle数据库连接主要通过以下几种方式实现: 1. **SQL*Plus**:这是Oracle提供的一种命令行工具,可以直接在命令行界面输入SQL语句与数据库交互。要连接,你需要提供服务器的主机名(IP地址)、服务名(SID...

    连接各种数据库方式文件

    首先,我们来了解一下几种主流的数据库系统,包括关系型数据库(如MySQL、PostgreSQL、Oracle)和非关系型数据库(如MongoDB、Cassandra)。对于关系型数据库,通常使用SQL(结构化查询语言)进行操作,而非关系型...

    数据库连接通用模块数据库连接通用模块

    数据库连接通用模块是软件开发中的一个重要组成部分,它允许应用程序与各种数据库进行交互,实现数据的存取、查询、更新和管理。在不同的编程语言中,如Java、Python、C#等,都有相应的数据库连接库或模块来实现这一...

    oracle连接java的几种方法

    本篇文章将详细介绍在Java中连接Oracle数据库的几种常见方法,以及相关的源码示例。 1. JDBC-ODBC桥连接: JDBC-ODBC桥是Java早期连接数据库的一种方式,它依赖于操作系统上的ODBC数据源。首先,你需要在系统中...

    delphi数据库连接池

    总之,Delphi数据库连接池是提高数据库应用性能和效率的重要手段,其设计和实现涉及到数据库访问技术、资源管理策略等多个方面,是Delphi开发中的高级话题。通过理解和掌握这一技术,开发者能够更好地构建高性能、高...

    数据库连接池 jar包

    在实际应用中,配置数据库连接池通常涉及以下几个步骤: 1. 引入依赖:将上述jar包添加到项目构建工具(如Maven或Gradle)的依赖管理中,或者直接将jar包复制到项目的lib目录。 2. 初始化配置:创建一个配置文件...

Global site tag (gtag.js) - Google Analytics