日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库:SQLServer中in和 exists函数用法笔记

發布時間:2023/12/10 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库:SQLServer中in和 exists函数用法笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天給大家分享一下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及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

總結

以上是生活随笔為你收集整理的数据库:SQLServer中in和 exists函数用法笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。