join,left join and where的测试
来源:互联网 发布:excel编程用途 编辑:程序博客网 时间:2024/06/04 19:50
ID NAME
---------- -------------
2 c
3 d
e
2 f
SQL> select * from t1;
ID NAME
---------- --------------------
1 a
2 b
SQL> select * from t1 left join t2 on t1.id=t2.id;
ID NAME ID NAME
---------- -------------------- ---------- ------------
2 b 2 c
2 b 2 f
1 a
join后的and是先过滤表t2,然后再去和t1连接
SQL> select * from t1 left join t2 on t1.id=t2.id and t2.name<>'c';
ID NAME ID NAME
---------- -------------------- ---------- --------------------
2 b 2 f
1 a
执行计划中也是能看出来的额
--------------------------------------------------------------------------------
Plan hash value: 1823443478
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 80 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 2 | 80 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T1 | 2 | 40 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| T2 | 3 | 60 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."ID"="T2"."ID"(+))
3 - filter("T2"."NAME"(+)<>'c')
在where条件后面添加t2的过滤条件,后,先过滤t2,然后t1与t2的关联就变成了等值连接,不是外连接了
SQL> explain plan for select * from t1 left join t2 on t1.id=t2.id where t2.name<>'c';
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1838229974
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 80 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN | | 2 | 80 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T1 | 2 | 40 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| T2 | 3 | 60 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."ID"="T2"."ID")
3 - filter("T2"."NAME"<>'c')
select * from t1 left join t2 on t1.id=t2.id where t1.name <>'a';
ID NAME ID NAME
---- -------------------- ---------- --------------------
2 b 2 c
2 b 2 f
SQL> explain plan for select * from t1 left join t2 on t1.id=t2.id where t1.name <>'a'
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1823443478
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 80 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 2 | 80 | 7 (15)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| T1 | 1 | 20 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T2 | 4 | 80 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."ID"="T2"."ID"(+))
2 - filter("T1"."NAME"<>'a')
在where后面添加t1的过滤条件后,先过滤t1然后再外连接
在on后面添加t1的过滤条件
SQL> explain plan for select * from t1 left join t2 on t1.id=t2.id and t1.name <>'a';
已解释。
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1823443478
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 80 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 2 | 80 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T1 | 2 | 40 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| T2 | 4 | 80 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."ID"="T2"."ID"(+))
filter("T1"."NAME"<>CASE WHEN ("T2"."ID"(+) IS NOT NULL) THEN
'a' ELSE 'a' END )
Note
-----
- dynamic sampling used for this statement (level=2)
已选择21行。
- join,left join and where的测试
- oracle--left join and 和left join where的区别
- oracle--left join and 和left join where的区别
- oracle--left join and 和left join where的区别
- oracle--left join and 和left join where的区别
- left join on and 与 left join on where
- left join on and 与 left join on where
- left join 加and 和 left join 加where
- inner join、left join、right join中where和and的作用
- inner join、left join、right join中where和and的作用
- 数据库 inner join,right join,left join ,以及其后的and ,where 条件
- left join on ...and ... 与left join on ... where.. 的区别
- left join on and与left join on where的区别
- left join on and与left join on where的区别
- left join on and与left join on where的区别
- left join on and 与 left join on where的区别
- left join on and与left join on where的区别
- left join on and与left join on where的区别
- 多个activity操作一个service
- HttpContext.Response.ContentType列表
- 解决Android中RadioButton图片和文本居中及底部经常被工具烂覆盖掉内容
- SQL基本语句及其使用方法之【CREATE/SELECT/ALTER/DROP/GROUP BY】
- /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
- join,left join and where的测试
- AppNinja 开发手记4: dmg kernelcache解密命令
- 啦啦啦
- 下拉刷新
- 关于tableview 的一个小问题
- 程序员——C语言之指针 易错知识点
- Android linux的休眠和唤醒
- 内存泄漏检查方法
- 状态模式--策略模式--代理模式