SQL FOR TESTING:
create table qcb_student_test(
student_id number,
student_name varchar2(20),
student_age number,
class_id number
);
create table qcb_class_test(
class_id number,
class_name varchar2(20)
);
select * from qcb_student_test
select * from qcb_class_test
alter table qcb_student_test add primary key (student_id)
alter table qcb_class_test add primary key (class_id)
alter table tb_user add constraint fk_user_group foreign key(g_id) references tb_group(group_id);
alter table qcb_student_test add constraint class_id_foreign foreign key (class_id) references qcb_class_test (class_id);
insert into qcb_student_test values(1,'kevin',28,1);
insert into qcb_student_test values(2,'singo',25,1);
insert into qcb_student_test values(3,'james',26,1);
insert into qcb_class_test values(1,'teacher_zhan');
insert into qcb_student_test values(4,'sakula',28,2);
insert into qcb_student_test values(5,'allen',25,2);
insert into qcb_class_test values(2,'teacher_li');
insert into qcb_student_test values(6,'luomin',28,null);
insert into qcb_class_test values(3,'teacher_zeng');
表连接的几种方式:
1.SORT MERGE JOIN(排序-合并连接)
执行流程:
a.查询出表qcb_student_test s的数据,按照连接列s.class_id排序
b.查询出表qcb_class_test c的数据,按照连接列c.class_id排序
c.两边结果集做合并操作
2.NESTED LOOPS(嵌套循环)
执行流程:
表连接中查询出表qcb_class_test c的第一行数据并根据字段id,与qcb_student_test s表中所有数据做匹配,匹配的话,把数据放入结果集中。
二 所有数据
三 所有数据
3.HASH JOIN(哈希连接)
哈希连接只适用于等值连接(即连接条件为 = )
HASH JOIN对两个表做连接时并不一定是都进行全表扫描,其并不限制表访问方式;
执行流程:
a) 取出 row source 1(驱动表,在HASH JOIN中又称为Build Table) 的数据集,然后将其构建成内存中的一个 Hash Table(Hash函数的Hash KEY就是连接操作关联列),创建Hash位图(bitmap)
b) 取出 row source 2(匹配表)的数据集,对其中的每一条数据的连接操作关联列使用相同的Hash函数并找到对应的 a) 里的数据在 Hash Table 中的位置,在该位置上检查能否找到匹配的数据
4.CARTESIAN PRODUCT(笛卡尔积)