MySQL七種join詳解


MySQL七種join詳解

關系數據庫的join理論

在關系型數據庫中,要進行多表查詢,一般都會使用join連接。join連接的本質其實類似與集合的交並操作,常見的join連接如下圖。

下面先對join連接的原理進行分析,只有在理解了join的原理才能更透徹的明白這其中join的過程,以及如何mysql如何高效的進行join操作。

Join算法原理

MySQL的join算法原理基於嵌套循環查詢。但是由於簡單的嵌套循環查詢存在效率低下,頻繁與磁盤進行I/O的問題,故MySQL會分別從減少內層循環次數,以及減少I/O次數兩個層面對join的簡單嵌套循環查詢進行優化。

從本質上來說,MySQL的join算法基於簡單嵌套循環查詢,即外層表的記錄作為條件,循環遍歷內層表進行查詢,返回內層循環中滿足條件的記錄。對於SQL語句: select * from c left join b on c.id=b.id。

 

for(i from 外層表){
for(j from 內層表){
  if(i.id = j.id){
      return;
}
}
}

但是簡單的嵌套循環查詢效率比較低,本質上是因為每次查詢時都是從外層表取出一次記錄,即進行一個I/O,並且對內層表的查詢是全表掃描,故可以從這兩個角度對簡單嵌套循環查詢進行優化。

內層循環的查詢可以通過索引進行優化,通過索引進行查找的次數只為索引B樹的高度。這就是索引嵌套循環連接。對於上述的SQL語句:select * from c left join b on c.id=b.id,如果在b表對id字段建立了索引,則外層的循環查詢在內層循環中會使用到索引,從而減少了查詢的次數。

另外一種優化的方法就是從優化I/O的角度,每次取外層表的多條記錄進行緩存,多條記錄同時在內層循環中進行查找。

 

七種Join的詳解

為了更好的展示下面的例子,下面有兩個測試表。

左連接

左連接將左表作為主表,右表作為從表,左表作為外層循環,在右表中進行匹配,如果左表的記錄在右表中沒有匹配,則將該左表記錄的右表項補空值。

該圖示用MySQL實現為: select * from class c left join book b on c.id=b.cid;

右連接

右連接將右表作為主表,左表作為從表,右表作為外層循環,在左表中進行匹配,如果右表的記錄在左表中沒有匹配,則將該右表記錄的左表項補空值。

 

該圖示用MySQL實現為:select * from class c right join book b on b.cid=b.id;

內連接

內連接將左表和右表對於條件相匹配的項進行組合,在結果中只會出現同時在左表和右表出現的項。

該圖示用MySQL實現為:select * from class c inner join book b on c.id=b.cid;

左外連接

左外連接選擇將左表作為主表,右表作為從表,循環遍歷右表,查找與條件滿足的項,如果在右表中沒有匹配的項,則補空值,並且在結果集中選擇只在左表中存在的數據。

該圖示用MySQL實現為:select * from class c left join book b on c.id=b.cid where b.cid is null;

右外連接

右外連接選擇將右表作為主表,左表作為從表,循環遍歷左表,查找與join條件滿足的項,如果在左表中沒有匹配的項,則補空值,並且在結果集中選擇只在右表中存在的數據。

該圖示用MySQL實現為:select * from class c right join book b on b.cid=c.id where c.id is null;

全連接

全外連接將左表和右表的所有記錄進行匹配,如果在另外表項中不存在記錄,則補空值。

該圖示用MySQL實現為:select * from class c left join book b on c.id=b.cid

union

select * from class c right join book b on b.cid=c.id;

全外連接

全外連接將全連接中左右表相交的部分排除。

該圖示用MySQL實現為:select * from class c left join book b on c.id=b.cid where b.cid is null

union

select * from class c right join book b on b.cid=c.id where c.id is null;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM