Oracle(2)

顯式數據類型轉換:
需要我們指定數據類型
在這裏插入圖片描述在這裏插入圖片描述select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss"今天是"day’) from dual;
在這裏插入圖片描述查詢員工的薪水:兩位小數,千位符,本地貨幣代碼
select to_char(sal,‘L9,999.99’) from emp;
在這裏插入圖片描述在這裏插入圖片描述通用函數:
在這裏插入圖片描述
select ename 姓名,nvl(comm,0) 獎金 from emp order by 獎金 desc;
在這裏插入圖片描述nvl2(a,b,c) 當a=null的時候,返回c;否則返回b;
select ename 姓名,sal*12+nvl2(comm,comm,0) 年收入 from emp order by 獎金 desc;
在這裏插入圖片描述nullif(a,b) 當a=b,返回null;否則返回a
select nullif(‘abc’,‘abcd’) 值 from dual;
在這裏插入圖片描述
coalesce(a,b,c) 從左到右找到第一個不爲null的值
select comm,sal,coalesce(comm,sal) “第一個不爲null的值” from emp;
在這裏插入圖片描述
條件表達式:
在這裏插入圖片描述
給員工漲工資,總裁1000,經理800,其他100
在這裏插入圖片描述
select ename,job,sal 漲前,case job when ‘president’ then sal+1000
when ‘manager’ then sal+800
else sal+400
end漲後 from emp;
在這裏插入圖片描述select ename,job,sal 漲前,
decode(job,‘president’,sal+1000,
‘manager’,sal+800,
sal+400) 漲後
from emp order by 漲後

在這裏插入圖片描述


多行函數

多行函數作用於一組數據,並返回一個值.

平均工資:
在這裏插入圖片描述

平均獎金:
在這裏插入圖片描述null值: 組函數會自動濾空;可以嵌套濾空函數來屏蔽他的濾空功能.

select count(*),count(nvl(comm,0)) from emp;
在這裏插入圖片描述查不重複的條數
select count(distinct job) from emp;
在這裏插入圖片描述
分組查詢:
按部門查詢:
select deptno,avg(sal) from emp group by deptno order by deptno;
在這裏插入圖片描述按職位查詢:
select job,avg(sal) 平均薪水 from emp group by job order by 平均薪水 desc;
在這裏插入圖片描述查詢多列
在這裏插入圖片描述查詢多列時,所有未包含在組函數中的列都必須包含在group by子句中, 否則會出錯
在這裏插入圖片描述
在這裏插入圖片描述包含在group by子句中的列不必包含在select列表中
在這裏插入圖片描述
所有包含於select列表中,而未包含於組函數中的列都必須包含於group by子句中.
在這裏插入圖片描述多個列的分組
多個列的分組:先按照第一個列分組,如果相同,再第二個列分組,以此類推
在這裏插入圖片描述過濾分組數據
查詢平均工資大於2000的部門
在這裏插入圖片描述where和having 的區別:
where子句中不能使用多行函數和組函數

查詢10部門的平均工資
在這裏插入圖片描述當having和where都可以使用時,儘量使用where;

group by 語句的增強:

select deptno,avg(sal) from emp group by deptno,job;
+
select deptno,sum(sal) from emp group by deptno;
+

select sum(sal) from emp;

=
select deptno,job,sum(sal) from emp group by rollup(deptno,job)

抽象:

group by rollup(a,b)

=
group by a,b
+
group by a
+
沒有group

break on deptno skip 2
相同的部門號只顯示一次,不同的部門號跳過兩行
在這裏插入圖片描述break on null 恢復默認格式

select可以相加減,通過集合運算


多表查詢(重要)

什麼是笛卡爾積?
兩張表,列數相加,行數相乘.
連接條件(至少有n-1個,n代表表的個數):兩張表的相等的列
從笛卡爾積中選出正確的結果

oracle的連接條件的類型:

  • 等值連接
  • 不等值連接
  • 外連接(重點)
  • 自連接(重點)

等值連接例子:
在這裏插入圖片描述
查詢員工信息:員工表 姓名 月薪 部門名稱

select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno
在這裏插入圖片描述不等值連接:
查詢員工信息:員工表 姓名 月薪 工資級別
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal
在這裏插入圖片描述
外連接:希望把某些不成立的記錄(40號部門),任然包含在最後的結果中===>外連接

  • 左外連接:當 where e.deptno=d.deptno不成立的時候,等號左邊的表仍然被包含在最後的結果中
  • 寫法: where e.deptno=d.deptno(+)
  • 右外連接:當 where e.deptno=d.deptno不成立的時候,等號右邊的表仍然被包含在最後的結果中
  • 寫法: where e.deptno(+)=d.deptno

按部門統計員工信息:部門號 部門名稱 人數
右外連接:
select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
在這裏插入圖片描述自連接:
查詢員工信息:員工姓名 老闆姓名
select e.ename 員工姓名,b.ename 老闆姓名 from emp e,emp b where e.mgr=b.empno;
在這裏插入圖片描述自連接就是通過表的別名,將同一張表視爲多張表
自連接不適合操作大表.

層次查詢: 單表查詢
select level,empno 員工號,ename 員工姓名,mgr 老闆姓名 from emp connect by prior empno = mgr start with mgr is null order by 1;
在這裏插入圖片描述
自連接比較直觀,不適合查詢大表;層次查詢速度快,可以查詢大表,但是查詢出來的東西不明顯.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章