MySQL學習筆記 什麼情況下會出現笛卡爾積

2021-10-04 09:46:04 字數 2172 閱讀 4404

在學習mysql的表連線時,笛卡爾積是必須知道的乙個概念。在沒有任何限制條件的情況下,兩表連線必然會形成笛卡爾積。

笛卡爾積

如果表1有m行a列,表2有n行b列,兩表無條件連線時會將兩表裡所有行兩兩組合到一起,所形成的表就有m*n行,a+b列。如果表1或表2的記錄數很多時,連線後會形成一張非常大的表,在這種大表裡查詢效率特別低,所以在資料庫查詢時,應盡量避免笛卡爾積的出現。

在hive的嚴格模式中,也專門限制了笛卡爾積。

這裡總結了什麼情況下可能產生笛卡爾積,以後在查詢中應該避免。

首先問個問題,常見的左連線查詢,是不是笛卡爾積。換個方式問,左連線中以左表為準,左表有m條記錄,連線後的結果集是不是一定能得到m條記錄?答案是不一定,也就是說,左連線查詢可能會產生笛卡爾積。

先附上結論:

連線查詢時,當連線on條件是非唯一欄位時,會出現笛卡爾積(區域性笛卡爾積);當連線on條件是唯一欄位時,則不會出現笛卡爾積。

證明如下:

會用到三張表,student、score、class,其中student表中sno欄位唯一,score無唯一字段,class表中classid欄位唯一,三張表如下所示:

1、 兩表直接連線

select * from student,class;

執行結果:

小結:兩表直接連線,形成了一張18行6列的表,產生了笛卡爾積。

2、 內連線唯一字段

select * from student join class on student.classid = class.classid;

執行結果:

小結:on後的連線條件是a表或b表的唯一字段,兩表內連線是兩表的交集,不是笛卡爾積。

3、 內連線非唯一字段

select * from student join score on student.sno = score.sno;

執行結果:

現象:出現了一對多的情況。

小結:on條件連線表中非唯一欄位時,結果集出現笛卡爾積(區域性笛卡爾積)

4、 左連線唯一字段

select * from student left join class on student.classid = class.classid;

執行結果:

現象:結果集為左邊表的記錄數。

小結:左連線在on條件為唯一欄位時,不會出現笛卡爾積。

5、 左連線非唯一字段

select * from student left join score on student.sno = score.sno;

執行結果:

現象:左表出現了重覆記錄

小結:左連線在on條件為非唯一欄位時,會出現區域性笛卡爾積。

mysql什麼情況下會觸發表鎖

在上面講到的併發事務處理帶來的問題中,更新丟失 通常是應該完全避免的。但防止更新丟失,並不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。髒讀 不可重複讀 和 幻讀 其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。資...

什麼情況下MySQL的索引會失效

在某些情況下我們會發現乙個問題,明明這個字段新增了索引,但是奇怪的是是查詢的時候索引並沒有生效,下面就這幾種索引失效的情況做以總結。假如我們建立了乙個 test表及相關索引。drop table ifexists test create table test id int 11 notnull au...

MySQL索引在什麼情況下會失效

索引的失效,會大大降低sql的執行效率,日常中又有哪些常見的情況會導致索引失效?對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 sele...