(一)子查詢(復習)
子查詢是嵌套在SQL與劇中的另一個SELECT語句
子查詢 (內查詢) 在主查詢執行之前執行
主查詢(外查詢)使用子查詢的結果
-- 查詢工資大於149號員工工資的員工的信息
(二)多列子查詢
主查詢與子查詢返回的多個列進行比較
多列子查詢中的比較分為兩種
- 成對比較
- 不成對比較
1、成對比較
-- 查詢與141號或174號員工的manager_id和department_id相同的其他員工的employee_id, manager_id, department_id
2、不成對比較
(三)在 FROM 子句中使用子查詢
-- 返回比本部門平均工資高的員工的last_name, department_id, salary及平均工資
方法一:以前的方法,出現冗余
方法二:新方法
(四)單列子查詢表達式
單列子查詢表達式是在一行中只返回一列的子查詢
Oracle8i 只在下列情況下可以使用, 例如:
- SELECT 語句 (FROM 和 WHERE 子句)
- INSERT 語句中的VALUES列表中
Oracle9i中單列子查詢表達式可在下列情況下使用:
- DECODE 和 CASE
- SELECT 中除 GROUP BY 子句以外的所有子句中
1、在 CASE 表達式中使用單列子查詢
-- 顯式員工的employee_id,last_name和location。其中,若員工department_id與location_id為1800的department_id相同,則location為’Canada’,其余則為’USA’。
2、在 ORDER BY 子句中使用單列子查詢
-- 查詢員工的employee_id,last_name,要求按照員工的department_name排序
(五)相關子查詢
相關子查詢按照一行接一行的順序執行,主查詢的每一行都執行一次子查詢
-- 查詢員工中工資大於本部門平均工資的員工的last_name, salary和其department_id
-- 若employees表中employee_id與job_history表中employee_id相同的數目不小於2,輸出這些相同id的員工的employee_id,last_name和其job_id
(五)EXISTS 操作符
EXISTS 操作符檢查在子查詢中是否存在滿足條件的行
如果在子查詢中存在滿足條件的行:
- 不在子查詢中繼續查找
- 條件返回 TRUE
如果在子查詢中不存在滿足條件的行:
- 條件返回 FALSE
- 繼續在子查詢中查找
-- 查詢公司管理者的employee_id,last_name,job_id,department_id信息
not exists操作符
-- 查詢departments表中,不存在於employees表中的部門的department_id和department_name
(七)相關更新
使用相關子查詢依據一個表中的數據更新另一個表的數據
(1)復制一張表emp011
(2)在表emp011中添加一列
(3)在新插入的列中添加數據
相關刪除
(1)創建兩張表emp011和emp022
(2)查看兩表的數據條數
(3)在emp022表中刪除與emp033表相同的數據
(八)WITH子句
- 使用 WITH 子句, 可以避免在 SELECT 語句中重復書寫相同的語句塊
- WITH 子句將該子句中的語句塊執行一次並存儲到用戶的臨時表空間中
- 使用 WITH 子句可以提高查詢效率
-- 查詢公司中工資比Abel高的員工的信息
1、不使用with子句實現
2、使用with子句查詢
-- 查詢公司中各部門的總工資大於公司中各部門的平均總工資的部門信息
(九)總結
- 使用多列子查詢
- 多列子查詢的成對和非成對比較
- 單列子查詢
- 相關子查詢
- EXISTS 和 NOT EXISTS操作符
- 相關更新和相關刪除
- WITH子句