<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] # 概述 查詢(SQL)是指數據庫中用來獲取數據的方式,它可搭配條件限制的子句(如where),排列順序的子句(如order by)等語句來獲取查詢結果。子查詢是指嵌套在一個上層查詢中的查詢。上層的查詢一般被稱為父查詢或外層查詢。子查詢的結果作為輸入傳遞回“父查詢”或“外部查詢”。父查詢將這個值結合到計算中,以便確定最后的輸出。SQL語言允許多層嵌套查詢,即一個子查詢中還可以嵌套其他子查詢。同時,子查詢可以出現在SQL語句中的各種子句中,比如select語句,from語句,where語句等。 ## 子查詢 在數據庫中,子查詢可以分成有依賴關系的子查詢和沒有依賴關系的子查詢。有依賴關系的子查詢是指該子查詢的執行依賴了外部查詢的'變量',所以這種子查詢通常會被計算多次。沒有依賴關系的子查詢是指該子查詢的執行不依賴外部查詢的'變量', 這種子查詢一般只需要計算一次。下圖分別展示了一個沒有依賴關系的子查詢和一個有依賴關系的子查詢。 ~~~ 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) -- 沒有依賴關系的子查詢 OceanBase (root@test)> select * from t1 where t1.a in (select t2.a from t2); Empty set (0.22 sec) -- 有依賴關系的子查詢,子查詢中用到了外層查詢變量t1.b OceanBase (root@test)> select * from t1 where t1.a in (select t2.a from t2 where t2.b = t1.b); Empty set (0.05 sec) ~~~ ## 子查詢展開(subquery unnesting) 子查詢展開是數據庫的一種優化策略,它把一些子查詢置于外層的父查詢中,其實質是把某些子查詢轉化為等價的多表連接操作。這種策略帶來的一個明顯的好處就是,有寫訪問路徑,連接方法和連接順序可能被有效的利用,使得查詢語句的層次盡可能的減少。下圖展示了一個子查詢展開的例子,既子查詢被改寫成了連接語句。 ~~~ 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) --- 有依賴關系的子查詢被展開改寫成連接 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) ~~~
                  <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>

                              哎呀哎呀视频在线观看