麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

深入Oracle的left join中on和where的區(qū)別詳解

2024-08-29 13:56:02
字體:
供稿:網(wǎng)友

今天遇到一個求某月所有天數(shù)的統(tǒng)計結(jié)果,如果某日的結(jié)果是0也需要顯示出來,即:
日期交易次數(shù) 交易金額
2009-4-01110
2009-4-02220
2009-4-0300
2009-4-04550
....

一開始我用的左連接,用on做為兩表關(guān)聯(lián)條件,用where作為過濾條件,但是發(fā)現(xiàn)0的數(shù)據(jù)根本不顯示,后來把where關(guān)鍵字去掉,把過濾條件都放到on里,問題解決,網(wǎng)上一搜,找到了答案:
數(shù)據(jù)庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。

在使用left jion時,on和where條件的區(qū)別如下:
1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

假設(shè)有兩張表:

表1 tab1:
id size
1 10
2 20
3 30
表2 tab2:
size name
10 AAA
20 BBB
20 CCC

兩條SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')
第一條SQL的過程:
1、中間表
on條件:
tab1.size = tab2.size
tab1.id tab1.size tab2.sizetab2.name
11010AAA
22020BBB
22020CCC
330(null)(null)
2、再對中間表過濾
where 條件:
tab2.name='AAA'
tab1.idtab1.sizetab2.sizetab2.name
11010AAA

第二條SQL的過程:
1、中間表
on條件:
tab1.size = tab2.size and tab2.name='AAA'
(條件不為真也會返回左表中的記錄)
tab1.idtab1.sizetab2.sizetab2.name
11010AAA
220(null)(null)
330(null)(null)

其實以上結(jié)果的關(guān)鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有l(wèi)eft和right的特性的并集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結(jié)果集是相同的。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美三级一级 | 欧美日韩在线播放一区 | 98色视频| 国产精品成人一区二区三区吃奶 | 毛片福利 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 国产精品99一区二区 | 黄色大片高清 | 97视频 | 欧美黄色免费视频 | 天天都色视频 | 香蕉久草在线 | 北京一级毛片 | 久久精品小短片 | 操你逼 | 中文字幕一区2区 | 欧美精品成人一区二区在线观看 | 国产亚洲网 | 国产1区2区在线观看 | 国产成人精品一区在线播放 | 黄视频网站免费观看 | 欧美精品一区二区三区四区 | 国产成人精品一区在线播放 | 日日草夜夜 | 国产女厕一区二区三区在线视 | 成人在线观看一区二区 | 国产精品久久久久久久久久久久午夜 | 午夜精品久久久久久久爽 | 最近高清无吗免费看 | 国产精品欧美久久久久一区二区 | 欧美日韩亚州综合 | 国产一区二区三区四区在线 | 国产91在线播放九色 | 国产一区毛片 | 欧美黄色免费视频 | 精品成人av一区二区在线播放 | 在线小视频国产 | 久久精品re | 久久777国产线看观看精品 | 久色成人 | 久夜草|