最近接受公司同事原先負責的專案,在看程式碼的時候,看到了以下的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 條件 和多表聯查中的內查詢是一樣的。