MyBatis中exists用法

MyBatis框架中的exists用法

exists用法

  • exists:
    • 如果括號內子查詢語句返回結果不爲空,說明where條件成立,就會執行主SQL語句
    • 如果括號內子查詢語句返回結果爲空,說明where條件不成立,就不會執行主SQL語句
  • not exists: 與exists相反
    • 如果括號內子查詢語句結果爲空,說明表示where條件成立,就會執行主SQL語句
    • 如果括號內子查詢語句結果不爲空,說明表示where條件不成立,就不會執行主SQL語句
      • exists與in的區別:
        • in只能返回一個字段值
        • exists強調是否返回結果集,不要求知道返回什麼,exists允許返回多個字段
      • exists的效率一般優於in:
        • 使用exists,Oracle首先會檢查主查詢,然後運行子查詢直到找到第一個匹配項
        • 使用in子查詢時,首先會執行子查詢,並將獲得的結果列表放在一個加了索引的臨時表中
      • exists的效率優於distinct:
        • 當提交一對多表信息查詢時,就可以避免在select中使用distinct
        • 因爲RDBMS核心模塊將在子查詢的條件一旦滿足後,立即返回結果,所以自帶去重.以下兩組SQL語句等價:
        SELECT distinct dept_no, dept_name from dept D, EMP E WHERE D.dept_no = E.dept_no;
        
        SELECT dept_no, dept_name from dept D WHERE EXISTS (SELECT 1 from emp E WHERE E.dept_no = D.dept_no);
        
      • exists適合外表的結果集小的情況
      • in適合內外表都很大的情況

使用示例

  • exists:
SELECT ID,NAME FROM A WHERE 
EXISTS(SELECT * FROM B WHERE A.ID = B.AID)
  • SQL語句分解:
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1) 
--->SELECT * FROM B WHERE B.AID=1有值返回TRUE所以有數據 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2) 
--->SELECT * FROM B WHERE B.AID=2有值返回TRUE所以有數據 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3) 
--->SELECT * FROM B WHERE B.AID=3無值返回TRUE所以沒有數據 
  • 上面SQL語句等價於:
SELECT id, name from A WHERE id in (select aid from B)

總結

  • SQL中in, not in, exists, not exists的區別:
    • in:
      • 確定給定的值是否與子查詢或者列表中的值匹配
      • in關鍵字選擇與列表中任意一個值匹配的行
      • in關鍵字之後的項目必須用逗號隔開,並且括在括號中
    • not in:
      • 通過not in關鍵字引入的子查詢也返回一列零值或更多值
    • exists:
      • 指定一個子查詢,檢測行的存在
      • 相當於兩個集合的交集
      • exists後面可以是整句的查詢語句 ,in後面只能是單列查詢語句
    • not exists:
      • 相當於兩個集合的差集
    • existsnot exists返回的結果類型是Boolean:
      • 如果子查詢包含行:
        • exists返回TRUE
        • not exists返回FALSE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章