1. 程式人生 > >Oracle 子查詢的基本語法以及使用原則

Oracle 子查詢的基本語法以及使用原則

在整個SQL查詢語句過程中,子查詢並不具備特殊的語法,在整個SQL查詢操作子句中:SELECT、  FROM  、WHERE 、GROUB BY  、HAVING  、 ORDER BY。

如果非要給出子查詢的語法,那麼只能怪進行拼湊。

所謂子查詢,實際上為查詢的巢狀,查詢的子句任意位置上,都可以隨意出現子查詢。但是出現子查詢最多的位置:WHERE,FROM .以下給出幾個子查詢的參考方案。

WHERE 子句:子查詢返回單行單列、多行多列;

HAVING 子句:子查詢返回單行單列,而且要使用統計函式過濾

FROM子句:子查詢返回的是多行多列

SELECT子句:一般返回單行單列,並且需要某些查詢的時候使用

在WHERE子句中使用子查詢

where子句主要是進行資料的篩選,而且通過分析可以發現,單行單列,單行多列,多行多列都可以在WHERE子句中出現。

子查詢返回單行單列

例:要求查詢公司工資最低的員工資訊

不可能將800這個資料直接使用,因為這個資料是需要統計出來的,而要想知道這個內容,可以利用MIN()函式

第一步:統計出公司的最低工資

第二步:以上資料會返回單行單列資料,是一個數值,如果直接給這個數值,是不是可以利用WHERE篩選所需要的資料行呢

例:查詢公司僱傭最早的僱員

僱傭最早一定是僱員日期最小,那麼使用MIN()函式完成

以上查詢會返回單行單列的資料,所有可以直接在WHERE子句中使用

子查詢返回單行多列

例:查詢出與scott工資相同、職位相同的所有僱員的資訊

現在需要同時比較工資與職位,因此,首先應該查詢SCOTT的工資與職位

此時返回了單行兩列的資料資訊,而要進行比較時肯定同時滿足

子查詢返回多行多列(重點)

如果說子查詢返回了多行單列的資料,實質上就告訴了使用者一個操作範圍。而玉如要想進行範圍的判斷。在WHERE子句中提供有三個主要的運算子:IN、ANY、ALL

對於IN操作,還可以使用NOT IN 操作,需要注意的問題是其後不能為空

一定要保證子查詢裡沒有空

ANY操作

對於ANY操作,有三種子語法,

1、=ANY:功能上是與IN完全沒有區別的

2、>ANY:比子查詢返回的最小的內容要大

 

3、<ANY:比此查詢返回最大的內容要小

ALL操作

1、>ALL:比子查詢返回的最大值還要大

2、小於ALL:比子查詢返回的最小值還要小

exists()判斷

如果現在子查詢有資料返回,就表示條件滿足,那麼就可以顯示資料,否則不顯示

例:觀察exists()操作

因為子查詢沒有返回對於條件查詢資料行,則EXISTS()便認為資料不存在

例:觀察exists()操作

例:觀察exists()操作

EXISTS( ) 只關心後面返回的是否有行,至於什麼行,並不關心

例:使用NOT EXISTS( )

對於IN主要是進行資料的判斷,EXISTS( )是針對於是否存在資料進行判斷。顯然,EXISTS( )要比IN的效能更高,它不關心子查詢中返回的資料是否匹配。

在HAVING子句中使用子查詢

如果要使用HAVING子句,必須要結合GROUP BY子句,而如果要使用GROUP BY子句就一定要分組。

例:要求統計出所有高於公司平均工資的部門編號,平均工資,部門人數。

此時的子查詢返回了單行單列的資料,那麼肯定要在HAVING子句中使用

第三步:對資料過濾

在SELECT子句中使用子查詢

如果說按照正常的思路,肯定使用多表查詢,

實際上在SELECT子句裡面出現子查詢的核心目的在於:行列轉換

在FROM子句中出現子查詢(重點)

除了利用以上的方式之外,也可以利用子查詢完成。

首先dept是一張資料表,但是對於資料的統計查詢,也可以將其定義為一張表,

此時的查詢返回的是一個多行多列的資料,那麼只要是多行多列,就一定可以在FROM子句中出現

現在有兩種方式可以實現同樣功能的查詢,那麼這兩種方式有什麼區別?應使用哪一種

為了更好的解決這個問題,現在假設可以將資料擴大一百倍,即此時的emp表中有1400條記錄,dept表中有400條記錄,分析這兩種方式:

多表查詢永恆都會存在效能問題,而子查詢主要的目的是為了解決多表查詢效能問題而產生的。