1. 程式人生 > >SQL中EXCEPT和Not in的區別?

SQL中EXCEPT和Not in的區別?

初始化兩張表:

CREATE TABLE tb1(ID int)
INSERT tb1SELECT NULL
UNIONALLSELECT NULL
UNIONALLSELECT NULL
UNIONALLSELECT 1
UNIONALLSELECT 2
UNIONALLSELECT 2
UNIONALLSELECT 2
UNIONALLSELECT 3
UNIONALLSELECT 4
UNIONALLSELECT 4

CREATE TABLE tb2(ID int)

INSERT tb2SELECT NULL

UNIONALLSELECT 1

UNIONALLSELECT 3

UNIONALLSELECT

4

UNIONALLSELECT 4

 A:

SELECT * FROM tb1

SELECT * FROM tb2

 

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);--得不到任何值

結果:

B、我先刪除表tb1的是NULL值的行

--DELETEFROM tb1 where id isnull

B、

SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;

SELECT*FROM tb1 WHERE id NOTIN(

SELECT id FROM tb2);--得不到任何值

結果:同上A

C、把表tb2的是NULL值的行也刪除

--DELETEFROM tb2 where id isnull

C、

SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;

SELECT*FROM tb1 WHERE id NOTIN(SELECT id FROM tb2);

結果:

這是兩張表中都沒有NULL值時,得到的結果;

D、在tb1表中插入一條NULL值

D、

SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;

SELECT*FROM tb1 WHERE id

NOTIN(SELECT id FROM tb2);

結果:

以上例子說明: 

except會去重複,notin不會(除非你在select中顯式指定)

except用於比較的列是所有列,除非寫子查詢限制列,notin沒有這種情況

tb2中如果有null值的話,not in查詢得不到值(如:AB

tb1中如果有null值,not in不會查詢出這個null值(如:D),而except可以查詢到

當然通過對子查詢指定不為NULL的話,NOT IN自然會得到值,如:

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2 WHERE ID ISNOTNULL);

這裡是需要注意的,如果你的欄位執行為NULL,又欲使用NOT IN那麼就需要這麼做

 

相關推薦

SQLEXCEPTNot in區別

初始化兩張表: CREATE TABLE tb1(ID int) INSERT tb1SELECT NULLUNIONALLSELECT NULLUNIONALLSELECT NULLUNIONALLSELECT 1UNIONALLSELECT 2UNIONALLSELECT

SQLEXCEPTNot in區別

SQL中EXCEPT和Not in的區別? 我們一起來看看。 初始化兩張表: CREATE TABLE tb1(ID int)  INSERT tb1          SELECT NULL UNION  ALL          SELECT NULL UNION 

sqlexistsnot exists用法 容易in not in 混淆

看專案程式碼時遇到,記錄下 select * from A where id in(select id from B) 以上查詢使用了in語句,in()只執行一次,它查出B表中的所有id欄位並快取起來. 然後,檢查A表的id是否與B表中的id相等, 如果相等則將A表的記

SQLonwhere的區別

知識庫 mysq sdn pad 行數 full join sel targe 知識 這篇博客參考了網上的,具體哪一篇是原稿,不知道,特此聲明。 數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。 下面以使用le

SQLWhereHaving的區別---正確理解

Where和Having到底有啥區別,相信很多人都有過困擾,本人之前也是似懂非懂,前幾天接了阿里的一個電話面試,資料庫的部分就被這個問題給難倒了,支支吾吾只說了“在不能用where的時候就應該選擇having”,其他的啥也不會了。 今天寫sql時又用了having(雖然還是

面試被問之-----sql優化in與exists的區別 Mysql in or exists not exists not in區別 (網路整理) Sql語句INexists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

SQLexistsin的一些區別

1.exist,not exist一般都是與子查詢一起使用. In可以與子查詢一起使用,也可以直接in (a,b.....)。2.exist會針對子查詢的表使用索引. not exist會對主子查詢都會使用索引. in與子查詢一起使用的時候,只能針對主查詢使用索引. not

sqlexitsin區別

轉:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html in 和 exists也是很好區別的. in 是一個集合運算子. a in {a,c,d,s,d....} 這

oracle_not existsnot in的用法區別

沒有 class oracl 水果 where tle select mark 顯示 (轉 飛翔-方向 積累 沈澱http://www.cnblogs.com/mytechblog/) sql中exists,not exists的用法 exists表示()內子查詢語句返回結

sql語句學習(NOT EXISTS NOT IN

exist car rod cto from log del sele tinc NOT EXISTS SELECT   a.*FROM   t_user aWHERE   a.id_card LIKE ‘%3203821995100%‘AND NOT EXISTS ( S

SQL優化- innot in

audit roc RoCE AI 時間 pro 執行 code ESS in不會導致索引失效,但最終數據庫會將in語句解析為or語句,eg: select * from T_MAIN_PROCESS t where t.audit_status_code in (‘05‘

sql查詢語句onwhere的區別

運算 www span 多表 速度 分享 執行 最終 .com   數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。 在使用left jion時,on和where條件的區別如下: on條件是在生成臨時表時使用的條件,它不管

pl/sqlreturnexit區別

經測試: 1、exit只能用於迴圈中,並且退出迴圈往下執行; 2、return可用於迴圈或非迴圈,並且退出整個程式模組不往下執行。 declare i number :=1; j number :=1; begin loop if i>3 then

SQLvarcharnvarchar的基本介紹及其區別

SQL中varchar和nvarchar的基本介紹及其區別   varchar(n) 長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是 n 個位元組。 nvarchar(n)

SQLinstrlike的使用區別

1、instr函式  instr函式是一個字串處理函式,它在Oracle/PLSQL中是返回子字串在源字串中的位置,如果在源串中沒有找到子串,則返回0。 instr函式定義如下:     /*      &n

Oracle使用join表連線查詢代替 innot in 查詢

首先,在oracle中效率排行:表連線>exist>not exist>in>not in,而且使用in查詢會有查詢條件數量不能超過1000的限制;因此如果簡單提高效率可以用exist代替in進行操作,當然換成表連線可以更快地提高效率,具體是用le

Mysql in or exists not exists not in區別 (網路整理)

in 和or區別:https://www.cnblogs.com/rainwang/p/4389282.html 如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。 如果in和or所在列沒有 索引的話,效能差別就很大了。在沒有索引的情況下,隨著in或者or後面

SQLunionunion all的區別

union在進行表求並集後會去掉重複的元素,所以會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。 union all則只是簡單地將兩個結果集合並後就返回結果。因此,如果返回的兩個結果集中有重複的資料,那麼返回的結果就會包含重複的資料。 從上面的對比可以看出,在執

oracle 子查詢null的問題(in not in

這裡的in後面的句子可以理解為or拼接,簡單舉例即 in (9566,9839,null)可以等價於mgr=9566 or mgr=9839 or mgr=null, not in (9566,9839,null)可以等價於not(mgr=9566 or mgr=9839 o

SQLexsitin

本週在做ETL的時候踩了個小坑 A表中資料有18條,有欄位UserID B表與A表結構相同,但只有16條資料(手動刪除2條,更改2條UserID為不重複的其他值) 當 Select UserID from B where UserID in (Select UserID from A)