程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle(四)--)高級子查詢(多例詳解難度高,實在不信進來看~)

Oracle(四)--)高級子查詢(多例詳解難度高,實在不信進來看~)

編輯: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 進行對比,如果靠前就往前排,靠後則往後排,故此連接條件必須存在。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved