今天給大家分享一下SQLServer中in和 exists 用法,希望能對大家有所幫助。
一、IN 用法
確定指定的值是否與子查詢或列表中的數據相匹配。
1.1 語法格式
test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )
1.2 參數說明
test_expression
為任意有效的SQL表達式。
subquery
包含某字段結果集的子查詢。?該字段必須與 test_expression 具有相同的數據類型。
expression[ ,... n ]
表達式列表,用來測試是否匹配。?所有的表達式必須與 test_expression 具有相同的類型**。
注意:在 IN 子句的括號中顯式包括數量非常多的值(數以千計,以逗號分隔)可能會消耗資源并返回錯誤 8623 或 8632。?若要解決這一問題,可以將這些項存儲于某個表的 IN 列表中,然后在 IN 子句中使用 SELECT 嵌套查詢。
1.3 用法示例:
select * from t_user where name in ('aaa','bbb','ccc');
Select name from students where studentId
not in(select stuid from studentScore where score>90);
二、EXISTS 用法
2.1 語法:EXISTS subquery
參數:subquery 是一個受限制的的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。
結果類型:Boolean 如果子查詢包含行,則返回 TRUE ,否則返回 FLASE
2.2 示例:
-- null 返回全表
select * from T_user where exists (select null);
等同于:select * from T_user
-- 常用寫法
select * from T_user where exists (select userid from score)
三、IN 和 EXISTS 區別
3.1 IN列子
select * from tb1 where id in(select id from tb2)
解釋:上面的查詢語句使用了in語句,in()只執行一次,它查出tb2表中的所有id字段并緩存起來.之后,檢查tb1表的id是否與tb2表中的id相等,如果相等則將A表的記錄加入結果集中,直到遍歷完tb1表的所有記錄.
轉換為編程語言如下:
List List=[];Array A=(select * from tb1);
Array B=(select id from tb2);
for(int i=0;i<A.length;i++) {
for(int j=0;j<B.length;j++) {
if(A[i].id==B[j].id)
{ List.add(A[i]); break; } }}return List;
如:tb1表有10000條記錄,tb2表有1000000條記錄,那么最多有可能遍歷10000*1000000次,效率很差.
再如:tb1表有10000條記錄,tb2表有100條記錄,那么最多有可能遍歷10000*100次,遍歷次數大大減少,效率大大提升.
結論:in()適合tb2表比tb1表數據小的情況
3.2 EXISTS例子
select a.* from A a where exists(select 1 from tb2
b where a.id=b.id)
以上查詢使用了exists語句,exists()會執行A.length次,它并不緩存exists()結果集,因為exists()結果集的內容并不重要,重要的是結果集中是否有記錄,如果有則返回true,沒有則返回false.
轉換為編程語言如下:
List List=[];Array A=(select * from tb1);
for(int i=0;i<A.length;i++)
{ if(exists(A[i].id) { //執行select 1 from tb2 b where b.id=a.id是否有記錄返回 List.add(A[i]); }
}
return List ;
當tb2表比tb1表數據多的時候,適合使用exists(),因為它沒有那么遍歷操作,只需要再執行一次查詢就行.
如:tb1表有10000條記錄,B表有1000000條記錄,那么exists()會執行10000次去判斷tb1表中的id是否與tb2表中的id相等.
如:tb1表有10000條記錄,B表有100000000條記錄,那么exists()還是執行10000次,因為它只執行tb1.length次,可見tb2表數據越多,越適合exists()發揮效果.
再如:tb1表有10000條記錄,tb2表有100條記錄,那么exists()還是執行10000次,還不如使用in()遍歷10000*100次,因為in()是在內存里遍歷比較,而exists()需要查詢數據庫,我們都知道查詢數據庫所消耗的性能更高,而內存比較很快.
結論:exists()適合tb2表比tb1表數據大的情況
總結:EXISTS與IN的使用效率的問題,通常情況下采用exists要比in效率高,但要看實際情況具體使用:IN適合于外表大而內表小的情況;EXISTS適合于外表小而內表大的情況。
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識