连接(join)
一、oracle连接的语法分为2类:
1、oracle专用语法(传统语法,主要是指sql:89语法,被广泛支持,是oracle专门支持的语法)
2、ANSI SQL:99(标准语法,oracle在8i后引入了sql99的语法,各厂商据此发展自己的sql:T-SQL,PL/SQL)
Oracle为了适应大多数人的使用,既支持了oracle专用语法,也支持了ANSI SQL:99语法,所以oracle 9i实现多表之间的连接既可以用oracle专用语法,也可以用ANSISQL:99语法。两种语法没有效率上的提高。
第一个图介绍了oracle8i及之前的数据库使用专用语法,8i之后支持标准语法。oracle8i及之前的数据库实现标准语法的内连接都是通过等值连接和不等连接实现的,没有标准语法直接引用natrual join、join using、join on更方便。所以自然连接使用很广泛。
第二个图介绍了sql join types,给各种类型联接做出分类。
参见http://www.gplivna.eu/papers/sql_join_types.htm
二、Oracle连接的类型:
Oracle 专用语法也支持内连接(自然连接,交叉连接,自连接)和外连接;内连接通过等值连接、不等值连接和笛卡尔乘积来实现。外连接通过(+)=和=(+)来实现。
外连接中,+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示, 故是左连接; 加号写在左表,右表就是全部显示, 故是右连接。
等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
1、内连接(inner join):相对于外连接而言的。sql语句中的join默认是inner join。
inner join省略inner。
1.1自然连接
1.1.1专用语法
1.1.2标准语法
1.1.2.1 natual join (纯自然连接)
1.1.2.2 join using
1.1.2.3 join on
1.2交叉连接(cross-join/cartesian product)
1.2.1专用语法
1.2.2标准语法
1.3自连接(self-join): 特殊的内连接
1.3.1 专用语法
备注:1、自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。2、这里的等值连接和不等值连接指的是操作符两边都是表的列,而不是具体值或者范围等。
2、外连接(outerjoin)
2.1 左外连接left (outer) join
2.1.1 专用语法
2.1.2 标准语法
2.2 右外连接right (outer) join
2.1.1 专用语法
2.1.2 标准语法
2.3 全外连接full (outer) join
2.1.1 专用语法:+不支持全外连接,可以通过union左右连接实现
2.1.2 标准语法
三、select执行顺序
FROM < left_table>
ON < join_condition>
< join_type> JOIN < right_table>
WHERE < where_condition>
GROUP BY < group_by_list>
WITH {cube | rollup}
HAVING < having_condition>
SELECT
DISTINCT
ORDER BY < order_by_list>
< top_specification> < select_list>
标准的SQL 的解析顺序为:
.FROM 子句组装来自不同数据源的数据
.WHERE 子句基于指定的条件对记录进行筛选
.GROUP BY 子句将数据划分为多个分组
.使用聚合函数进行计算
.使用HAVING子句筛选分组
.计算所有的表达式
.使用ORDER BY对结果集进行排序
执行顺序
FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1
ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2
OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4
GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5
CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6
HAVING:对vt6应用HAVING筛选器只有使< having_condition> 为true的组才插入vt7
SELECT:处理select列表产生vt8
DISTINCT:将重复的行从vt8中去除产生vt9
ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10
TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者
四、实现算法
1、嵌套循环(NestedLoops Join)
2、哈希连接(HashJoin)
3、排序合并(MergeSort Join)