Oracle数据库表连接方式及常见用法 (oracle是什么)

VPS云服务器 2025-04-18 21:42:54 浏览
Oracle表连接方式及常见用法

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

1. 相等连接

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

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

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

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

2. 外连接

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

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

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

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

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

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

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

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

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

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子句中的***张表将用于建立哈希表。

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

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

【编辑推荐】


链接数据库有哪些方法?

常见的数据库连接方法如下:一、连接Access数据库1. 使用已有DSN的连接字符串进行连接(ODBC);2.使用无DSN的连接字符串进行连接(ODBC);3.使用连接字符串进行连接(OLEDB);4.使用UDL文件进行连接;使用UDL文件连接数据源的步骤如下:(1)新建一个记事本,其扩展名为。 (2)双击该UDL文件,弹出“数据连接属性”对话框。 (3)该对话框首页显示“提供程序”选项卡,选择要使用的OLEDB提供程序。 (4)单击“下一步”,显示l连接“选项卡”,设置好正确的参数后,单击“测试连接”二、连接MySQL数据库1.使用已有DSN的连接字符串进行连接;2.使用无DSN的连接字符串进行连接;三、连接Oracle数据库1.使用 Data Provider(需要安装Oracle客户端)2.使用 Data Provider3.使用OLE Data Provider

sql 连接oracle的几种方式

1、相等连接通过两个表具有相同意义的列,可以建立相等连接条件。 只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。 例 查询员工信息以及对应的员工所在的部门信息;SELECT * FROM EMP,DEPT;SELECT * FROM EMP,DEPTWHERE = ;REM 显示工资超过2000的员工信息以及对应的员工的部门名称。 2、外连接对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。 除了显示匹配相等连接条件的信息之外,还显示无法匹配相等连接条件的某个表的信息。 外连接采用(+)来识别。 A) 左条件(+) = 右条件;代表除了显示匹配相等连接条件的信息之外,还显示右条件所在的表中无法匹配相等连接条件的信息。 此时也称为右外连接.另一种表示方法是:SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 连接条件B) 左条件 = 右条件(+);代表除了显示匹配相等连接条件的信息之外,还显示左条件所在的表中无法匹配相等连接条件的信息。 此时也称为左外连接 ... FROM 表1 LEFT OUTER JOIN 表2 ON 连接条件例 显示员工信息以及所对应的部门信息--无法显示没有部门的员工信息--无法显示没有员工的部门信息--SELECT * FROM EMP,DEPT WHERE = ;--直接做相等连接:SELECT * FROM EMP JOIN DEPT ON = ;REM 显示员工信息以及所对应的部门信息,显示没有员工的部门信息--SELECT * FROM EMP,DEPT WHERE (+) = ;SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON = ;REM 显示员工信息以及所对应的部门信息,显示没有部门的员工信息--SELECT * FROM EMP,DEPT WHERE = (+);SELECT * FROM EMP LEFT OUTER JOIN DEPT ON = ;3、不等连接两个表中的相关的两列进行不等连接,比较符号一般为>,<,...,BETWEEN.. SALGRADE--DESC SALGRADE;--SELECT * FROM SALGRADE;REM 显示员工的编号,姓名,工资,以及工资所对应的级别。 SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMPWHERE BETWEEN LOSAL AND HISAL;REM 显示雇员的编号,姓名,工资,工资级别,所在部门的名称;SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADEWHERE = AND BETWEEN LOSAL AND HISAL;4、自连接自连接是数据库中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。 下面介绍一下自连接的方法:将原表复制一份作为另一个表,两表做笛卡儿相等连接。 例:显示雇员的编号,名称,以及该雇员的经理名称SELECT ,,, FROM EMP WORKER,EMP MANAGERWHERE = ;

Oracle中有几种表连接

左连接SELECT _name, _id, _nameFROM employees eLEFT OUTER JOIN departments dON (_id = _id);等价于SELECT _name, _id, _nameFROM employees e, departments dWHERE _id=_id(+)结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。右连接SELECT _name, _id, _nameFROM employees eRIGHT OUTER JOIN departments dON (_id = _id);等价于SELECT _name, _id, _nameFROM employees e, departments dWHERE _id(+)=_id结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐