SET NOCOUNT ON , SET NOCOUNT OFF
當 SET NOCOUNT 為 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。
當 SET NOCOUNT 為 OFF 時,返回計數。
如果存儲過程中包含的一些語句並不返回許多實際的數據, 則該設置由於大量減
少了網絡流量,因此可顯著提高性能。
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
要快。
SQL中 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'
的結果是相同的。
例子如下(即 exists 返回 where 后 2 個比較的 where 子句中 相同值, not exists 則返回 where 子句中 不同值):
exists (sql 返回結果集為真 )
not exists (sql 不返回結果集為真 )
如下:
表 A
ID NAME
1 A1
2 A2
3 A3
表 B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表 A 和表 B 是一對多的關系 A.ID --> B.AID
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID =B.AID)
執行結果為
1 A1
2 A2
原因可以按照如下分析
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1)
-->SELECT * FROM B WHERE B.AID = 1 有值返回真所以有數據
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2)
-->SELECT * FROM B WHERE B.AID = 2 有值返回真所以有數據
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3)
-->SELECT * FROM B WHERE B.AID = 3 無值返回真所以沒有數據
NOT EXISTS 就是反過來
SELECT ID , NAME FROM A WHERE NOT EXIST ( SELECT * FROM B WHERE A.ID =B.AID)
執行結果為
3 A3
SQL 中 in與 exists區別:
IN
確定給定的值是否與子查詢或列表中的值相匹配。
EXISTS
指定一個子查詢,檢測行的存在。
比較使用 EXISTS 和 IN 的查詢
這個例子比較了兩個語義類似的查詢。 第一個查詢使用 EXISTS 而第二個查詢使用 IN 。 注
意兩個查詢返回相同的信息。
USE pubs
SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')
using the IN clause:
USE pubs;
SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')
GO
下面是任一查詢的結果集:
pub_name
----------------------------------------
Algodata Infosystems
New Moon Books
(2 row(s) affected)
exits 相當於存在量詞:表示集合存在 ,也就是集合不為空只作用一個集合 .
例如:
exist P 表示 P 不空時為真 ; not exist P 表示 p 為空時 為真
in 表示一個標量和一元關系的關系。
例如:
s in P 表示當 s 與 P 中的某個值相等時 為真 ; s not in P 表示 s 與 P 中的每一個值都不相等時為真
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性能比較: