11 半联结 & 反联结

半联结 和 反联结是 oracle 优化器能够选择用来在获取信息时应用的两个密切相关的联结方法(实际上是联结方法的选项)

半联结

IN 的半联结

select /* using in */ department_name

from hr.departments dept

where department_id IN (select department_id from hr.employees emp);

EXISTS 半联结

select /* using exists */ department_name

from hr.departments dept

where EXISTS(select null from hr.employees emp where emp.department_id = dept.department_id);

EXISTS 和 IN 的可替换语法

select /* inner join */ department_name

from hr.departments dept, hr.employees emp

where dept.department_id = emp.department_id;

控制半联结执行计划

半联结 实际上就是双层for循环, 注意下边的: NESTED LOOPS SEMI (半联结的标志)

使用提示控制半联结执行计划

SEMIJOIN - 进行半联结

NO_SEMIJOIN - 不进行半联结

例如:

select /* exists no_semijoin */ department_name

from hr.departments dept

where exists (select /*+ no_semijoin */) null from hr.employees emp where emp.department_id = dept.department_id);

因为我们提供了 no_semijion 的提示, 所以, 执行计划中就没有在使用半联结, 而是使用了 filter(exists (select o from ))

反联结

总结: 实际上, 以上的联结, 我都有在前面的 table join 类型时 有单独拿出来讲过, 所以, 这里不在详细说明.

总结的结果就是, 由于我们使用的优化器一般都是基于成本的, 所以, 只使用 EXISTS 和 外连接 两种.

时间: 2024-08-06 09:29:56

11 半联结 & 反联结的相关文章

半联结&反联结!

半联结是在两个数据集(表)之间的联结,其中第一个数据集中的数据行在决定是否返回时会根据在另一个数据集中出现或不出现至少一个相匹配的数据行来确定.“不出先”匹配行——这是半联结的一种特殊形式,称为反联结. 标准的内联结与半联结之间最主要的区别在于在半联结中,第1个数据集中的每一条记录至返回一次,而不管在第二个数据集中有几条匹配的数据.这个定义表明这个查询的实际处理过程可以通过在找到第1个匹配以后马上停止第二个查询来进行优化. 从本质上来说,这就是半联结:可以通过在查询2执行完成之前停止处理该查询来

11周(反序数)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:反序数 *作者:王忠 *完成日期:2014.11.10 *版本号:v1.0 * *问题描述:输入1234,输出4321 *输入描述:输入一串数字 *程序输出:倒着输出这串数字 #include <iostream> using namespace std; int reverse(int); int main() { int m,n; cin>>m; n=reve

《精通Oracle SQL(第2版) 》

<精通Oracle SQL(第2版) > 基本信息 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj ShamsudeenJared Still 译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115351661 上架时间:2014-5-5 出版日期:2014 年5月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > Oracle 更多关于>&g

MYSQL必知必会读书笔记 第十五和十六章 联结表

为什么要使用联结? 如果数据存储在多个表中,怎样使用单条SELECT语句检索出数据?答案就是使用联结.简单地说,可以联结多个表返回一组输出,联结在运行时关联表中正确的行. 1.创建联结 SELECT vend_name,prod_name,prod_price from vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name; 注意:在引用列可能出现二义性时,必须使用完全限定列名.

oracle 联结方法

一般来说,联结方法分为:嵌套循环联结(Nested Loops),散列联结(Hash-Join),排序合并联结(Sort Merge Join)以及笛卡尔联结(Merge Join Cartesian). 1.嵌套循环联结(Nested Loops) 嵌套循环有外部表(drivingtable,驱动表)和内部表(inner或driven-to table ,被驱动表)的概念,一般来说,结果集大的成为内部表,结果集小的成为外部表.由外部表(结果集)来驱动内部表. 嵌套循环联结使用一次访问运算所得的

《MySQL必知必会学习笔记》:高级联结

创建高级联结 上篇博文简单的介绍了下联结的使用,这篇博文就介绍下如何来创建高级联结. 使用表别名 在前面的学习中,我们知道如何给列取一个别名,现在回顾下,如下: select cust_name,upper(cust_name) as upper_name from customers; 或者是,用concat函数来对客户的姓名和电话进行组合为一个新的信息 ,将这个新的信息取一个别名,如下: 以上就是给列取别名,也可以给计算字段取别名.不仅如此,SQL还允许给表名取别名.这样做有两个主要理由,如

数据库9:联结表 高级联结 组合查询 全文本搜索

第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分.   外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系. 好处:供应商信息不重复,不浪费空间和时间,方便日后修改,一个表信息改动不影响另一个表的信息 联结是一种机制,使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行.   创建联结          

联结表

1.无联结 没有联结条件的表关系返回的结果为笛卡尔积 2.内部联结 /等值联结 INNER JOIN 3.自联结 使用表别名 e.g. select p1.prod_name,p1.prod_id from products as p1,products as p2 where p1.vend_id=p2.vend_id and p2.prod_id='DTNTR' 4.自然联结 每个列只能出现一次 5.外部联结 包含了没有关联行的那些行 左外部联结:LEFT OUTER JOIN 右外部联结:

SQL必知必会 笔记 第十三章 创建高级联结

13.1使用表别名 别名除了用于列名和计算字段外,SQL还允许给表明起别名.这样做有两个主要理由: (1)缩短SQL语句 (2)允许在单条SELECT语句中多次使用相同的表. SELECT cust_name,cust_contact FROM Customers AS C,Orders AS O,OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';