關(guān)于連接查詢的執(zhí)行,寫在前面:
連接查詢是先生成表記錄的笛卡爾積,然后在通過(guò)on, where 和 having條件實(shí)現(xiàn)記錄的過(guò)濾. on條件對(duì)笛卡爾集合
進(jìn)行過(guò)濾, 然后將結(jié)果放到一個(gè)臨時(shí)表, where條件再對(duì)臨時(shí)表
中的記錄進(jìn)行過(guò)濾, having再對(duì)where過(guò)濾的結(jié)果
進(jìn)行過(guò)濾
關(guān)于on條件和where條件:
- on條件: 是生成臨時(shí)表使用的條件, 它不管on中的條件是否為真, 都會(huì)返回左/右表中的記錄
- where條件: 是在臨時(shí)表生成之后, 在對(duì)臨時(shí)表進(jìn)行過(guò)濾的條件, 這時(shí)已經(jīng)沒(méi)有l(wèi)eft join / right join 的含義.
關(guān)于左連接和右連接總結(jié)性的一句話:
左連接where只影向右表鳖擒,右連接where只影響左表随闽。
Left Join
select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID
左連接后的檢索結(jié)果是顯示tbl1的所有數(shù)據(jù)和tbl2中滿足where 條件的數(shù)據(jù)
簡(jiǎn)言之 Left Join影響到的是右邊的表
Right Join
select * from tbl1 Right Join tbl2 where tbl1.ID = tbl2.ID
檢索結(jié)果是tbl2的所有數(shù)據(jù)和tbl1中滿足where 條件的數(shù)據(jù)。
簡(jiǎn)言之 Right Join影響到的是左邊的表馍忽。
inner join
select * FROM tbl1 INNER JOIN tbl2 ON tbl1.ID = tbl2.ID
功能和 select * from tbl1,tbl2 where tbl1.id=tbl2.id相同扮念。
其他相關(guān)資料
WHERE子句中使用的連接語(yǔ)句九榔,在數(shù)據(jù)庫(kù)語(yǔ)言中芳室,被稱為隱性連接。INNER JOIN……ON子句產(chǎn)生的連接稱為顯性連接呈枉。(其他JOIN參數(shù)也是顯性連接)WHERE 和INNER JOIN產(chǎn)生的連接關(guān)系趁尼,沒(méi)有本質(zhì)區(qū)別,結(jié)果也一樣猖辫。但是酥泞!隱性連接隨著數(shù)據(jù)庫(kù)語(yǔ)言的規(guī)范和發(fā)展,已經(jīng)逐漸被淘汰啃憎,比較新的數(shù)據(jù)庫(kù)語(yǔ)言基本上已經(jīng)拋棄了隱性連接芝囤,全部采用顯性連接了。
無(wú)論怎么連接辛萍,都可以用join子句悯姊,但是連接同一個(gè)表的時(shí)候,注意要定義別名贩毕,否則產(chǎn)生錯(cuò)誤悯许!
a. inner join:理解為“有效連接”,兩張表中都有的數(shù)據(jù)才會(huì)顯示left join:理解為“有左顯示”辉阶,比如on a.field=b.field先壕,則顯示a表中存在的全部數(shù)據(jù)及a\b中都有的數(shù)據(jù),A中有谆甜、B沒(méi)有的數(shù)據(jù)以null顯示
b. right join:理解為“有右顯示”垃僚,比如on a.field=b.field,則顯示B表中存在的全部數(shù)據(jù)及a\b中都有的數(shù)據(jù)规辱,B中有谆棺、A沒(méi)有的數(shù)據(jù)以null顯示
c. full join:理解為“全連接”,兩張表中所有數(shù)據(jù)都顯示罕袋,實(shí)際就是inner +(left-inner)+(right-inner)
join可以分主次表 外聯(lián)接有三種類型:完全外聯(lián)改淑,左聯(lián),右聯(lián).完全外聯(lián)包含兩張表的所有記錄.左聯(lián)是以左邊的表為主炫贤,右邊的為輔溅固,右聯(lián)則相反
一般要使得數(shù)據(jù)庫(kù)查詢語(yǔ)句性能好點(diǎn)遵循一下原則:
在做表與表的連接查詢時(shí)付秕,大表在前兰珍,小表后
在不使用表別名,通過(guò)字段前綴區(qū)分不同表中的字段
查詢條件中的限制條件要寫在表連接條件前盡量使用索引的字段做為查詢條件