解釋與比較:
in 語句:
只執行一次,確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內錶和外表做乙個笛卡爾積(翻譯:笛卡爾乘積是指在數學中,兩個
集合x和y的笛卡尓積(cartesian product),又稱
直積,表示為x × y,第乙個物件是x的成員而第二個物件是y的所有可能
有序對的其中乙個成員。),然後按照條件進行篩選。所以相對內錶比較小的時候,in的速度較快。
例:select a.* from dual a where a.dummy in (select b.dummy from dual b);
執行流程:
首先會執行from語句找出dual表中的資料,然後執行 in 裡面的子查詢,再然後將查詢到的結果和原有的dual表做乙個笛卡爾積,再根據我們的a.dummy in b.dummy 的條件,將結果進行篩選(既比較dummy 列的值是否相等,將不相等的刪除)。最後,得到符合條件的資料。
exists語句:
執行dual.length次,指定乙個子查詢,檢測行的存在。遍歷迴圈外表,然後看外表中的記錄有沒有和內錶的資料一樣的。匹配上就將結果放入結果集中。
例:select a.* from dual a where exists (select * from dual b where a.dummy = b.dummy);
執行流程:
首先,我們先查詢的不是子查詢的內容,而是查我們的主查詢的表(select a.* from dual),然後,根據表的每一條記錄,執行以下語句(exists (select * from dual b where a.dummy = b.dummy)),依次去判斷where後面的條件是否成立,如果成立則返回true不成立則返回false。如果返回的是true的話,則該行結果保留,如果返回的是false的話,則刪除該行,最後將得到的結果返回。
in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外in時不對null進行處理。
in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。
leetcode 自由之路
leetcode每日一題 這應該就是個廣度優先搜尋的實現,具體操作方法就是每次找到下一步的能到達的所有點,因為有重合,可以篩選一部分 我可能寫的比較亂,也可能有其他解決方法,但是我有點懶了 public intfindrotatesteps string ring,string key 開始遍歷ke...
《財務自由之路》
古老的格言自有其道理 所有的傻瓜都生活在希望和等待之 中。你的財務狀況對於建立自信極為重要。你的財務狀況應該成為乙個你不懼怕任何阻礙的證明。你不能讓自己的財務狀況破壞你的自信程度。沒有自信的生活只能 叫作生存。你永遠都不會知道自己的潛能。你從不冒險,從不成長,從 不應對處境做出反抗,從不充分開發自己...
514 自由之路
最初,ring 的第乙個字元與12 00方向對齊。您需要順時針或逆時針旋轉 ring 以使 key 的乙個字元在 12 00 方向對齊,然後按下中心按鈕,以此逐個拼寫完 key 中的所有字元。旋轉 ring 拼出 key 字元 key i 的階段中 您可以將 ring 順時針或逆時針旋轉乙個位置,計...