真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql中如何實(shí)現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接

小編給大家分享一下MySQL中如何實(shí)現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元平桂做網(wǎng)站,已為上家服務(wù),為平桂各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

一般的情況下外連接如下a right join b on a.id=b.id 那么b一定要作為驅(qū)動(dòng)表,原因在于只有b作為驅(qū)動(dòng)表才能得到完整的結(jié)果集,如果a作為驅(qū)動(dòng),那么返回的結(jié)果集
可能不完整,但是在特殊的情況的,可能將外連接轉(zhuǎn)換為內(nèi)連接
考慮如下的情況


  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;
做外連接返回的值應(yīng)該為
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ù)庫(kù)將會(huì)進(jìn)行轉(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ū)動(dòng)表
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)換不合理,因?yàn)?br/>內(nèi)連接出來的結(jié)果集已經(jīng)不能滿足 a.id is null;的要求。

為什么要這樣轉(zhuǎn)換,我們知道在做連接的時(shí)候不管是NEST LOOP和HASN JOIN都應(yīng)該把小表
作為驅(qū)動(dòng)表,效率一般更高,那么外連接限定死了順序可能大表做為驅(qū)動(dòng)表,那么效率
顯然更低,如果做了內(nèi)連接的轉(zhuǎn)換那么選擇的順序就更多,效率可能得到提高,當(dāng)然
這和統(tǒng)計(jì)數(shù)據(jù)的精準(zhǔn)度有很大的關(guān)系。

以上是“mysql中如何實(shí)現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)頁(yè)標(biāo)題:mysql中如何實(shí)現(xiàn)外連接轉(zhuǎn)換為內(nèi)連接
文章分享:http://weahome.cn/article/gciopd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部