1. 程式人生 > >簡單介紹join,outer-join,semi-join,anti-join的區別

簡單介紹join,outer-join,semi-join,anti-join的區別

表 連線的方式如join ,semi -join ,outer-join ,anti-join
表連線的實現方式如nested loop,merge,hash.
本文簡單的介紹表連線的方式join ,semi -join ,outer-join ,anti-join 和 適用情景。

假設2個數據源(row source).
Emp(id pk,ename,deptno) Dept(deptno pk,dname)

如下是join
select ename,dname from emp,dept where emp.deptno=dname.deptno;
2個數據源鍵值一一比較,返回相互匹配的記錄集
for example: nested loop join

for x in ( select * from emp )
loop
for y in ( select * from dept)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.ename,y.dname)
End if
end loop
end loop

outer-join
select ename,dname from emp,dept where emp.deptno= dept.deptno(+);
select ename,dname from emp,dept where emp.deptno(+)=dept.deptno;
2個數據源鍵值一一比較,返回相互匹配的;但如果在另外一個row source沒有找到匹配的也返回記錄
for example: nested loop outer-join

for x in ( select * from emp )
loop
find_flag=false;
for y in ( select * from dept)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.ename,y.dname)
Find_flag=true
End if
end loop
if ( find_flag == false )
OutPut_Record(x.ename,null)
End if
end loop
semi -join
select dname from dept where exists( select null from emp where emp.deptno=dept.deptno)
多在子查詢exists中使用,對外部row source的每個鍵值,查詢到內部row source匹配的第一個鍵值後就返回,如果找到就不用再查詢內部row source其他的鍵值了。
for example: nested loop semi
-join


for x in ( select * from dept )
loop
for y in ( select * from emp)
loop
if ( x.deptno == y.deptno )
OutPut_Record(x.dname)
Break;
End if
end loop
end loop

anti-join
select ename,deptno from emp,dept where emp.deptno!=dept.deptno
多用於!= not in 等查詢;如果找到滿足條件(!= not in)的不返回,不滿足條件(!= not in)的返回。和join 相 反。
 for example: nested loop anti-join
for x in ( select * from emp )
loop
for y in ( select * from dept)
loop
if ( x.deptno != y.deptno )
OutPut_Record(x.dname,y.deptno)
End if
end loop
end loop

相關推薦

簡單介紹join,outer-join,semi-join,anti-join區別

表 連線的方式如join ,semi -join ,outer-join ,anti-join ; 表連線的實現方式如nested loop,merge,hash. 本文簡單的介紹表連線的方式join ,semi -join ,outer-join ,anti-join 和 適用情景。 假設2個數據源(row

Fork/Join框架簡單介紹與使用

為了偷個懶,我就直接將我自己寫程式的註釋拿過來貼上去了。 /**  * @author   * Fork/join框架是Java7提供的一個用於並行任務執行的框架,將一個大任務分解為若干個小任務,再彙總每個小任務  * 通常我們使用fork/join框架,需先建立一個任務,

執行緒(九)join方法的簡單介紹

1、join方法的實現原理: join方法原理就是利用執行緒的wait方法等待操作: A執行緒中呼叫了B執行緒的join方法,則相當於在A執行緒中呼叫了B執行緒的wait方法,當B執行緒執行完(或者

Hive中join, outer join, semi join區別

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 最常用的就是多表關聯查詢,主要講解下join、outer join和semi join的具體使用。

Left join right join inner join outer join

  假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:讓我們看看不同JOIN的不同 A表 id name

圖解SQL的各種連線(Inner join,outer join,left join,right join)

      由於 SQL Join 似乎被預設為基礎,同時利用 ‘文氏圖表’ 解釋它,乍一看似乎是很自然的選擇。然而,就像文章下面說的,我也發現在實際測試中,文氏圖並沒有完全符合SQL Join

14 外連線(hash join outer)--優化主題系列

外連線在分頁語句中有些特殊情況是無法優化的 left outer join與leftjoin等價 外連線(outerjoin) 外連線有三種,leftouter join,right outer j

mysql中left join,right join,inner join,outer join的用法詳解【轉】

非常慚愧用了這麼久的mysql居然沒有用過outer join和inner join,對outer join的認識也僅是知道它是外連結,至於什麼用途都不清楚,至於還有沒有left outer join更是不得而知,某天有人問起,才想起自己mysql知識的貧乏,趕緊找了一下網上

16 反連線(anti-join)--優化主題系列

反連線(anti-join) 反連線其實是特殊的半連線。只是把in/exists換成了notin/not exists 執行計劃中,看到有NESTED LOOPS ANTI/HASH JOIN AN

MYSQL的各種連線(Inner join,outer join,left join,right join)

H. cross join表A和表B的資料進行一個N*M的組合,即笛卡爾積(交差集)。一般來說,我們很少用到這個語法。因為這種集合的使用對於效能來說非常危險,尤其是表很大。這裡就不做介紹了…例外的例子:一.先看一些最簡單的例子例子Table Aaid   adate 1      a1 2      a2 3

mysql中left join,right join,inner join,outer join 用法詳解

非常慚愧用了這麼久的mysql居然沒有用過outer join和inner join,對outer join的認識也僅是知道它是外連結,至於什麼用途都不清楚,至於還有沒有left outer join更是不得而知,某天有人問起,才想起自己mysql知識的貧乏,趕緊找了一下網上的left join,righ

mysql left join中where和on條件的區別

行記錄 影響 知識 區別 where 相同 beijing 兩張 滿足 left join中關於where和on條件的幾個知識點: 1.多表left join是會生成一張臨時表,並返回給用戶 2.where條件是針對最後生成的這張臨時表進行過濾,過濾掉不符

Python中join函數和os.path.join用法

post () 參數說明 python class log join 絕對路徑 返回 Python中有join和os.path.join()兩個函數,具體作用如下: join:連接字符串數組。將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個新的字符串 os.p

python中的join( ),os.sep , os.path.join()函式

1、在 Windows 上,檔案的路徑分割符號是 ‘’ ,在 Linux 上 是 ‘/’使用 os.sep 的話,你就不用去考慮 join( ) list = [‘hello’,‘world’] pri

多執行緒中sleep() wait() yield() join(), interrupt(),stop(),suspend()用法與區別

網上卻是有很多的關於這個的答案,但是都長得一樣,為了寫這篇部落格,自己找了幾個例子。 JoinThread: package com.com.aaa.threadJoinDemo; public c

SQL語句Left join 中On和Where的用法區別

如果SQL用的是Left Join ,On後面的條件對Left的表沒有作用,只對Right的表有過濾作用,Where語句可以對Left的表有過濾作用 如果SQL用的是Right Join ,On後面的條件對Right的表沒有作用,只對Left的表有過濾作用,Where

SQL優化--使用內連線(inner join)代替外連線(left join,right join)

避免 LEFT JOIN 和 NULL        當然,有很多時候您需要執行 LEFT JOIN 和使用 NULL 值。但是,它們並不適用於所有情況。改變 SQL 查詢的構建方式可能會產生將一個花幾分鐘執行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調

Nested Loops Join(巢狀連線) ,優化inner join的查詢速度

說明:最近找到了一個不錯的國外的部落格http://blogs.msdn.com/b/craigfr/,博主是Sql Server的開發人員,寫了很多Sql Server的內部原理性的文章,覺得非常有收穫。所以試著把他翻譯成中文,因為本人的英語和技術水平有限,難免會有錯誤,還請各位看官批評指教。 Nest

java進階 執行緒池 join用法總結:thread4.join();方法,就表明thread4.join();這個執行緒受到貴客待遇,直到這個執行緒執行完,被插入這個方法的載體執行緒才可以執行。

那個執行緒呼叫join 舉例 thread4.join();方法,就表明thread4.join();這個執行緒受到貴客待遇,直到這個執行緒執行完,被插入這個方法的載體執行緒才可以執行。 package javajinjie.char29.threadpool; pu

oracle join(比較全面的解釋了join)

1、概述 1.1、所有的join連線,都可以加上類似where a.id='1000'的條件,達到同樣的效果。 1.2、除了cross join不可以加on外,其它join連線都必須加上on關鍵字,後都可加where條件。 1.3、雖然都可以加where條件,但是他們只在標準連線的結果集上查詢where條件