sqlnotinexists
『壹』 sql中in和exist語句的區別
兩者都能實現表功能查詢,主要區別如下:
1、適用表的類型不同。
in是子查詢為驅動表,外面的表為被驅動表,故適用於子查詢結果集小而外面的表結果集大的情況。
exists是外面的表位驅動表,子查詢裡面的表為被驅動表,故適用於外面的表結果集小而子查詢結果集大的情況。
2、子查詢關聯不同。
exists一般都是關聯子查詢。對於關聯子查詢,必須先執行外層查詢,接著對所有通過過濾條件的記錄,執行內層查詢。外層查詢和內層查詢相互依賴,因為外層查詢會把數據傳遞給內層查詢。
in則一般都是非關聯子查詢,非關聯子查詢則必須先完成內層查詢之後,外層查詢才能介入。
3、執行次數不同。
IN 語句:只執行一次,確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,in的速度較快。
EXISTS語句:執行次數根據表的長度而定。指定一個子查詢,檢測行的存在。遍歷循環外表,然後看外表中的記錄有沒有和內表的數據一樣的。匹配上就將結果放入結果集中。
『貳』 Sql語句中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'
的結果是相同的。
『叄』 sql not in not exists
因為not in不能判斷含有null的值,not exists與not in (select zd2 from #gaolima where zd2 is not null)才是等價的
『肆』 sql server中not in,in與not exists,exists有什麼不同
我給你舉幾個例子你感受一下。
(1)select*fromstudentwhereclassnotin('1','2','3')
查詢班級不在1,2,3的學生信息
(2))select*fromstudentwhereclassin('1','2','3')
查詢班級在1,2,3的學生信息
in和notin的用法,更多會出現在子查詢中,
例如select*fromstudentwheresnoin(selectsnofromExamwherecourse='English')查詢參加了英語考試的學生信息。
(3)exists更多時候出現在if判斷中,它只做一個是或否的判斷,例如如果存在birthday=今天的學生,那麼就把他的age+1
ifexists(=getdate())
BEGIN
updatestudentsetage=age+1wherebirthday=getdate()
END
else
selectN'今天沒有同學過生日'
『伍』 SQL語句中exists和not exists的用法,講得通俗易懂些。
exists : 強調的是是否返回結果集,不要求知道返回什麼, 比如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的欄位始終為1,如果改成「select 2 from grade where ...」,那麼返回的欄位就是2,這個數字沒有意義。所以exists子句不在乎返回什麼,而是在乎是不是有結果集返回。
而 exists 與 in 最大的區別在於 in引導的子句只能返回一個欄位,比如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
,in子句返回了三個欄位,這是不正確的,exists子句是允許的,但in只允許有一個欄位返回,在1,2,3中隨便去了兩個欄位即可。
而not exists 和not in 分別是exists 和 in 的 對立面。
exists (sql 返回結果集為真)
not exists (sql 不返回結果集為真)
下面詳細描述not exists的過程:
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B是1對多的關系 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 WHERENOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
執行結果為
3 A3
===========================================================================
EXISTS = IN,意思相同不過語法上有點點區別,好像使用IN效率要差點,應該是不會執行索引的原因
SELECT ID,NAME FROM A WHEREID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不過語法上有點點區別
SELECT ID,NAME FROM A WHEREIDNOT IN (SELECT AID FROM B)
有時候我們會遇到要選出某一列不重復,某一列作為選擇條件,其他列正常輸出的情況.
如下面的表table:
Id Name Class Count Date
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果想要得到下面的結果:(Id唯一,Date選最近的一次)
1 香蕉 水果 15 2011-7-3
2 青菜 蔬菜 19 2011-7-2
正確的SQL語句是:
SELECT Id, Name, Class, Count, Date
FROM table t
WHERE (NOT EXISTS
(SELECT Id, Name, Class, Count, Date FROM table
WHERE Id = t.Id AND Date > t.Date))
如果用distinct,得不到這個結果, 因為distinct是作用與所有列的
SELECT DISTINCT Id, Name, Class, Count, Date FROM table
結果是表table的所有不同列都顯示出來,如下所示:
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果用Group by也得不到需要的結果,因為Group by 要和聚合函數共同使用,所以對於Name,Class和Count列要麼使用Group by,要麼使用聚合函數. 如果寫成
SELECT Id, Name, Class, Count, MAX(Date)
FROM table
GROUP BY Id, Name, Class, Count
得到的結果是
1 蘋果 水果 10 2011-7-1
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 白菜 蔬菜 12 2011-7-1
2 青菜 蔬菜 19 2011-7-2
如果寫成
SELECT Id, MAX(Name), MAX(Class), MAX(Count), MAX(Date)
FROM table
GROUP BY Id
得到的結果是:
1 香蕉 水果 20 2011-7-3
2 青菜 蔬菜 19 2011-7-2
如果用in有時候也得不到結果,(有的時候可以得到,如果Date都不相同(沒有重復數據),或者是下面得到的Max(Date)只有一個值)
SELECT DISTINCT Id, Name, Class, Count, Date FROM table
WHERE (Date IN
(SELECT MAX(Date)
FROM table
GROUP BY Id))
得到的結果是:(因為MAX(Date)有兩個值2011-7-2,2011-7-3)
1 桔子 水果 20 2011-7-2
1 香蕉 水果 15 2011-7-3
2 青菜 蔬菜 19 2011-7-2
注意in只允許有一個欄位返回
有一種方法可以實現:
SELECT Id, Name, Class, COUNT, Date
FROM table1 t
WHERE (Date =
(SELECT MAX(Date)
FROM table1
WHERE Id = t .Id))
『陸』 SQL not exists & not in 區別
in 和not in 是把外表和那表作hash join;
而exists 和 not exists 是對外表作loop,每次loop再對那表進行查詢。
所以,in適合內外表都很大的情況,exists適合外表結果集很小的情況。
『柒』 sql;NOT IN 是什麼意思 not EXISTS呢 有例子么
例:表1 有ID為1,2,3,4,5,6,7,8,9 的9條資料
SELECT * FROM 表1 where id in(2,5,8)
只列出ID為2,5,8 的三條資料
SELECT * FROM 表1 where id not in(2,5,8)
只列出ID為除2,5,8外的所有資料即:1,3,4,6,7,9
EXISTS 是判斷是否存在,和in類似,但效率要比in高
『捌』 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'
的結果是相同的。