91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中如何實現外連接轉換為內連接

發布時間:2021-11-01 14:16:17 來源:億速云 閱讀:260 作者:小新 欄目:MySQL數據庫

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

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


  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

現在來考慮a.id =2 ;
那么如果這樣過濾那么結果集合如下:

b.id a.id
2     2
2     2

這正是內連接的得到的結果集,也就是說只要a.id 限定為一定固定的非空的值,內連接出來的結構集就能
完全的滿足謂詞條件過濾后得到結果的全部中間結果集,那么數據庫將會進行轉換。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作為了驅動表
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 |


可以看到本該出現的 HASH JOIN OUTER 沒有出現。

但是如果將條件where a.id=2;改為where a.id is null;那么顯然這種轉換不合理,因為
內連接出來的結果集已經不能滿足 a.id is null;的要求。

為什么要這樣轉換,我們知道在做連接的時候不管是NEST LOOP和HASN JOIN都應該把小表
作為驅動表,效率一般更高,那么外連接限定死了順序可能大表做為驅動表,那么效率
顯然更低,如果做了內連接的轉換那么選擇的順序就更多,效率可能得到提高,當然
這和統計數據的精準度有很大的關系。

以上是“mysql中如何實現外連接轉換為內連接”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

忻城县| 永兴县| 青州市| 井陉县| 商水县| 望城县| 长寿区| 富源县| 建湖县| 体育| 武穴市| 桐庐县| 大厂| 蓬溪县| 淮南市| 泸水县| 巢湖市| 崇州市| 洱源县| 临漳县| 南通市| 汝阳县| 韶关市| 土默特左旗| 东宁县| 武平县| 东兰县| 奉新县| 古田县| 邯郸市| 客服| 灵武市| 彰化县| 涪陵区| 兰溪市| 兴化市| 岚皋县| 定边县| 静安区| 内江市| 怀安县|