【sql】exists的用法,exists與in的區別

一直以來很少用exists,以爲和in用法一樣,最近一看才發現,that is not the case!

exists用法

強調的是子查詢是否有返回集,不需知道具體返回的是什麼,如果有就顯示主查詢的內容,沒有就不顯示。

因此,子查詢中select *和select 任意字段 效果是一樣的,如下:

SELECT * FROM customer c WHERE NOT EXISTS (SELECT cg.date FROM customer_goods cg WHERE c.id =1)  
SELECT * FROM customer c WHERE NOT EXISTS (SELECT * FROM customer_goods cg WHERE c.id =1)

當然這裏分爲兩種情況:一種是子查詢和主查詢有關聯,就是子查詢的where用到了主查詢的字段,這種情況先把主表查出來,然後循環主表的每一行,複製到子查詢的字段即可。另一情況是子查詢和沒有用到主查詢的表,這種就直接返回true就可以了。

參考資料:https://blog.csdn.net/zhangsify/article/details/71937745

in和exists區別

in是先查詢子表,然後內外表做迪卡爾積,篩選。 子查詢返回類型是結果集。——用於判斷某字段是否包含着子查詢中

exists是先查外表,loop循環外表每一行,去內表判斷。子查詢返回類型是boolean。——用於判斷是否有返回集

子表小有索引用in,主表大、有索引用exists。

參考資料:https://www.cnblogs.com/liyasong/p/sql_in_exists.html


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