1. 程式人生 > >sql語句中的 in 、not in 、exists、not exists 詳細用法說明和差別----not in失效

sql語句中的 in 、not in 、exists、not exists 詳細用法說明和差別----not in失效

來看下面這樣一條SQL語句:
select * from student where 20 < all (select score from student)
其中,(select score from student)返回的是所有分數的記錄集
只有當記錄集中的所有分數都大於20後,才會執行前面的SQL語句。顯然,任何一條記錄都大於20.
如果把它改成50,則查不到任何資料,因為只要有一條記錄小於50,條件都不成立。

但是,如果把all改面any就不一樣了:
select * from student where 50 < any (select score from student)
它的意思是,只要記錄集中的記錄有一條大於50,條件就成立。

1

ALL與ANY的關係就是,AND 與 OR 的關係。

2 ANY與SOME等價,據說搞這兩個不同的詞出來是為了遷就英語語法。例如,在用= ANY 的地方在(英語) 語法上就應該是= SOME。 some是新版本的SQL中取代any的關鍵字,用法基本一樣。

3 IN 與 = ANY 等價,均表示,變數在(子查詢)列表之中,即 a IN (table B) 表示 a = ANY B.b

4 NOT IN 與 <> ALL 等價,而不等於<> ANY,前兩者均表示,變數不在(子查詢)列表之中,即 a NOT IN (table B) 表示 a <> ALL B.b。而如果a <> ANY B.b,則只要任意一個b<>a就true了。

5 IN 與 EXISTS 的效能區別主要來自,IN 會編列子查詢的每行記錄,然後再返回,而EXISTS 則只要遇到第一個滿足條件的記錄就馬上返回。

6 NOT IN 與 NOT EXISTS 並不能完全等價,只有當子查詢中,select 關鍵字後的欄位有not null約束或者有這種暗示時才用NOT IN。

select * from userinfo where userid not in(select distinct a_userid form table1);

突然碰到not in 關鍵字失效,在資料庫中查詢後才發現 table1中的a_userid存在NULL值,而not in 關鍵字則需要a_userid有not null約束