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條記錄,分析這兩種方式:
多表查詢永恆都會存在效能問題,而子查詢主要的目的是為了解決多表查詢效能問題而產生的。