<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] # 連接 數據庫中的連接語句用于將數據庫中的兩個或多個表根據連接條件組合起來。由"連接"生成的集合, 可以被保存為表, 或者當成表來使用。連接語句的含義是把兩張表的屬性通過它們的值組合在一起。數據庫中的連接類型一般包括inner join,outer join,semi-join和anti-join。其中Semi-join和Anti-join都是通過子查詢改寫得到,SQL本身并沒有表述Anti-join和Semi-join的語法 ## 連接條件 連接條件可以分為等值連接(比如t1.a = t2.b)和非等值連接(t1.a < t2.b)。相比于非等值連接條件, 等值連接條件的一個好處是允許數據庫中使用高效的連接算法,比如Hash Join和Merge-Sort join。 ## Self-join Self-Join是指跟跟自己表做連接的join。下圖展示了一個self join的例子。 ~~~ OceanBase (root@test)> create table t1(a int primary key, b int, c int); Query OK, 0 rows affected (0.70 sec) ---一個self join的例子 OceanBase (root@test)> select * from t1 as ta, t1 as tb where ta.b = tb.b ~~~ ## 內連接(inner join) Inner Join(內連接)是數據庫中最基本的連接操作。內連接基于連接條件將兩張表(如 A 和 B)的列組合在一起,產生新的結果表。查詢會將 A 表的每一行和 B 表的每一行進行比較,并找出滿足連接條件的組合。當連接條件被滿足,A 和 B 中匹配的行會按列組合(并排組合)成結果集中的一行。連接產生的結果集,可以定義為首先對兩張表做笛卡爾積(交叉連接) -- 將 A 中的每一行和 B 中的每一行組合,然后返回滿足連接條件的記錄。 ## 外連接(outer join) Outer Join(外連接)并不要求連接的兩表的每一條記錄在對方表中都一條匹配的記錄。要保留所有記錄(甚至這條記錄沒有匹配的記錄也要保留)的表稱為保留表**。**外連接可依據連接表保留左表, 右表或全部表的行而進一步分為左外連接, 右外連接和全連接。其中左外連接中左表的一行未在右表中找到的時候,就在右表自動填充NULL。右外連接中右表的一行未在左表中找到的時候,就在左表自動填充NULL。全連接就是左表或者右表找不匹配行的時候都會自動填充。 ## Semi連接 (semi-join) 當A表和B表進行left/right semi-join的時候,它只返回A/B表中所有能夠在B/A中找到匹配的行。Semi-join只能通過子查詢展開得到,如下圖所示。 ~~~ OceanBase (root@test)> create table t1(a int primary key, b int, c int); Query OK, 0 rows affected (0.70 sec) OceanBase (root@test)> create table t2(a int primary key, b int, c int); Query OK, 0 rows affected (0.92 sec) --- 有依賴關系的子查詢被展開改寫成Semi-join OceanBase (root@test)> explain select * from t1 where t1.a in (select t2.b from t2 where t2.c = t1.c); | ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST| --------------------------------------- |0 |HASH SEMI JOIN| |1 |2924| |1 | TABLE SCAN |t1 |1000 |455 | |2 | TABLE SCAN |t2 |1000 |455 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter(nil), equal_conds([t1.a = t2.b], [t2.c = t1.c]), other_conds(nil) 1 - output([t1.c], [t1.a], [t1.b]), filter(nil), access([t1.c], [t1.a], [t1.b]), partitions(p0) 2 - output([t2.c], [t2.b]), filter(nil), access([t2.c], [t2.b]), partitions(p0) ~~~ ## Anti-連接(anti-join) 當A表和B表進行left/right anti-join的時候,它只返回A/B中所有不能再B/A中找到匹配的行。類似于Semi-join, anti-join也只能通過子查詢展開得到,如下圖所示。 ~~~ OceanBase (root@test)> create table t1(a int primary key, b int, c int); Query OK, 0 rows affected (0.70 sec) OceanBase (root@test)> create table t2(a int primary key, b int, c int); Query OK, 0 rows affected (0.92 sec) ---有依賴關系的子查詢被改寫成Anti-join OceanBase (root@test)> explain select * from t1 where t1.a not in (select t2.b from t2 where t2.c = t1.c); | ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST| --------------------------------------- |0 |HASH ANTI JOIN| |995 |3262| |1 | TABLE SCAN |t1 |1000 |455 | |2 | TABLE SCAN |t2 |1000 |455 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter(nil), equal_conds([t2.c = t1.c]), other_conds([t1.a = t2.b OR (T_OP_IS, t2.b, NULL, 0)]) 1 - output([t1.c], [t1.a], [t1.b]), filter(nil), access([t1.c], [t1.a], [t1.b]), partitions(p0) 2 - output([t2.c], [t2.b]), filter(nil), access([t2.c], [t2.b]), partitions(p0) ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看