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

Oracle笔记 三、function 、select

2014-10-27 23:34 381 查看
[code]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
)
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: