1 子查詢
1.1 子查詢語法
select select_list from table
where expr operator(select select_list from table)
1.2 子查詢注意的問題
- 子查詢需要添加括號
- 合理的書寫風格
- 可以在where select having from後面 都可以使用子查詢
- 不可以在group by後面使用子查詢
- 強調from後面的子查詢
- 主查詢和子查詢可以不是同一張表;只要子查詢返回的結果 主查詢可以使用 即可
- 一般不在子查詢中排序;但在top-n分析問題中,必須對子查詢排序
- 一般先執行子查詢,再執行主查詢;但相關子查詢例外
- 單行子查詢只能使用單行操作符;多行子查詢只能使用多行操作符
- 子查詢中的null
1.3 案例
查詢工資比SCOTT高的員工信息
select後可以添加子查詢
查詢員工記錄後,每一行後面顯示總裁
from後面的子查詢
查詢員工信息:員工號 姓名 月薪
查詢員工信息:員工號 姓名 月薪 年薪
語句跟select empno,ename,sal,sal*12 annsal from emp
性能一樣的,oracle內部會重構
主查詢和子查詢可以不是同一張表;只要子查詢返回的結果 主查詢可以使用 即可
查詢部門名稱是SALES的員工,實現方法有兩種
in 在集合中
查詢部門名稱是SALES和ACCOUNTING的員工
any: 和集合中的任意一個值比較
查詢工資比30號部門至少一個員工高的員工信息
all 和集合中的所有值比較
查詢工資比30號部門所有員工高的員工信息
not in(a,b,null)
not in中不能有null
in 中可以有null
多行子查詢中的null
查詢是老闆(管理層)的員工
查詢不是老闆(管理層)的員工
錯誤寫法【not in中不能有null】
2 集合運算
- 瞭解
union
就可以,intersect
和minus
原理一樣 - 開發中少用union,性能比較差
Set timing on/off
可以查時間
Union
注意的問題:
1.參與運算的各個集合必須列數相同且類型一致
2. 採用第一個集合作爲最後的表頭
3. order by 永遠在最後
4. 括號
查詢10和20號部門的員工
select * from emp where deptno=10 or deptno=20;
等價於
3 練習
3.1 rownum
行號
- rownum永遠按照默認的順序生成
- rownum只能使用
<
<=
; 不能使用>
>=
3.2 rowid
行地址
3.3 臨時表
create global temporary table *****
- 自動創建:
order by
特點:當事務或者會話結束的時候,表中的數據自動刪除
3.4 行轉列
wm_concat(varchar2)
組函數
3.5 oracle 分頁
找到員工表中工資最高的前三名
分頁
找到員工表中薪水大於本部門平均薪水的員工
- 求出部門的平均工資
- 判斷員工是否工資大於本部門的平均工資
計算每年入職的員工數