`

数据库表连接方式分析及常见用法

 
阅读更多

 27人阅读 评论(0) 收藏 举报

原文地址:http://database.ctocio.com.cn/197/9015697_2.shtml

 

数据库表连接方式分析及常见用法

  表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据。连接是通过SQL语句中FROM从句的多个表名,以及WHERE从句里定义的表之间的连接条件来实现的。

  一个SQL语句的关联表超过两个,那么连接的顺序如何呢?ORACLE首先连接其中的两个表,产生一个结果集;然后将产生的结果集与下一个表再进行关联;继续这个过程,直到所有的表都连接完成;最后产生所需的数据,,本文将主要从以下几个典型的例子来分析Oracle表的几种不同连接方式:

  1. 相等连接

  通过两个表具有相同意义的列,可以建立相等连接条件。

  只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。

  例 查询员工信息以及对应的员工所在的部门信息;

 

      SELECT * FROM EMP,DEPT;

  SELECT * FROM EMP,DEPT

  WHERE EMP.DEPTNO = DEPT.DEPTNO;

  REM 显示员工信息以及对应的员工的部门名称。

 

  2. 外连接

  对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。除了显示匹配相等连接条件的信息之外,还显示无法匹配相等连接条件的某个表的信息。

  外连接采用(+)来识别。

  A) 左条件(+) = 右条件;

  代表除了显示匹配相等连接条件的信息之外,还显示右条件所在的表中无法匹配相等连接条件的信息。

  此时也称为"右外连接".另一种表示方法是:

  SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 连接条件

  B) 左条件 = 右条件(+);

  代表除了显示匹配相等连接条件的信息之外,还显示左条件所在的表中无法匹配相等连接条件的信息。

  此时也称为"左外连接".

  SELECT ... FROM 表1 LEFT OUTER JOIN 表2 ON 连接条件

  例 显示员工信息以及所对应的部门信息

  --无法显示没有部门的员工信息

  --无法显示没有员工的部门信息

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

  --直接做相等连接:

  SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

  REM 显示员工信息以及所对应的部门信息,显示没有员工的部门信息

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;

  SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

  REM 显示员工信息以及所对应的部门信息,显示没有部门的员工信息

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);

  SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

3. 不等连接

  两个表中的相关的两列进行不等连接,比较符号一般为>,<,...,BETWEEN.. AND..

  REM SALGRADE

  --DESC SALGRADE;

  --SELECT * FROM SALGRADE;

  REM 显示员工的编号,姓名,工资,以及工资所对应的级别。

  SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP

  WHERE EMP.SAL BETWEEN LOSAL AND HISAL;

  REM 显示雇员的编号,姓名,工资,工资级别,所在部门的名称;

  SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE

  WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.SAL BETWEEN LOSAL AND HISAL;

  4. 自连接

  自连接是数据库中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。下面介绍一下自连接的方法:

  将原表复制一份作为另一个表,两表做笛卡儿相等连接。

  例 显示雇员的编号,名称,以及该雇员的经理名称

  SELECT WORKER.ENAME,WORKER.MGR,MANAGER.EMPNO,MANAGER.ENAME FROM EMP WORKER,EMP MANAGER

  WHERE WORKER.MGR = MANAGER.EMPNO;

  5.哈希连接

  当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的基于连接键的哈希表;优化器再扫描表连接中的大表,将大表中的数据与哈希表进行比较,如果有相关联的数据,则将数据添加到结果集中。

  当表连接中的小表能够完全cache到可用内存的时候,哈希连接的效果最佳。哈希连接的成本只是两个表从硬盘读入到内存的成本。

  但是,如果哈希表过大而不能全部cache到可用内存时,优化器将会把哈希表分成多个分区,再将分区逐一cache到内存中。当表的分区超过了可用内存时,分区的部分数据就会临时地写到磁盘上的临时表空间上。因此,分区的数据写磁盘时,比较大的区间(EXTENT)会提高I/O性能。ORACLE推荐的临时表空间的区间是1MB。临时表空间的区间大小由UNIFORM SIZE指定。

 当哈希表构建完成后,进行下面的处理:

  1) 第二个大表进行扫描

  2) 如果大表不能完全cache到可用内存的时候,大表同样会分成很多分区

  3) 大表的第一个分区cache到内存

  4) 对大表第一个分区的数据进行扫描,并与哈希表进行比较,如果有匹配的纪录,添加到结果集里面

  5) 与第一个分区一样,其它的分区也类似处理。

  6) 所有的分区处理完后,ORACLE对产生的结果集进行归并,汇总,产生最终的结果。

  当哈希表过大或可用内存有限,哈希表不能完全CACHE到内存。随着满足连接条件的结果集的增加,可用内存会随之下降,这时已经CACHE到内存的数据可能会重新写回到硬盘去。如果出现这种情况,系统的性能就会下降。

  当连接的两个表是用等值连接并且表的数据量比较大时,优化器才可能采用哈希连接。哈希连接是基于CBO的。只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希边连接。HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用HASH_AREA_SIZE。当使用ORDERED提示时,FROM子句中的第一张表将用于建立哈希表。

 

      select a.user_name,b.dev_no

  from user_info a, dev_info b

  where a.user_id = b.user_id;

  Plan

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

  0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=82 Bytes=3936

  )

  1 0 HASH JOIN (Cost=5 Card=82 Bytes=3936)

  2 1 TABLE ACCESS (FULL) OF 'USER_INFO' (Cost=2 Card=82 Bytes

  =1968)

  3 1 TABLE ACCESS (FULL) OF 'DEV_INFO' (Cost=2 Card=82 Bytes=

  1968)

可以通过在SQL语句中添加HINTS,强制ORACLE优化器产生哈希连接的执行计划。

 

 

      select /*+ use_hash(a b)*/ a.user_name,b.dev_no

  from user_info a, dev_info b

  where a.user_id = b.user_id;

当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索B_树索引更加迅速。

分享到:
评论

相关推荐

    Oracle数据库表连接方式及常见用法

    Oracle 数据库表连接方式及常见用法 Oracle 数据库表连接方式是指在数据库中连接两个或多个表以获取所需的数据。这些连接方式包括相等连接、外连接、不等连接、自连接和哈希连接等。本文将详细介绍这些连接方式的...

    ORACLE表连接方式分析及常见用法

    通过深入分析每种连接方式的内部机制,结合具体场景选择合适的方法,可以有效地处理大数据量的关联操作,从而提高数据仓库系统的实时性和效率。在实际应用中,应结合硬件配置、数据分布和业务需求,进行全面的性能...

    数据库连接的4种方式

    本文将深入探讨四种常见的数据库连接方式,分别是:JDBC(Java Database Connectivity)、ODBC(Open Database Connectivity)、连接池以及ORM(Object-Relational Mapping)框架。 1. JDBC(Java Database ...

    Java 数据库连接泄漏 解决方法

    ### Java 数据库连接泄漏及其解决方法 #### 一、引言 在软件开发过程中,特别是在使用Java进行Web应用开发时,数据库连接管理是一项至关重要的任务。不当的连接管理会导致资源浪费,甚至引发系统性能问题。其中,...

    java 连接各种数据库方式 连接各种数据库方式速查表

    每种数据库的连接细节虽有差异,但基本流程相似:加载JDBC驱动、设置连接参数、使用`DriverManager.getConnection()`方法获取数据库连接。掌握这些基本步骤,可以轻松地在Java应用程序中集成不同类型的数据库服务。

    oracle、mysql、selserver等数据库的连接方式,以及其他各种数据库的连接方式

    ### 数据库连接方式详解 在IT领域中,数据库是存储和管理数据的核心工具之一。不同的数据库管理系统(Database Management System,DBMS)有着各自的特点和适用场景。为了能够有效地与这些数据库进行交互,掌握不同...

    数据库连接大全--各种数据库连接方式

    不同的数据库管理系统(DBMS)都有其特定的连接方式,以下是常见的数据库连接方式: SQL Server SQL Server 是 Microsoft 公司开发的一款关系数据库管理系统,广泛应用于企业级应用程序中。SQL Server 的连接方式...

    Delphi几种数据库连接

    以下将详细介绍几种常见的Delphi数据库连接方法: 1. **ADO(ActiveX Data Objects)** ADO是Microsoft提供的数据访问接口,通过COM组件与数据库进行通信。在Delphi中,可以使用TADOConnection、TADOCommand等...

    解决数据库连接方法

    SQL Server提供了多种连接方式,包括通过内置的客户端工具(如企业管理器、查询分析器、事务探查器)以及通过用户自定义的客户端应用程序(如ASP脚本、VB程序),这些程序通常利用ODBC(开放数据库连接)或OLE DB...

    不同数据库的连接方式

    不同的数据库管理系统(DBMS)提供了多种连接方式来实现这种交互,其中包括使用Java Database Connectivity (JDBC) 和 Open Database Connectivity (ODBC) 等技术。本文将详细介绍SQL Server、MySQL以及通过ODBC连接...

    ADO教程,与不同数据库的连接方式

    7. **关闭数据库连接**:使用`Close`方法关闭与数据库的连接。 #### 四、创建数据库连接 ##### 1. DSN-less连接 DSN-less连接是一种无需数据源名称(Data Source Name)即可连接数据库的方式,适用于小型应用。...

    八种数据库的连接方式

    本文将详细介绍八种常见数据库的连接方式,包括Oracle、DB2、SqlServer、Sybase、Informix、MySQL、PostgreSQL以及Access数据库,帮助开发者更好地理解和掌握数据库连接的技术细节。 ### 1. Oracle8/8i/9i数据库...

    asp与数据库的连接方法

    本文将详细介绍ASP中常见的五种连接数据库的方法,并着重讲解使用ODBC和ADO进行数据库连接的具体步骤及代码示例。 #### ODBC与ADO简介 - **ODBC(Open Database Connectivity)**:是一种标准的应用程序接口(API...

    VC数据库连接及使用

    总的来说,VC++数据库连接及使用涉及到多个层面的知识,包括但不限于数据库API的选择、连接字符串的构建、数据访问组件的使用、事务处理、错误处理和性能优化。熟练掌握这些知识点,能帮助开发者高效地实现数据库...

    如何连接SQL数据库

    3. **建立连接**: 使用所选驱动提供的API创建数据库连接。例如,对于Java中的JDBC,你可以使用`DriverManager.getConnection()`方法。 ```java Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ...

    几种数据库的连接方法源码+文档

    本文将深入探讨几种常见的数据库连接方法,包括源码示例和相关文档,旨在帮助开发者更好地理解和实现数据库的连接。 首先,我们来看看最基本的数据库连接方式——JDBC(Java Database Connectivity)。JDBC是Java...

    java数据库连接方法(一)

    这篇博客"java数据库连接方法(一)"将探讨如何在Java中建立与数据库的连接,包括JDBC(Java Database Connectivity)的基本概念、步骤以及常见的数据库连接池技术。下面是对这个主题的详细阐述。 **JDBC简介** ...

    Dreamweaver中进行数据库连接

    - 使用记事本打开`数据库连接.udl`文件,复制连接字符串。 - 将连接字符串粘贴到Dreamweaver的数据库连接设置中。 #### 处理连接问题 - **兼容性问题**:确保操作系统与MDAC版本兼容。例如,在Windows XP SP2或...

    JDBC连接Oracle数据库常见问题及解决方法

    "JDBC连接Oracle数据库常见问题及解决方法" 本文将对 JDBC 连接 Oracle 数据库常见问题进行总结和解决方法的介绍。以下是针对不同问题的解决方案: 1. Jbuilder 正确连接 Oracle 数据库需要注意的几个问题 在使用...

    java数据库连接池

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要时都创建新的连接。这大大提高了应用程序的性能和效率,因为创建和销毁数据库...

Global site tag (gtag.js) - Google Analytics