溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于exists 的使用

發(fā)布時間:2020-06-18 06:56:23 來源:網(wǎng)絡(luò) 閱讀:517 作者:堅持30天 欄目:數(shù)據(jù)庫

1、exists 字面意思存在。 

  EXISTS里的子查詢結(jié)果集非空,EXISTS()子句的值就是true。 
  EXISTS里的子查詢結(jié)果集為空,EXISTS()子句的值就是false。 

  SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT SYSDATE FROM DUAL); 
  此句將查出scott.emp表所有內(nèi)容. 

  SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT * FROM scott.salgrade where 1=2) ; 
  返回空結(jié)果集 


   參考一下論述: 
   帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。 
   使用存在量詞EXISTS后,若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回真值否則返回假值。 
   由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,因為帶EXISTS的子查詢只返回真值或假值, 
   給出列名無實際意義。 



2、用exists的相關(guān)子查詢 
     
      明白相關(guān)子查詢: 
      子查詢的查詢條件依賴于外層父查詢的某個屬性值,稱這類查詢?yōu)橄嚓P(guān)子查詢。 
      求解相關(guān)子查詢不能像求解不相關(guān)子查詢那樣,一次將子查詢求解出來,然后求解父查詢。 
      內(nèi)層查詢由于與外層查詢有關(guān),因此必須反復(fù)求值。 
       
       弄清相關(guān)子查詢處理過程: 
       從概念上講,相關(guān)查詢的一般處理過程是: 
       首先去外層查詢中表的第1個元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢, 
       若WHERE子句返回值為真,則取此元組放入結(jié)果表;然后再取表的下一個元組; 
       重復(fù)這個過程直到外層表全部檢查完為止。 




  SQL> select a.ENAME  from  scott.emp a 
            where exists(select * from  scott.dept b where b.deptno=a.deptno); 

  ENAME 
  ---------- 
  SMITH 
  ALLEN 
  WARD 
  JONES 
  MARTIN 
  BLAKE 
  CLARK 
  SCOTT 
  KING 
  TURNER 
  ADAMS 
  JAMES 
  FORD 
  MILLER 

  查詢到14記錄. 


  相當(dāng)于下sql: 
  select a.ENAME  from  scott.emp a 
   where a.deptno in (select b.deptno  from  scott.dept b ); 


exists子查詢實際是通過關(guān)聯(lián)別的表安某種條件縮小主查詢的范圍。 



3、not exists    簡單的理解就是 not exists= not in 
      實際not  exists  取得是不屬于exists限制條件的主表的數(shù)據(jù)集  



SQL>  select a.ENAME  from  scott.emp a 
             where exists(select * from  scott.dept b where b.deptno=a.deptno and b.deptno=10); 

ENAME 
---------- 
CLARK 
KING 
MILLER 


     select a.ENAME  from  scott.emp a 
      where not exists(select * from  scott.dept b where b.deptno=a.deptno and b.deptno=10) 

  ENAME 
  ---------- 
  SMITH 
  ALLEN 
  WARD 
  JONES 
  MARTIN 
  BLAKE 
  SCOTT 
  TURNER 
  ADAMS 
  JAMES 
  FORD 

  查詢到11記錄. 





4 、exists和in 

      in子句通常用在不相關(guān)子查詢中。通常先執(zhí)行子查詢,將子查詢的結(jié)構(gòu)用于父查詢。 
      子查詢的查詢條件不依賴于父查詢,這類子查詢稱為不相關(guān)子查詢。 
      
      關(guān)鍵字: 在Oracle SQL中取數(shù)據(jù)時in 和 exists 的區(qū)別? 
  在Oracle SQL中取數(shù)據(jù)時有時要用到in 和 exists 那么他們有什么區(qū)別呢? 

  1 性能上的比較 
  比如Select * from T1 where x in ( select y from T2 ) 
  執(zhí)行的過程相當(dāng)于: 
  select * 
    from t1, ( select distinct y from t2 ) t2 
  where t1.x = t2.y; 

  相對的 

  select * from t1 where exists ( select null from t2 where y = x ) 
  執(zhí)行的過程相當(dāng)于: 
  for x in ( select * from t1 ) 
     loop 
        if ( exists ( select null from t2 where y = x.x ) ) 
        then 
    OUTPUT THE RECORD 
        end if 
  end loop 
  表 T1 不可避免的要被完全掃描一遍 

  分別適用在什么情況? 
  以子查詢 ( select y from T2 )為考慮方向,如果子查詢的結(jié)果集很大需要消耗很多時間, 
  但是T1比較小執(zhí)行( select null from t2 where y = x.x )非???,那么exists就比較適合用在這里。 
  相對應(yīng)得子查詢的結(jié)果集比較小的時候就應(yīng)該使用in. 

   



5、問題: 我創(chuàng)建了一個表來存放客戶信息,我知道可以用 insert 語句插入信息到表中, 
                   但是怎么樣才能保證不會插入重復(fù)的記錄呢? 

  答案: 可以通過使用 EXISTS 條件句防止插入重復(fù)記錄。 


  示例一:插入多條記錄 

  假設(shè)有一個主鍵為 client_id 的 clients 表,可以使用下面的語句: 




  INSERT INTO clients 
  (client_id, client_name, client_type) 
  SELECT supplier_id, supplier_name, 'advertising' 
  FROM suppliers 
  WHERE not exists (select * from clients 
  where clients.client_id = suppliers.supplier_id); 


               個人批注:not exists不存在,也就是說后面的括號中只要返回了數(shù)據(jù)那么這個條件就不存在了, 
        可以理解為括號前的notexists是一個左表達(dá)式 ,括號后的查詢是一個右表達(dá)式, 
        只有當(dāng)右表達(dá)式返回的也是not exists(即后面的查詢出來的結(jié)果是非空的)時,等式才成立。 






  示例一:插入單條記錄 

  Code: 


  INSERT INTO clients 
  (client_id, client_name, client_type) 
  SELECT 10345, 'IBM', 'advertising' 
  FROM dual 
  WHERE not exists (select * from clients 
  where clients.client_id = 10345); 


  使用 dual 做表名可以讓你在 select 語句后面直接跟上要插入字段的值,即使這些值還不存在當(dāng)前表中。 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI