ORACLE 内连接 自然连接 外连接(左连接 右连接 full )交叉连接

内连接 自然连接 外连接(左连接 右连接 full )交叉连接
内连接 inner join on key1=key2 or from ta,tb where ta.key=tb.key
自然连接 national join 不要写条件 同名的列=的去重内连接 
左连接 left (outer) join on (或者 from ta,tb where ta.key=tb.key(+)) 内连接集合+左有右没有时候右的为null
右连接 right (outer) join on (或者 from ta,tb where ta.key=tb.key(+))  内连接集合+右有左没有时候左的为null
full 连接 full join on  内连接集合++左有右没有时候右的为null+右有左没有时候左的为null 的集合
交叉连接 直接表名后面没有了on条件,做笛卡尔积,出结果

   

-- 内连接:就是oracle的等于连接
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id = t02.t_id;
SELECT t01.t_id ,t02.t_id FROM t01 INNER JOIN t02 ON t01.t_id = t02.t_id;
-- 左外连接:左连接的加号在右边,结果是匹配到的记录 + 左表中没有匹配的记录
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id = t02.t_id(+);
SELECT t01.t_id, t02.t_id FROM t01 LEFT OUTER JOIN t02 ON t01.t_id = t02.t_id;
-- 右外连接:右连接的加号在左边,结果是匹配到的记录 + 右表中没有匹配的记录
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id(+) = t02.t_id;
SELECT t01.t_id, t02.t_id FROM t01 RIGHT OUTER JOIN t02 ON t01.t_id = t02.t_id;
-- 交叉连接:笛卡尔积,左表中的每一条记录与右表中的记录一条条对应
SELECT t01.t_id, t02.t_id FROM t01, t02;
SELECT t01.t_id, t02.t_id FROM t01 CROSS JOIN t02 where t01.t_id>5;
-- 不等连接:>、<、!=或者(<>),左表中的每一条记录与右表中的记录一条条比较
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id > t02.t_id;
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id < t02.t_id;
SELECT t01.t_id, t02.t_id FROM t01, t02 WHERE t01.t_id != t02.t_id;
-- 自连接
SELECT t01.t_id, t01.t_no FROM t01, t01 t1 WHERE t01.t_id = t1.t_no;
SELECT t1.t_id, t1.t_no FROM t01 t2, t01 t1 WHERE t1.t_id = t2.t_no;
关于Using关键字

Using关键字
是在连接查询中用来代替对应的on关键字的,进行条件匹配。

原理
1、 在连接查询时,使用on的地方用using代替

2、 使用using的前提是对应的两张表连接的字段是同名(类似自然连接自动匹配)

3、 如果使用using关键字,那么对应的同名字段,最终在结果中只会保留一个。

语法
基本语法:表1 [inner,left,right] join 表2 using(同名字段列表); //连接字段

关于多表join using的理解(3表以上)

 注意写法 a join b on a.key1=b.key1 join c on b.key2=c.key2


1 --SQL92:查询员工信息及部门名称及所在城市的名称并且工资大于2000或者有奖金的
 2 select e.*,d.dname,c.cname
 3 from emp e,dept d,city c
 4 where (e.deptno=d.deptno and d.loc=c.cid and e.sal>2000)or(e.deptno=d.deptno and d.loc=c.cid and comm is not null)
 5 order by e.sal;
 6 --SQL99:查询员工信息及部门名称及所在城市的名称并且工资大于2000或者有奖金的
 7 select e.*,d.dname,c.cname
 8 from emp e
 9 inner join dept d
10 on e.deptno=d.deptno
11 inner join city c
12 on d.loc=c.cid
13 where e.sal>2000 or e.comm is not null
14 order by e.sal;
 注意写法 a join b on a.key1=b.key1 join c on b.key2=c.key2

--SQL92:
  --特点:易于书写,难于阅读
  --缺点:92SQL语句结构不清晰。
  --用法:
    --select 内容(别名,连接符,Oracle函数等)
    --from 表名1,表名2,表名3...
    --where 条件(连接条件,普通筛选条件,where子句关键字)
    --group by 分组字段
    --having 多行函数筛选
    --order by 排序字段

--SQL99
--特点:难于书写,易于阅读。
--用法:
    --select 内容 
    --from 表名1
    --inner join 表名2
    --on 连接条件
    --inner join 表名3
    --on 连接条件
    --where 条件(连接条件,普通筛选条件,where子句关键字)
    --group by 分组字段
    --having 多行函数筛选
    --order by 排序字段

多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
hash最快
merage join (使用在已经排序的 例如聚族index)
nested loop (常规 一般驱动表记录少时候效率高 驱动表 where写的时候要写后面)

NESTED LOOP
从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表,就是一个二重循环。

举例说明:

select t1.*,t2.* from t1,t2 where t1.col1 = t2.col1;
1
使用nested loop 相当于:

--外层循环,t1表循环
FOR RS in (select t1.* from t1) LOOP

    --内层循环 ,t2 表循环
    select t2.* from t2 where t2.col1 = rs.col1;


END LOOP;

复杂度:

如果内层循环t2走的是全表扫描,复杂度是O(m*n);
如果内层循环t2走的是索引扫描,复杂度是O(m*log(n));
使用方法:

使用/* +use_nl(t1,t2) */告诉oracle 强行使用nested loop一般而言,使用nested loop使用数据量小的表作为驱动表(准确说,应该是经过限制条件后返回结果集行数较少的应作为驱动表),这样复杂度O(m*log(n)),即驱动表数据记录m要小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值