關於 mysql 中的 select * from table_a,table_b 的問題

codefly發表於2019-03-04

最近接受公司同事原先負責的專案,在看程式碼的時候,看到了以下的sql語句:

select * from table_a,table_b where ….

剛開始看到的時候,只是感覺有點眼熟,好像之前在哪裡見到過,但是仔細想想,也說不出什麼所以然來。後來測試了一下,下面總結一下。

1:select * from table_a,table_b //不使用where條件的前提下

假設當前表table_a的資料如下:

table_a_id table_a_name table_a_info table_a_text table_a_desc
1 table_a_1 table_a_info_1 table_a_text_1 table_a_desc_1
2 table_a_2 table_a_info_2 table_a_text_2 table_a_desc_2

當前表table_b的資料如下:

table_b_id table_b_name table_b_info table_b_text table_b_desc
1 table_b_1 table_b_info_1 table_b_text_1 table_b_desc_1
2 table_b_2 table_b_info_2 table_b_text_2 table_b_desc_2
得到的結果如下:
table_a_id table_a_name table_a_info table_a_text table_a_desc table_b_id table_b_name table_b_info table_b_text table_b_desc
1 table_a_1 table_a_info_1 table_a_text_1 table_a_desc_1 1 table_b_1 table_b_info_1 table_b_text_1 table_b_desc_1
1 table_a_1 table_a_info_1 table_a_text_1 table_a_desc_1 2 table_b_2 table_b_info_2 table_b_text_2 table_b_desc_2
2 table_a_2 table_a_info_2 table_a_text_2 table_a_desc_2 1 table_b_1 table_b_info_1 table_b_text_1 table_b_desc_1
2 table_a_2 table_a_info_2 table_a_text_2 table_a_desc_2 2 table_b_2 table_b_info_2 table_b_text_2 table_b_desc_2
如果我們將sql語句修改為: select * from table_b,table_a,得到的結果如下:
table_b_id table_b_name table_b_info table_b_text table_b_desc table_a_id table_a_name table_a_info table_a_text table_a_desc
1 table_b_1 table_b_info_1 table_b_text_1 table_b_desc_1 1 table_a_1 table_a_info_1 table_a_text_1 table_a_desc_1
1 table_b_1 table_b_info_1 table_b_text_1 table_b_desc_1 2 table_a_2 table_a_info_2 table_a_text_2 table_a_desc_2
2 table_b_2 table_b_info_2 table_b_text_2 table_b_desc_2 1 table_a_1 table_a_info_1 table_a_text_1 table_a_desc_1
2 table_b_2 table_b_info_2 table_b_text_2 table_b_desc_2 2 table_a_2 table_a_info_2 table_a_text_2 table_a_desc_2
根據得到的結果可以推測出資料查詢的方式:在不使用where條件的前提之下,會以sql中from後面提到的第一張表為基準表,然後和from後面第二張表進行關聯的操作,因為sql中沒有where,on等關聯條件,那麼整體的關聯方式就是第一張表中的任意一條資料匹配第二張表中的所有資料,假設前表中有N條資料,L1個欄位,後表中有M條資料,L2個欄位,那麼使用上面的sql查詢將得到N*M條資料的結果集,結果集的列數為L1+L2。
下面來看一個極端的情況:
假設其中的一張表沒有資料,那麼將會得到一個空的結果集,仍然滿足上面的結論:假設前表中有N條資料,L1個欄位,後表中有M條資料,L2個欄位,那麼使用上面的sql查詢將得到N*M條資料的結果集(因為M或者N為0,那麼M*N=0),結果集的列數為L1+L2。假設我們使用3張表進行查詢,使用下面的sql語句:
select * from table_a,table_b,table_c ,得到的結論仍然一致,假設a表中有M條資料,b表中有N條資料,c表中有K條資料,將得到一個數量為M*N*K的結果集。
2:select * from table_a,table_b where 條件 //使用where條件的前提下
假設table_a的資料如下:
test_id test_name test_info
1 111 222
2 111 222
假設table_b的資料如下:
test_id test_name test_info
1 111 222
2 333 222
使用以下的sql進行查詢操作:select * from table_a,table_b where table_a.test_name =table_b.test_name,得到的結果集如下操作:
test_id test_name test_info
1 111 111
2 444 222
將上面的sql換為:select * from table_a inner join table_b on table_a.test_name = table_b.test_name,得到的結果集同上。
現在我們在加入一張table_c表,資料如下:
test_id test_name test_info test_id(1) test_name(1) test_info(1)
1 111 111 1 111 111
分別使用下面的sql語句進行查詢:

(1):select * from table_a,table_b,table_c where table_a.test_name = table_b.test_name and table_b.test_name =table_c.test_name

(2):select * from table_a inner join table_b on table_a.test_name = table_b.test_name inner join table_c on table_b.test_name = table_c.test_name
得到的結果集完全相同,也就是是說select * from 多張表 where 條件 和多表聯查中的內查詢是一樣的。

相關文章