1. 程式人生 > >Oracle之查詢+內建函式

Oracle之查詢+內建函式

select '工號:'||empno 工號,'姓名:'||ename 姓名,'工作:'||job 工作,'入職日期:'||hiredate 入職日期 from scott.emp;
補充運算子知識:
算術運算子:+,-,*,/
示例:select 5/2 from dual;
邏輯運算子:
and,or,not
比較運算子:
>,<,>=,<=,=,<>,!=,最後兩個符號在oralce中沒區別
運算子優先順序:
()>not>算術運算子>比較運算子>and>or
為空:is null
select * from emp where comm is null;

不為空:is not null;
集合:in(2,6,9)
區間:between...and
order by:升序
order by...desc:降序
3.單行函式:
1.字元函式:
upper():轉成大寫
lower()小寫
initcap():單詞首字母大寫
select ename,job,sal from scott.emp where job in(upper('clerk'),upper('manager'));
select ename,job,sal from scott.emp where job in(upper('clerk'),upper('manager')) and sal not in(1000,3000,5000);

2.字元控制函式:
length():字串長度,也就是字元個數
select length('漢字') from dual;
lengthb():位元組數,
select lengthb('漢字') from dual;
substr(src,i,length):擷取字串
引數1:要擷取的字串
引數2:要從哪個位置開始擷取
i>0:
i=0或i=1都表示從第一個字元擷取
i>1時表示從第i個字元開始,包括i
i<0:表示擷取的開始位置為字串右端向左數第-i個字元開始
select substr('哇哈哈呵呵',-2,3) as value from dual;--呵呵
instr(src,dest):返回dest在src中出現的位置

select instr('哇哈哈abc呵呵','哇') from dual;---1
如果不存在,返回0
cancat(字串1,字串2):連線兩個字串,相當於||
trim(字串):去除字串前後空格
trim(字元 from 字串):從字串中去除首和尾字元
select trim('a' from 'abca')test from dual;--bc
lpad(s1,length,[pad_string]):左填充
s1:被填充的字串
length填充後字串長度
pad_string:要填充的字串
rpad(s1,length,[pad_string]):右填充
3.數值函式
round(num,s):四捨五入,s表示要顯示多少位小數
s=0:表示結果為整數,可不寫(s<0一定為整數)
select round(3.14) from dual;
select round(3.1415,3) from dual;--3.142
s>0:表示小數位數
s<0:number(4,-2)類似
mod(n1,n2):相當於java中的%
4.日期函式:
to_date:
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual;
months_between:兩個日期之間相差的月數
select months_between(sysdate,'2-8月-16') dd from dual;
select sysdate-hiredate from scott.emp;--相差天數
select (sysdate-hiredate)/7 from scott.emp;--週數
select trunc((sysdate-hiredate)/7) from scott.emp;取整數部分
add_months(date,n):在指定日期上增加n個月
next_day(date,weekday):給定日期的下一個星期幾是什麼日期
select next_day(sysdate,'星期一') from dual;
last_day(date):返回該月份的最後一天
to_char(date,字串格式):把日期轉為指定格式的字串
to_char(date,'yyyy):年
to_char(date,'mm'):月
練習:
查詢出員工的姓名、該員工入職的年份,月份,並按年份進行升序排序,
如果年份相同再按月份降序排序
select ename,to_char(hiredate,'yyyy')year,to_char(hiredate,'mm')month from scott.emp
order by year,month desc;
to_char(num,'format'):對數字按指定格式顯示
舉例:to_char(sal,'$9,999.99')
格式:
9:1~9的任意一個數字
0:表示0,用於數字填充
,:千位符
.:表示小數點
L:本地貨幣符號
$:美元
查詢出員工表中姓名,工資,要求工資顯示成美元,再換成rmb(1=7rmb);
select ename,to_char(sal,'$9,999.99')dollor from scott.emp;
select ename,to_char(sal,'$9,999.99')dollor,
to_char(sal*7,'L00999,999.99') rmb from scott.emp;
5.通用函式
nvl(n1,n2):如果第一個引數為空,那麼顯示第二個引數的值,如果第一個引數不空,顯示第一個引數值
select ename,nvl(comm,0)from emp;
nvl2(p1,p2,p3):如果p1空,返回p3,如果p1不空,返回p2
decode(value,if1,then1,if2,then2,if3,then3,...[,else]);
如果value為if1則返回then1,如果為if2返回then2,....
如果沒有相等的,返回else資料
select decode(2,1,'a', 2,'b','no') from dual;
6.case 表示式
格式一:
case express
when result1 then value1
when result2 then value2
.....
[else value]
end;
格式二:
case
 when 條件1 then value1
 when 條件2 then value2
 ....
 [else value]
end;
練習:查詢出員工的姓名,工作,並把工作漢化
clerk:職員
salesman:銷售
president:總裁
manager:經理
analyst:分析
decode使用
select ename,decode(job, 
'CLERK','職員',
'PRESIDENT','總裁',
'MANAGER','經理',
'SALESMEN','銷售',
'ANALYST','分析'
) job(別名) from scott.emp;
case使用
select ename,case job 
   when 'CLERK' then '職員'
   when 'SALESMAN' then '銷售'
   when 'PRESIDENT' THEN '總裁'
   else '掃地的'
   end
job from scott.emp;
查詢員工的姓名,工資,稅率
sal<1000 0
1000<=sal<2000 0.02
2000     30000.04
3000     40000.06
>40000.1
select ename,sal,
   case 
when sal<1000 then 0
       when sal>=1000 and sal<2000 then 0.02
when sal>=2000 and sal<3000 then 0.04
when sal>=3000 and sal<4000 then 0.06
else 0.1 
   end
tax from scott.emp;

select ename,sal,decode(trunc(sal/1000),
0,0,
1,0.02,
2,0.04,
3,0.06,
0.1)tax from scott.emp;
4.多表查詢(***重點***)
如果一個查詢語句需要顯示多張表的資料,就必須用多張表查詢,這種操作叫多表查詢
select [distinct]*|欄位[別名][,欄位[別名],....]from 表名1 [別名],[表名[別名],...]
[where 條件] [order by 欄位 asc|desc][,排序欄位 [asc|desc],...];
1.笛卡爾積(交叉連線)
select ename,dept.deptno from emp,dept;
2.內連線
1.等值連線
查詢出員工的姓名,部門編號,部門名字
select e.ename,e.deptno from emp e;
select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
select e.ename,e.deptno,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno
ENAME          DEPTNO
---------- ----------
SMITH              20
ALLEN              30
WARD               30
JONES              20
MARTIN             30
BLAKE              30
CLARK              10
SCOTT              20
KING               10
TURNER             30
ADAMS              20
JAMES              30
FORD               20
MILLER             10

DEPTNO  DNAME
------- ----------
10ACCOUNTING
20RESEARCH
30SALES
40OPERATIONS
2.非等值連線
查詢出員工姓名,工資,以及工資在公司的等級
select ename,sal,grade,losal,hisal from scott.emp,scott.salgrade s where sal between s.losal and s.hisal;
3.自連線
查詢出員工的工號,姓名,工資,領導的姓名,領導工資
select empno,ename,mgr from emp;
select e.empno,e.ename,e.sal,m.ename,m.sal from emp e,emp m where e.mgr=m.empno;
練習:
查詢出員工的姓名,工資,所在部門編號,部門名字,工資在公司的等級
emp,dept,salgrade
select e.ename,e.sal,e.deptno,d.dname,s.grade 
 from emp e,dept d,salgrade s 
 where e.deptno=d.deptno and e.sal between s.losal and s.hisal;
練習:四表查詢,查詢出員工姓名,工資,部門編號,部門名,工資等級,
領導姓名和工資,領導工資等級
1.分析是幾張表
2.查詢哪些欄位
3.落實查詢條件
4.先實現最簡單一部分功能,
select e.ename,e.sal,e.deptno,d.dname,s.grade,m.ename,m.sal,s.grade 
  from emp e,dept d,salgrade s,emp m,salgrade ms
  where e.deptno=d.deptno
  and e.sal between s.losal and s.hisal
  and e.mgr=m.empno and m.sal between ms.losal and ms.hisal;
   3.外連線
左連線:
在多表查詢時(+)寫在‘=’號右邊是左連線,左表是等號左邊的表,右表是等號右邊的表
特點:會顯示左表中所有行,如果左邊中某些行跟右表沒有匹配項,則該行在顯示時,對應右表部分會不顯示
右連線:
+出現在等號左邊,