天天看點

select 1 from和existsEXISTS

EXISTS用于檢查子查詢是否至少會傳回一行資料,該子查詢實際上并不傳回任何資料,而是傳回值True或False

EXISTS

指定一個子查詢,檢測行的存在。 

文法

EXISTS subquery

參數

subquery

是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。有關更多資訊,請參見select中有關子查詢的讨論。

結果類型

Boolean

結果值

如果子查詢包含行,則傳回 TRUE。

一種通俗的可以了解為:将外查詢表的每一行,代入内查詢作為檢驗,如果内查詢傳回的結果取非空值,則EXISTS子句傳回TRUE,這一行行可作為外查詢的結果行,否則不能作為結果。exists引導的子句有結果集傳回,那麼exists這個條件就算成立了,

http://www.cnblogs.com/fredlau/articles/993829.html

http://www.cnblogs.com/mytechblog/articles/2105785.html

http://blog.csdn.net/xiwu1616/article/details/14160855/

[sql] view plain copy

  1. <span style="font-size:14px;"> Insert into DGDISTRIBUTOR (DGDISTRIBUTORID,ORGCODE,ORGNAME,USERID,DATELASTUPDATED)   
  2.  select DGDISTRIBUTORseq.nextval,'52004096','丹東市第二人民醫院',100005690,sysdate from DGDISTRIBUTOR  
  3.  where ROWNUM<=1 and not exists (select * from DGDISTRIBUTOR where orgcode = '52004096')</span>  

1、select 1 from mytable;與select anycol(目的表集合中的任意一行) from mytable;與select * from mytable 作用上來說是沒有差别的,都是檢視是否有記錄,一般是作條件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但從效率上來說,1>anycol>*,因為不用查字典表。

2、檢視記錄條數可以用select count(1) from mytable;等價于select count(*) from mytable;

select * from organization where 1=1 and exists(select 1 from organization where orgid >1999999);

1=1為保護作用,在拼裝SQL語句時,當後面的條件不成立時有可能會導緻整個語句異常。因為where後面不能為空。

當我們隻關心資料表有多少記錄行而不需要知道具體的字段值時,類似“select 1 from tblName”是一個很不錯的SQL語句寫法,它通常用于子查詢。這樣可以減少系統開銷,提高運作效率,因為這樣子寫的SQL語句,資料庫引擎就不會去檢索資料表裡一條條具體的記錄和每條記錄裡一個個具體的字段值并将它們放到記憶體裡,而是根據查詢到有多少行存在就輸出多少個“1”,每個“1”代表有1行記錄,同時選用數字1還因為它所占用的記憶體空間最小,當然用數字0的效果也一樣。在不需要知道具體的記錄值是什麼的情況下這種寫法無疑更加可取。

下面舉例示範這種寫法的常見用法:

1)列出每個班的學生人數

正常寫法

1

2

select

class,

count

(*) 

as

pax 

from

students 

group

by

class;

更優寫法

1

2

select

class,

count

(1) 

as

pax 

from

students 

group

by

class;

2)列出每個班最年輕的學生資料

正常寫法

1

2

3

select

a.* 

from

students a 

where

not

exists(

select

b.sid 

from

students b 

where

b.sid=a.sid 

and

b.date_birth>a.date_birth);

更優寫法

1

2

3

select

a.* 

from

students a 

where

not

exists(

select

from

students b 

where

b.sid=a.sid 

and

b.date_birth>a.date_birth);