Oracle(四)--> 進階子查詢(多例詳解難度高,實在不信進來看~),oracle進來看
這一節將討論一下子查詢更加複雜的應用,主要在於簡化 SQL,從側面提高效能,當然。。提高效能的地方有很多很多。。今天聽了一場關於 Oracle 的效能調優的講座,瞭解了 Oracle 效能、最佳化要注意的各個方面。雖然現在可能還遇不到那麼複雜的問題,但是關於簡化 SQL ,最佳化 SQL 還是目前可以做到並作為一個不斷努力的地方。話不多說,通過幾個例子先來討論一下~(當然。。對於我這種菜鳥還是有難度的,各位大神多多諒解,多多包涵~)希望給大家一些有益的思考或借鑒~
一、子查詢回顧
子查詢是嵌套在 SQL 陳述式中的另一個 SELECT 語句
例:
1、查詢工資大於148號員工工資的員工資訊(只能為單列查詢,否則報錯)
結果如下
2、查詢 Last_name 為 grant 的 manager 的資訊
結果如下
二、多列子查詢( 將返回多個結果用 in )
1、例:查詢 employee_id 為 149 號或 176 號員工的 manager_id 和 department_id 相同的其他員工的 emloyee_id , manager_id , department_id。
不成對比較方式:
employees 表中 employee_id 、 department_id 、 manager_id 的資料如下
分析:
1)首先應該寫出以中的內容
-- 查詢 emloyee_id , manager_id , department_id
-- where 條件將 manager_id、department_id 限定
-- employee_id 不能為 149 或 176.
2)之後將 manager_id 和 department_id 的 sql 語句填上即可,當然此時最好將 "" 改為 in。
查詢結果顯示如下:
我們發現上述查詢中有兩個部分出現多次,於是我們應該通過多列子查詢使得 sql 語句更加簡潔。
成對比較方式:sql如下
2、在 from 子句中使用子查詢
例:返回比本部門平均工資高的員工的 last_name,department_id,salary 及平均工資
分析:
1、首先我們討論一下沒有平均工資的情況該如何寫。
-- 要注意的地方在於部門號要一致(本部門)
2、加上平均工資
通過加入一個 select 查詢進行平均工資的查詢,也要保證為本部門,查詢結果如下
那麼如何在 from 子句中使用子查詢呢?
首先,這裡用到了與多表串連類似的方式。多表串連怎麼用?看一眼下面的例子即可:
那和 from 子句使用子查詢有何關係呢?其實 departments 是一個真實存在的表,然而在平均工資查詢時,我們可以通過 sql 語句來建立一個表,然後建立 employees 與 該表的串連關係,即可降低 sql 語句的冗餘度。sql 語句如下和結果如下:
可以發現這樣的查詢結果與之前的結果是一致的,但是冗餘度大大降低,但是思路要清晰,難度較大。
三、單列子查詢運算式:是在一行中只返回一列的子查詢
-----------------------------------------------------------------------------------------
例:顯示員工的 employee_id,last_name,和 location。其中,若員工的 department_id 與 location_id 為 1800 的 department_id 相同,則 location 為 'CANADA',其餘為 'USA'。
分析:若..則.. 條件陳述式:case..when..then..end,sql 及 返回結果如下
employees 表中資訊
departments 表中資訊(僅有一個 ID 對應)
-----------------------------------------------------------------------------------------------------
例:查詢員工的 employee_id 和 last_name,要求按照員工的 department_name 排序
department_name 不存在於 employees 表中,
每次查詢一個員工時,都會找到對應的 name ,然後跟已有排好序的 name 進行對比,如果靠前就往前排,靠後則往後排,故此串連條件必須存在。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。