當前位置:首頁 » 編程語言 » sqlserverexistsin

sqlserverexistsin

發布時間: 2024-04-24 13:23:13

『壹』 sql server 嵌套查詢語句中什麼時候用in,什麼時候又用exists!

sqlserver嵌套查詢語句中使用in或者exists的場景和原則如下:

  1. 如果查詢的兩個表大小相當,那麼用in和exists差別不大。兩者都可以使用。

  2. in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。所以當有多重循環,使用in更合適,效率越高。

  3. 如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。

    NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度。

『貳』 SQLSERVER璇鍙 in鍜宔xists鍝涓鏁堢巼楂樻湰浜烘祴璇曡瘉鏄

鐩稿悓搴撶粨鏋勪笅錛屽緢鏄庢樉 Exists鏁堢巼楂
in 鍦ㄥ瓧絎︿覆涓嬬殑鏁堢巼鏄寰堜綆鐨勶紝涓昏佸師鍥犳槸緔㈠紩
濡傛灉鏄疘NT鍨嬶紝鏈夌儲寮曠殑鎯呭喌錛屽熀鏈涓婃病澶澶у尯鍒
娌℃湁澶澶ф暟鎹鐨勬儏鍐碉紝鍩烘湰涓婁笉鐢ㄧ籂緇撹繖浜涗笢瑗

『叄』 SQLSERVER語句 in和exists哪個效率高本人測試證明

效率高低通常和需要的條件有關,比如數據量,索引的 創建與否
同等條件下,exists叫存在檢測,檢測到第一個存在的記錄就返回了
in可以理解為在。。。中。通常會進行全表掃描。
exists比in要性能高一些

『肆』 sql中in和exist語句的區別

兩者都能實現表功能查詢,主要區別如下:

1、適用表的類型不同。

in是子查詢為驅動表,外面的表為被驅動表,故適用於子查詢結果集小而外面的表結果集大的情況。

exists是外面的表位驅動表,子查詢裡面的表為被驅動表,故適用於外面的表結果集小而子查詢結果集大的情況。

2、子查詢關聯不同。

exists一般都是關聯子查詢。對於關聯子查詢,必須先執行外層查詢,接著對所有通過過濾條件的記錄,執行內層查詢。外層查詢和內層查詢相互依賴,因為外層查詢會把數據傳遞給內層查詢。

in則一般都是非關聯子查詢,非關聯子查詢則必須先完成內層查詢之後,外層查詢才能介入。

3、執行次數不同。

IN 語句:只執行一次,確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,in的速度較快。

EXISTS語句:執行次數根據表的長度而定。指定一個子查詢,檢測行的存在。遍歷循環外表,然後看外表中的記錄有沒有和內表的數據一樣的。匹配上就將結果放入結果集中。

『伍』 SqlServer中in和exists的區別效率問題

in和exists
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表梁或進行查詢。

如果兩個表中一個較小,一個是大表悄渣神,則子查詢表大的用exists,子查啟虧詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。

in 與 =的區別
select name from student where name in ('zhang','wang','li','zhao');與
select name from student where name='zhang' or name='li' or
name='wang' or name='zhao'
的結果是相同的。

『陸』 SQLSERVER語句 in和exists哪個效率高本人測試證明

例如下面兩個SQL語句蠢並

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 ) AND OrderNo NOT IN (
6 SELECT OrderNo
7 FROM KK_DeliveryinfoTmp )

上面SQL語句IN裡面有IN和NOT IN

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE ( AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 )
6 ) AND NOT EXISTS ( SELECT OrderNo
7 FROM KK_DeliveryinfoTmp
8 WHERE KK_DeliveryinfoTmp.OrderNo = SchelingProgram.OrderNo )

上面的SQL語句IN裡面又有NOT EXISTS

這樣的情況很難測試同等條件下IN語句和EXISTS語句的效率

還有一個非SARG運算符

在《SQLSERVER企業級平台管理實踐》的第424頁里提到:

SQLSERVER對篩選條件(search argument/SARG)的寫法有一定的建議

對於不使用SARG運算符的表達式,索引是沒有用的,SQLSERVER對它們很難使用比較優化的做法。非SARG運算符包括

NOT、<>、NOT EXISTS、NOT IN、NOT LIKE和內部函數,例如:Convert、Upper等咐爛

所以當您的表中有索引並且SQL語句包含非SARG運帶簡跡算符,那麼當測試SQL語句的執行時間的時候肯定相差很大,

因為有些SQL語句走索引,有些SQL語句不走索引

建表腳本

注意:兩個表中都有索引!!

CT_FuelingData表

1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_FuelingData] 腳本日期: 08/24/2013 11:00:34 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_FuelingData](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [I_FD_StationNo] [int] NOT NULL,
13 [VC_FD_No] [varchar](50) NOT NULL,
14 [VC_FD_Cardno] [varchar](50) NOT NULL,
15 [I_FD_CardStatus] [int] NULL,
16 [LI_FD_CTC] [bigint] NOT NULL,
17 [I_FD_TypeCode] [int] NULL,
18 [I_FD_PumpID] [int] NOT NULL,
19 [VC_FD_OilType] [varchar](50) NULL,
20 [DE_FD_Volume] [decimal](18, 2) NULL,
21 [DE_FD_Price] [decimal](18, 2) NULL,
22 [DE_FD_Amount] [decimal](18, 2) NULL,
23 [I_FD_Point] [decimal](10, 2) NULL,
24 [D_FD_DateTime] [datetime] NOT NULL,
25 [VC_FD_GroupNo] [varchar](50) NULL,
26 [D_FD_GroupDate] [datetime] NULL,
27 [DE_FD_CardAmount] [decimal](18, 2) NULL,
28 [DE_FD_VolumeTotals] [decimal](18, 2) NULL,
29 [DE_FD_AmountTotals] [decimal](18, 2) NULL,
30 [I_FD_ISSend] [int] NULL,
31 [VC_FD_CardMoneyauthFile] [varchar](50) NULL,
32 [D_Month] [datetime] NULL,
33 CONSTRAINT [PK_CT_FuelingData_1] PRIMARY KEY CLUSTERED
34 (
35 [VC_FD_No] ASC
36 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
37 ) ON [PRIMARY]
38
39 GO
40 SET ANSI_PADDING OFF

CT_InhouseCard表
1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_InhouseCard] 腳本日期: 08/24/2013 10:59:58 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_InhouseCard](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [VC_IC_CardNO] [varchar](50) NOT NULL,
13 [VC_IC_PhysicalNO] [varchar](50) NULL,
14 [I_IC_CardType] [int] NULL,
15 [VC_IC_UserName] [varchar](50) NULL,
16 [VC_IC_JobNO] [varchar](50) NULL,
17 [VC_IC_UserID] [varchar](50) NULL,
18 [VC_IC_Password] [varchar](50) NULL,
19 [DE_IC_CardAmount] [decimal](18, 2) NULL,
20 [DE_IC_AppendAmount] [decimal](18, 2) NULL,
21 [DE_IC_ConsumerAmount] [decimal](18, 2) NULL,
22 [I_IC_ISLost] [int] NULL,
23 [D_IC_UsedDateTime] [datetime] NULL,
24 [D_IC_UselifeDateTime] [datetime] NULL,
25 [I_IC_IssueStationNO] [int] NULL,
26 [VC_IC_IssuerNO] [varchar](50) NULL,
27 [D_IC_IssueDateTime] [datetime] NULL,
28 [D_IC_LastUpdateDateTime] [datetime] NULL,
29 [I_IC_CardStatus] [int] NULL,
30 [VC_IC_Remark] [varchar](256) NULL,
31 CONSTRAINT [PK_CT_InhouseCard] PRIMARY KEY CLUSTERED
32 (
33 [VC_IC_CardNO] ASC
34 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
35 ) ON [PRIMARY]
36
37 GO
38 SET ANSI_PADDING OFF

『柒』 SQL中IN和EXISTS用法的區別

SQL中IN和EXISTS用法的區別
NOT IN

SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)
NOT EXISTS,exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度
select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)
exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結果時則返回真,否則返回假。not exists則相反。
exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然後用主查詢的結果一個一個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否則不輸出。

in和exists

in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。
如果查詢的兩個表大小相當,那麼用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
in 與 =的區別
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的結果是相同的。

『捌』 hibernate涓鐨剆ession.flush鍜宑ommit鐨勫尯鍒

1銆乫lush()鏂規硶榪涜屾竻鐞嗙紦瀛樼殑鎿嶄綔,鎵ц屼竴緋誨垪鐨凷QL璇鍙,浣嗕笉浼氭彁浜や簨鍔;commit()鏂規硶浼氬厛璋冪敤flush()鏂規硶,鐒跺悗鎻愪氦浜嬪姟. 鎻愪氦浜嬪姟鎰忓懗鐫瀵規暟鎹搴撴墍鍋氱殑鏇存柊浼氭案涔呬繚鎸佷笅鏉 鎵璋撴竻鐞,鏄鎸嘓ibernate 鎸夌収鎸佷箙鍖栬薄鐨勭姸鎬佹潵鍚屾ユ洿鏂版暟鎹搴

2銆丗lush()鍚庡彧鏄灝咹ibernate緙撳瓨涓鐨勬暟鎹鎻愪氦鍒版暟鎹搴,濡傛灉榪欐椂鏁版嵁搴撳勫湪涓涓浜嬬墿褰撲腑,鍒欐暟鎹搴撳皢榪欎簺SQL璇鍙ョ紦瀛樿搗鏉,褰揌ibernate榪涜宑ommit鏃,浼氬憡璇夋暟鎹搴,浣犲彲浠ョ湡姝f彁浜や簡,榪欐椂鏁版嵁鎵嶄細姘鎬箙淇濆瓨涓嬫潵,涔熷氨鏄琚鎸佷箙鍖栦簡.

3銆乧ommit閽堝逛簨鐗╃殑錛宖lush閽堝圭紦瀛樼殑錛 鏁版嵁鍚屾ュ埌鏁版嵁搴撲腑鍚庡彧瑕佹病鏈塩ommit榪樻槸鍙浠rollback鐨勩

鍙浠ヨ繖涔堢悊瑙o紝hibiernate鏈変簩綰х紦瀛橈紝鑰屽鉤鏃朵竴鑸鍙鐢ㄤ竴綰х紦瀛橈紙榛樿ゅ紑鍚錛夛紝涔熷氨鏄痵ession綰х殑緙撳瓨銆傚勪簬涓涓浜嬪姟褰撲腑錛屽綋save鐨勬椂鍊欙紝鍙鏄鎶婄浉搴旂殑insert琛屼負鐧昏板湪浜嗕互鍙婄紦瀛樹笂錛岃宖lush鏄鎶婄紦瀛樻竻絀猴紝鍚屾椂鎶奿nsert琛屼負鐧昏板湪鏁版嵁搴撶殑浜嬪姟涓娿傚綋commit鎻愪氦涔嬪悗錛屾墠浼氭墽琛岀浉搴旂殑insert浠g爜錛岃宑ommit鍙堟槸闅愭х殑璋冪敤flush鐨勶紝閭e湪commit涔嬪墠璋冪敤flush鐨勪綔鐢ㄧ殑浠涔堬紵鎴戠殑鐞嗚В鏄闃叉㈠氭潯SQL璇鍙ュ啿紿侊紝榪欐槸鍥犱負flush鍒版暟鎹搴撲腑鎵ц孲QL璇鍙ョ殑欏哄簭涓嶆槸鎸夌収浣犱唬鐮佺殑鍏堝悗欏哄簭錛岃屾槸鎸夌収insert錛寀pdate....delete鐨勯『搴忔墽琛岀殑錛屽傛灉浣犱笉鎸夌収榪欎釜欏哄簭鍦ㄤ唬鐮佷腑緙栧啓錛屽傛灉閫昏緫涓鏃﹀嚭閿欏氨浼氭姏exception浜嗭紝瑙e喅榪欎釜鐨勫姙娉曚箣涓灝辨槸鍦ㄥ彲鑳藉叾鍐茬獊鐨凷QL鎿嶄綔鍚庨潰flush涓涓嬶紝闃叉㈠悗闈㈢殑璇鍙ュ叾鍐茬獊
鍚屾椂flush鐨勪綔鐢錛屼篃鏈夋彁浜ゅぇ閲忔暟鎹鏃跺欐竻鐞嗙紦瀛樼殑浣滅敤

鍒嗘瀽涓嬮潰涓孌典唬鐮侊細

[java] view plain
public void testSave1() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("鏉庡洓");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//鍥犱負user鐨勪富閿鐢熸垚絳栫暐閲囩敤鐨勬槸uuid錛屾墍浠ヨ皟鐢ㄥ畬鎴恠ave鍚庯紝鍙鏄灝唘ser綰沖叆鍒頒簡session鐨勭$悊
//涓嶄細鍙戝嚭insert璇鍙ワ紝浣嗘槸id宸茬粡鐢熸垚錛宻ession涓璭xistsInDatebase鐘舵佷負false
session.save(user);

//璋冪敤flush錛宧ibernate浼氭竻鐞嗙紦瀛橈紝鎵ц宻ql
//濡傛灉鏁版嵁搴撶殑闅旂葷駭鍒璁劇疆涓烘湭鎻愪氦璇伙紝閭d箞鎴戜滑鍙浠ョ湅鍒癴lush榪囩殑鏁版嵁
//騫朵笖session涓璭xistsInDatebase鐘舵佷負true </span>
session.flush();

//鎻愪氦浜嬪姟
//榛樿ゆ儏鍐典笅commit鎿嶄綔浼氬厛鎵ц宖lush娓呯悊緙撳瓨錛屾墍浠ヤ笉鐢ㄦ樉紺虹殑璋冪敤flush
//commit鍚庢暟鎹鏄鏃犳硶鍥炴粴鐨
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testSave2() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("寮犱笁1");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//鍥犱負user鐨勪富閿鐢熸垚絳栫暐涓簄ative,鎵浠ヨ皟鐢╯ession.save鍚庯紝灝嗘墽琛宨nsert璇鍙ワ紝榪斿洖鏈夋暟鎹搴撶敓鎴愮殑id
//綰沖叆浜唖ession鐨勭$悊錛屼慨鏀逛簡session涓璭xistsInDatebase鐘舵佷負true
//濡傛灉鏁版嵁搴撶殑闅旂葷駭鍒璁劇疆涓烘湭鎻愪氦璇伙紝閭d箞鎴戜滑鍙浠ョ湅鍒皊ave榪囩殑鏁版嵁
session.save(user);

tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
} </span>
[java] view plain
<span style="font-family:Arial;font-size:12px;">public void testSave1() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("鏉庡洓");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//鍥犱負user鐨勪富閿鐢熸垚絳栫暐閲囩敤鐨勬槸uuid錛屾墍浠ヨ皟鐢ㄥ畬鎴恠ave鍚庯紝鍙鏄灝唘ser綰沖叆鍒頒簡session鐨勭$悊
//涓嶄細鍙戝嚭insert璇鍙ワ紝浣嗘槸id宸茬粡鐢熸垚錛宻ession涓璭xistsInDatebase鐘舵佷負false
session.save(user);

<span style="background-color: rgb(255, 255, 255);"> //璋冪敤flush錛宧ibernate浼氭竻鐞嗙紦瀛橈紝鎵ц宻ql
//濡傛灉鏁版嵁搴撶殑闅旂葷駭鍒璁劇疆涓烘湭鎻愪氦璇伙紝閭d箞鎴戜滑鍙浠ョ湅鍒癴lush榪囩殑鏁版嵁
//騫朵笖session涓璭xistsInDatebase鐘舵佷負true </span>
session.flush();

//鎻愪氦浜嬪姟
//榛樿ゆ儏鍐典笅commit鎿嶄綔浼氬厛鎵ц宖lush娓呯悊緙撳瓨錛屾墍浠ヤ笉鐢ㄦ樉紺虹殑璋冪敤flush
//commit鍚庢暟鎹鏄鏃犳硶鍥炴粴鐨
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

public void testSave2() {
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User2 user = new User2();
user.setName("寮犱笁1");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//鍥犱負user鐨勪富閿鐢熸垚絳栫暐涓簄ative,鎵浠ヨ皟鐢╯ession.save鍚庯紝灝嗘墽琛宨nsert璇鍙ワ紝榪斿洖鏈夋暟鎹搴撶敓鎴愮殑id
//綰沖叆浜唖ession鐨勭$悊錛屼慨鏀逛簡session涓璭xistsInDatebase鐘舵佷負true
//濡傛灉鏁版嵁搴撶殑闅旂葷駭鍒璁劇疆涓烘湭鎻愪氦璇伙紝閭d箞鎴戜滑鍙浠ョ湅鍒皊ave榪囩殑鏁版嵁
session.save(user);

tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}
} </span>

熱點內容
普通電腦改伺服器風道風罩 發布:2024-11-28 04:52:28 瀏覽:453
什麼安卓手機像8p一樣 發布:2024-11-28 04:43:17 瀏覽:224
連接資料庫參數 發布:2024-11-28 04:43:15 瀏覽:807
聯想怎麼刷機解鎖密碼 發布:2024-11-28 04:31:21 瀏覽:244
方舟編譯器廠家 發布:2024-11-28 04:13:15 瀏覽:979
android源碼編輯 發布:2024-11-28 04:12:38 瀏覽:596
兩路伺服器是什麼意思 發布:2024-11-28 03:39:39 瀏覽:937
sql精簡版64 發布:2024-11-28 03:36:28 瀏覽:73
金立怎麼加密圖片 發布:2024-11-28 03:31:43 瀏覽:664
2017玩dnf電腦什麼配置 發布:2024-11-28 03:30:56 瀏覽:520