您的位置:首页 > 数据库 > Oracle

Oracle笔记 三、function 、select

2012-09-06 15:14 411 查看
Scott表下有这么几个常用的表,而且还带有数据。分别是emp、dept、salgrade;

1、查看表结构用desc

descemp;


2、空表dual,最常用的空表,如:

select2*4fromdual;

selectsysdatefromdual;


3、双引号能保持格式

如:selectsysdate“toDay日期”fromdual;


4、||字符串连接

如:select2*3||8fromdual;

selectename||salfromscott.emp;

selectename||‘ORACLE’fromscott.emp;


5、单引号,如:select2*2||'abc''efg'fromdual;

用两个单引号表示一个单引号


6、去掉重复数据distinct

selectdistinctdeptnofromscott.emp;

去掉重复组合:selectdistinctdeptno,jobfromscott.emp;


7、where查询

A、=查询,select*fromscott.empwheresal=1500;


B、比较<、>、>=、<=

select*fromscott.empwheresal>1500;

C、andor

select*fromscott.empwheresal>1500andsal<=5000ordeptno=10;

D、in、notin

select*fromscott.empwheresalin(1500,800)anddeptnonotin(10,20)


E、like模糊escape转义

Select*fromscott.empwhereenamelike‘%in%’;

Select*fromscott.empwhereenamelike‘%in\%k%’;

Select*fromscott.empwhereenamelike‘%in#%k%’escape‘#’;

表示like中的#号是转义字符,相当于\

F、isnull、isnotnull

K、orderby

selectsal,enamefromscott.emporderbysal;

selectsal,enamefromscott.emporderbysalasc;

selectsal,enamefromscott.emporderbysaldesc;

selectsal,enamefromscott.empwheresal>2000orderbysaldesc;

selectsal,deptno,enamefromscott.emporderbysal,deptnodesc;


8、function

A、lower、upper、substr

selectlower(‘abcABC’)fromdual;

selectupper(‘abcABC’)fromdual;

substr(target,startIndex,length)

selectsubstr(‘abcABC’,1,3)fromdual;


B、chr、ascii

将数字安装ascii值转换成字符:selectchar(65)fromdual;

将字符转换成ascii值:selectascii(‘Z’)fromdual;


C、round、to_char

精确小数

selectround(22.456)fromdual;

保留2位小数:selectround(22.456,2)fromdual;

精确到个位:selectround(22.456,-1)fromdual;


货币

设置货币格式,000前面不足就用0代替

selectto_char(sal,'$000,000.00')fromscott.emp;

999就不会替换不足的地方,只会安装格式输出

selectto_char(sal,'$999,999.99')fromscott.emp;

本地货币格式

selectto_char(sal,'L999,999.99')fromscott.emp;


日期

日期格式

格式控制描述

YYYY、YYY、YY分别代表4位、3位、2位的数字年

YEAR年的拼写

MM数字月

MONTH月的全拼

MON月的缩写

DD数字日

DAY星期的全拼

DY星期的缩写

AM表示上午或者下午

HH24、HH1212小时制或24小时制

MI分钟

SS秒钟

SP数字的拼写

TH数字的序数词


“特殊字符”假如特殊字符

HH24:MI:SSAM15:43:20PM

selectto_char(sysdate,'YYYY-MM-DDHH:MI:SS')fromdual;

selectto_char(sysdate,'YYYY-MM-DDHH24:MI:SS')fromdual;


D、to_date、to_number、nvl

to_date(target,current_format)

selectto_date('2011-4-217:55:55','YYYY-MM-DDHH:MI:SS')fromdual;

selectto_number('$12,322.56','$999,999.99')+10fromdual;

selectto_number('$12,322.56','$00,000.00')+10fromdual;

selectto_number('22.56')+10fromdual;

nvl可以将某个字段的空值转换成指定的值

selectename,sal,nvl(comm,1.00)fromscott.emp;


9、groupfunction组函数:min、max、avg、sum、count

selectmax(sal)fromscott.emp;

selectmin(sal)fromscott.emp;

selectavg(sal)fromemp;

selectround(avg(sal),2)fromemp;

selectto_char(avg(sal),'L999,999.99')fromemp;

selectsum(sal)fromemp;

selectcount(comm)fromemp;

selectcount(distinctdeptno)fromemp;


10、groupby分组

selectdeptno,avg(sal)fromempgroupbydeptno;

selectdeptno,job,avg(sal)fromempgroupbydeptno,job;

求部门最高工资的所在部门的员工信息:

selectdeptno,ename,salfromempwheresalin(selectmax(sal)fromempgroupbydeptno);


11、having对分组数据进行过滤

求部门评价工资:

select*from(selectavg(sal)sal,deptnofromempgroupbydeptno)wheresal>2000;

selectavg(sal)sal,deptnofromempgroupbydeptnohavingavg(sal)>2000;


12、子查询

求部门分组后工资最高的员工信息

selectemp.ename,emp.sal,emp.deptnofromemp,(selectmax(sal)max_sal,deptnofromempgroupbydeptno)twhereemp.sal=t.max_salandemp.deptno=t.deptno;

求部门平均工资等级

selects.grade,t.deptno,t.avg_salfromscott.salgrades,(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)twheret.avg_sal>s.losalandt.avg_sal<s.hisal;(between)


13、自连接

selecta.ename,b.enamemgr_namefromempa,empbwherea.empno=b.mgr;


14、连接查询

selectdname,enamefromdept,empwheredept.deptno=emp.deptno;

selectdname,enamefromdeptjoinempondept.deptno=emp.deptno;

selectdname,enamefromdeptjoinempusing(deptno);

selectdname,enamefromdeptleftjoinempondept.deptno=emp.deptno;

selectdname,enamefromdeptrightjoinempondept.deptno=emp.deptno;

selectdname,enamefromdeptfulljoinempondept.deptno=emp.deptno;

selecta.ename,b.enamemgr_namefromempajoinempbona.mgr=b.empno;

selecta.ename,b.enamemgr_namefromempaleftjoinempbona.mgr=b.empno;


15、Rownum

selectrounum,deptno,dnamefromdept;

select*from(

selectrownumr,dept.*fromdept

)twheret.r>2;


16、树状结构查询

selectlevel,empno,ename,mgrfromemp

connectbypriormgr=empno;


17、排序函数

--按部门分组,给出分组后的序号

selectrow_number()over(partitionbydeptnoorderbysal),emp.*fromemp;


--rank排序,空出相同部分

selectrank()over(partitionbydeptnoorderbysal),emp.*fromemp;

selectrank()over(orderbydeptno),emp.*fromemp;

selectrank()over(orderbysal),emp.*fromemp;


--dense_rank排序给出相同序号,不空留序号

selectrank()over(orderbysal),emp.*fromemp;

selectdense_rank()over(orderbysal),emp.*fromemp;


18、交集、并集、割集查询

--并集:不带重复数据

select*fromemp

union

select*fromemp2;


--并集:带重复数据

select*fromemp

unionall

select*fromemp2;


--割集,显示不同部分

select*fromemp

minus

select*fromemp2;


19、查询系统表、视图

selectowner,object_name,object_type,status,dba_objects.*fromdba_objectswhereobject_type='view'andstatus='invalid';


select*fromuser_objectswhereobject_typelike'PROCEDURE';


20、练习题

--部门最高薪资员工信息

selectename,sal,deptnofromemp

wheresalin(selectmax(sal)fromempgroupbydeptno);


--部门最高薪资员工信息

selectename,sal,emp.deptnofromemp

join(selectmax(sal)max_sal,deptnofromempgroupbydeptno)t

onemp.deptno=t.deptnoandemp.sal=t.max_sal;


--部门平均薪资等级

selectgrade,losal,hisal,t.avg_salfromsalgrade

join(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)t

ont.avg_salbetweenlosalandhisal;


--经理人

selectename,jobfromempwhereempnoin(selectmgrfromemp);


--不用分组函数,查询薪水最高值

select*from(selectsal,enamefromemporderbysaldesc)whererownum=1;

selectdistincta.salfromempajoinempbona.sal>b.salwhererownum=1;

selectsalfromempwheresalnotin(selectdistincta.salfromempajoinempbona.sal<b.sal);


--部门平均薪水最高的部门编号

selectdeptno,t.avg_salfrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)t

whereavg_sal=(

selectmax(avg_sal)max_salfrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

);


selectdeptno,t.avg_salfrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)t

whereavg_sal=(

selectmax(avg(sal))max_salfromempgroupbydeptno

);


--部门平均薪水最高的部门名称

selectdnamefromdeptwheredeptno=(

selectdeptnofrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)t

whereavg_sal=(

selectmax(avg_sal)max_salfrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

)

);


selectdnamefromdeptwheredeptno=(

selectdeptnofrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)t

whereavg_sal=(

selectmax(avg(sal))fromempgroupbydeptno

)

);


--平均薪水最低的部门的部门名称

selectdnamefromdeptwheredeptno=(

selectdeptnofrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

whereavg_sal=(

selectmin(avg_sal)min_salfrom(

selectavg(sal)avg_salfromempgroupbydeptno

)

)

);


selectdnamefromdeptwheredeptno=(

selectdeptnofrom(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

whereavg_sal=(

selectmin(avg(sal))avg_salfromempgroupbydeptno

)

);


--平均薪水等级最低的部门的部门名称

selectdnamefromdeptwheredeptno=(

selectdeptnofrom(

selectgrade,t.deptnofromsalgradesjoin(

selectavg(sal)avg_sal,deptnofromempgroupbydeptno

)t

ont.avg_salbetweens.losalands.hisal

)

wheregrade=(

selectmin(grade)fromsalgradesjoin(

selectavg(sal)avg_sal,deptnofromempgroupbydeptno

)t

ont.avg_salbetweens.losalands.hisal

)

);


--部门经理人中,平均薪水最低的部门名称

selectt.deptno,dnamefrom(

selectsal,deptnofromempwhereempnoin(selectdistinctmgrfromemp)

)tjoindept

ont.deptno=dept.deptno

wheresal=(

selectmin(sal)fromempwhereempnoin(selectdistinctmgrfromemp)

);


--比普通员工的最高薪水还要高的经理人名称

select*from(

selectempno,ename,salfromempwhereempnoin(selectdistinctmgrfromempwheremgrisnotnull)

)t

wheret.sal>(

selectmax(sal)max_salfromempwhereempnonotin(

selectdistinctmgrfromempwheremgrisnotnull

)

);


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: