SET NOCOUNT ON , SET NOCOUNT OFF
當 SET NOCOUNT 爲 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。
當 SET NOCOUNT 爲 OFF 時,返回計數。
若是存儲過程當中包含的一些語句並不返回許多實際的數據, 則該設置因爲大量減
少了網絡流量,所以可顯著提升性能。sql
SQL 中 IN 和 EXISTS 用法的區別:網絡
NOT IN
oop
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:spa
select * from A where cc in (select cc from B)
效率低,用到了 A 表上 cc 列的索引;code
select * from A where exists (select cc from B where cc=A.cc)
效率高,用到了 B 表上 cc 列的索引。
相反的 2 :blog
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 列的索引。hash
not in 和 not exists 若是查詢語句使用了 not in 那麼內外表都進行全表掃描, 沒有用到索引;
而 not extsts 的子查詢依然能用到表上的索引。 因此不管那個表大, 用 not exists 都比 not in
要快。it
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性能比較: