`

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

阅读更多

 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 SQL优化中对于系统性能影响极大的表连接方式、特点、适用范围,并对如何使用和优化做了详细的探讨。

    导入数据库常见错误,方法经验总结

    文章目录1、连接数据库时提示密码出错2、mysql的版本与导入的数据所用的版本不同3、navicat中创建数据库时,所定义的字符集与原数据库使用的字符集不同4、mysql配置文件中设置的最大容量不够了5、在phpstudy中重启...

    数据库连接/查询控件

    这下可好了,有了绝好的DbConnect控件,你再不必为数据库的连接及配置而发愁了.只需几个简单的设置,就能轻松搞定与数据库的相关操作.它将连接服务器的信息加密后写入INI文件,数据库安全性得到了保 .而且它里面封闭了...

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有...

    关于数据库连接池的问题和思考

    近数据中心出了一些问题,在Mysql连接上出现了连接数量不足的问题,一时也没找到原因,然后只是找到了解决方法,因为之前程序的错误,在打开数据库之后忘记了关闭数据库,才造成了这样的问题。在这里也要提醒各位,...

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    什么是数据库连接池?为什么使用连接池可以提高数据库访问性能? 什么是数据库事务隔离级别?列举一些常见的事务隔离级别。 什么是数据库索引类型?列举一些常见的索引类型。 什么是数据库备份和恢复?列举一些...

    Oracle数据库学习指南

    19.Delphi 3_0中连接数据库的三种方式 20.远程数据库的访问 21.监控数据库性能的SQL 22.简单实现数据库表空间的备份或迁移 23.简析REDO LOGFILE 24.理解和使用Oracle 8i分析工具-LogMiner 25.哪些初始...

    Python技术数据库连接常见问题解决方法.docx

    Python技术的使用教程、使用方法、使用技巧、使用注意事项、使用中常见问题

    数据库原理(第5版)

    第7章介绍了使用基于Web的数据库处理,包括开放数据库连接(ODBC)和PHP脚本语言的使用。本章也讨论了可扩展标记语言(XML)的出现和基本概念。 第8章介绍了商业智能(BI)系统和支持它们的数据仓库体系结构,还讨论了多维...

    数据库项目组日常运维及应急故障处理手册.docx

    常见问题及处理方案 CPU使用率高的问题 通过操作系统命令top topas glance等查看top进程号,确认是系统进程还是oracle应用进程,查询当前top进程执行的操作和sql语句进行分析。 根据进程号获取正在执行的sql ...

    Access数据库教案.doc

    《数据库原理及应用(Access)》教案 第一章 数据库基本原理 教学目标:通过对数据库基本概念、数据系统的组成的讲解,让学生了解数据库技术 ;掌握层次模型、网状模型和关系模型的概念和特点,并能够学会使用传统...

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

    Jbuilder正确连接 oracle 9i需要注意的几个问题 oracle8以上的应该都使用classes12.jar文件作为jdbc驱动; 正确设置windows的classpath和jbuilder中的enterprise setup 、configure libraries,将casses12.jar路径...

    齐博CMS常见的数据库连接错误解决方法

    主要为大家介绍了齐博CMS常见的数据库连接错误解决方法,需要的朋友可以参考下

    Java数据库编程宝典3

    3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.5 数据查询语言 3.5.1 SELECT语句 3.5.2 WHERE子句 3.5.3 SQL...

    Python SQLite3数据库日期与时间常见函数用法分析

    主要介绍了Python SQLite3数据库日期与时间常见函数用法,结合实例形式分析了Python连接、查询SQLite3数据以及数据库日期与时间常见操作方法,需要的朋友可以参考下

    数据库系统原理上机实验.doc

    数据库系统原理上机实验 实验1数据库系统及数据库基础操作 1、实验目的 1) 熟练掌握SQL Server的使用方法。 2) 理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。 2、...

    android连接SQLite数据库源代码

    提供了onCreate()和onUpdate()两个回调函数,允许我们常见和升级数据库是进行使用 A、 在SQLiteOpenHelper的子类当中,必须要有的构造函数 B、该函数是在第一次创建数据库的时候执行,实际上是在第一次得到...

    PHP DB 数据库连接类定义与用法示例

    主要介绍了PHP DB 数据库连接类定义与用法,涉及php基于mysqli针对数据库的连接、增删改查等常见操作封装与使用技巧,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics