您好,登錄后才能下訂單哦!
小編給大家分享一下mysql中如何實現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一般的情況下外連接如下a right join b on a.id=b.id 那么b一定要作為驅(qū)動表,原因在于只有b作為驅(qū)動表才能得到完整的結(jié)果集,如果a作為驅(qū)動,那么返回的結(jié)果集
可能不完整,但是在特殊的情況的,可能將外連接轉(zhuǎn)換為內(nèi)連接
考慮如下的情況
b
id name
1 g1
1 g2
2 g3
2 g4
a
id name
2 gname2
使用如下語句:
select b.id,a.id from
a right join b on a.id=b.id
where a.id=2;
先不考慮where a.id=1;
做外連接返回的值應該為
b.id a.id
1 null
1 null
2 2
2 2
現(xiàn)在來考慮a.id =2 ;
那么如果這樣過濾那么結(jié)果集合如下:
b.id a.id
2 2
2 2
這正是內(nèi)連接的得到的結(jié)果集,也就是說只要a.id 限定為一定固定的非空的值,內(nèi)連接出來的結(jié)構(gòu)集就能
完全的滿足謂詞條件過濾后得到結(jié)果的全部中間結(jié)果集,那么數(shù)據(jù)庫將會進行轉(zhuǎn)換。MYSQL ORACLE都是如此
mysql:
mysql> explain select b.id,a.id from a right join b on a.id=b.id where a.id =2;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+
| 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 4 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+
2 rows in set (0.00 sec)
a作為了驅(qū)動表
oracle:
SQL> select b.id from a right join b on a.id=b.id where a.id=2;
Execution Plan
----------------------------------------------------------
Plan hash value: 652036164
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 26 | 5 (20)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| A | 1 | 13 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| B | 2 | 26 | 2 (0)| 00:00:01 |
可以看到本該出現(xiàn)的 HASH JOIN OUTER 沒有出現(xiàn)。
但是如果將條件where a.id=2;改為where a.id is null;那么顯然這種轉(zhuǎn)換不合理,因為
內(nèi)連接出來的結(jié)果集已經(jīng)不能滿足 a.id is null;的要求。
為什么要這樣轉(zhuǎn)換,我們知道在做連接的時候不管是NEST LOOP和HASN JOIN都應該把小表
作為驅(qū)動表,效率一般更高,那么外連接限定死了順序可能大表做為驅(qū)動表,那么效率
顯然更低,如果做了內(nèi)連接的轉(zhuǎn)換那么選擇的順序就更多,效率可能得到提高,當然
這和統(tǒng)計數(shù)據(jù)的精準度有很大的關(guān)系。
以上是“mysql中如何實現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。