[SQL] exists的用法以及exists與in的區別?

新建一個customer表,customer表裏有8條數據。

select * from customer;---8條數據

新建一個customer1表,customer表裏有32條數據。

select * from customer1;---32條數據

以customer表爲主表,exists條件連接customer表查詢,耗時0.015s。

select * from customer where exists(select customer1.id from customer1 where customer1.id=customer.id)----0.015s

以customer表爲主表,in條件連接customer表查詢,耗時0.016s。

select * from customer where id in (select customer1.id from customer1)----0.016s

總結

in的查詢過程類似於以下過程:

//select * from A where A.id in(select id from B);
List resultSet=[];
Array A=(select * from A);
Array B=(select id from B);

for(int i=0;i<A.length;i++) {
   for(int j=0;j<B.length;j++) {
      if(A[i].id==B[j].id) {
         resultSet.add(A[i]);
         break;
      }
   }
}
return resultSet;

exists的查詢過程類似於以下過程:

//select * from A where exists(select B.id from B where B.id=A.id);
List resultSet=[];
Array A=(select * from A)

for(int i=0;i<A.length;i++) {
   if(exists(A[i].id) {    //執行select 1 from B b where b.id=a.id是否有記錄返回
       resultSet.add(A[i]);
   }
}
return resultSet;

總之:in()適合B表比A表數據小的情況,exists()適合B表比A表數據大的情況。當A表數據與B表數據一樣大時,in與exists效率差不多,可任選一個使用。

而且,EXISTS(包括 NOT EXISTS )子句的返回值是一個BOOL值。EXISTS內部有一個子查詢語句(SELECT ... FROM...),
我將其稱爲EXIST的內查詢語句。其內查詢語句返回一個結果集。EXISTS子句根據其內查詢語句的結果集空或者非空,返回一個布爾值。

參考自:https://www.cnblogs.com/clarke157/p/7912871.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章