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適合內外表都很大的狀況
使用示例
SELECT ID,NAME FROM A WHERE
EXISTS(SELECT * FROM B WHERE A.ID = B.AID)
複製代碼
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
複製代碼
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:
- exists和not exists返回的結果類型是Boolean:
- 若是子查詢包含行:
- exists返回TRUE
- not exists返回FALSE
> 萌新小號主在線求關注同名公衆號!分享技術乾貨,面試題和攻城獅故事。 > 您的關注支持是我持續進步的最大動力!一塊兒學習,共同進步。 > ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210318150145673.jpg#pic_center)