使用exits和in查詢的結果都相同,但是其中執行的機制並不一樣。
舉例:返回參加考試的人
1.exits
select *
from people
where exists
(select 1
from test
where people.id=test.user_id)
;
這裡exits子查詢中 select 1 其實這個1可以是任何數字,因為在exits中返回的結果並不重要,重要的是此處用的是索引查詢,判斷是否有符合要求的結果,有的話返回true,沒有就返回false。
所以對於people表中的每乙個記錄都放到exits的子查詢中進行判斷。
注意在子查詢中不需要對每個test記錄進行掃瞄,而是直接進行where判斷
2.in
select *
from people
where id in
(select user_id
from test
);
在in後面的結果相當於是,先進行子查詢(沒有用到索引,而是全表掃瞄)獲得返回的結果集,然後在外面的查詢語句中通過where 判斷在結果集中是否有符合要求的。查詢的次數相當於是test的記錄個數✖️people的記錄個數。
所以exits的查詢效率比in高出很多,而且in的實際可以轉換成or所以不會使用id索引。
堆區和棧區的區別
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...
棧區和堆區的區別
一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到記憶體一會在棧上分配,一會又在堆上分配,那麼它們之間到底是怎麼的區別呢?為了說明這個問題,我們先來看一下記憶體內部的組織情況 從上圖可知,程式占用的記憶體被分了以下幾部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引...
棧區和堆區的區別
1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等,記憶體的分配是連續的,類似於平時我們所說的棧,如果還不清楚,那麼就把它想成陣列,它的記憶體分配是連續分配的,即,所分配的記憶體是在一塊連續的記憶體區域內 當我們宣告變數時,那麼編譯器會自動接著當前棧區的結尾來分配記憶體。...