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

Oracle笔记 三、function 、select

2012-07-02 08:26 351 查看
Scott表下有这么几个常用的表,而且还带有数据。分别是emp、dept、salgrade;
1、查看表结构用desc
desc emp;

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

select 2 * 4
from dual;
select sysdate
from dual;

3、双引号能保持格式

如:select sysdate “toDay
日期”
from dual;

4、||
字符串连接
如:select 2*3 || 8
from dual;

select ename || sal
from scott.emp;
select ename || ‘ORACLE’
from scott.emp;

5、单引号,如:select 2 * 2 ||
'abc''efg'from dual;

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

6、去掉重复数据distinct
selectdistinct deptno
from scott.emp;

去掉重复组合:selectdistinct deptno,job
from scott.emp;

7、where查询
A、=查询,select *
from scott.emp
where sal = 1500;

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

select *
from scott.emp where sal > 1500;
C、andor

select *
from scott.emp where sal > 1500
and sal <= 5000
or deptno = 10;
D、in、notin

select *
from scott.emp where sal
in (1500, 800)
and deptno notin (10, 20)

E、like模糊escape转义

Select * from scott.emp
where ename
like ‘%in%’;

Select *
from scott.emp where ename
like ‘%in\%k%’;

Select * from scott.emp
where ename
like ‘%in#%k%’
escape ‘#’;

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

K、 orderby

select sal, ename
from scott.emp orderby sal;

select sal, ename
from scott.emp
orderby sal
asc;

select sal, ename
from scott.emp orderby sal
desc;

select sal, ename
from scott.emp
where sal > 2000
orderby sal
desc;

select sal, deptno, ename
from scott.emp
orderby sal,deptno
desc;

8、function

A、lower、upper、substr

selectlower(‘abcABC’)
from dual;

selectupper(‘abcABC’)
from dual;

substr(target, startIndex, length)

select substr(‘abcABC’, 1, 3)
from dual;

B、chr、ascii

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

将字符转换成ascii值:select ascii(‘Z’)
from dual;

C、round、to_char

精确小数

select round(22.456)
from dual;

保留2位小数:select round(22.456, 2)
from dual;

精确到个位:select round(22.456, -1)
from dual;

货币

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

select to_char(sal,
'$000,000.00')
from scott.emp;

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

select to_char(sal,
'$999,999.99')
from scott.emp;

本地货币格式

select to_char(sal,
'L999,999.99')
from scott.emp;

日期

日期格式

格式控制描述

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

YEAR年的拼写

MM 数字月

MONTH月的全拼

MON 月的缩写

DD 数字日

DAY星期的全拼

DY 星期的缩写

AM 表示上午或者下午

HH24、HH12 12小时制或24小时制

MI 分钟

SS 秒钟

SP 数字的拼写

TH 数字的序数词

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

HH24:MI:SS AM 15:43:20 PM

select to_char(sysdate,
'YYYY-MM-DD HH:MI:SS')
from dual;

select to_char(sysdate,
'YYYY-MM-DD HH24:MI:SS')
from dual;

D、to_date、to_number、nvl

to_date(target, current_format)

select to_date('2011-4-2 17:55:55',
'YYYY-MM-DD HH:MI:SS')
from dual;

select to_number('$12,322.56',
'$999,999.99') + 10
from dual;

select to_number('$12,322.56',
'$00,000.00') + 10
from dual;

select to_number('22.56') + 10
from dual;

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

select ename, sal, nvl(comm, 1.00)
from scott.emp;

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

selectmax(sal)
from scott.emp;

selectmin(sal)
from scott.emp;

selectavg(sal)
from emp;

select round(avg(sal), 2)
from emp;

select to_char(avg(sal),
'L999,999.99')
from emp;

selectsum(sal)
from emp;

selectcount(comm)
from emp;

selectcount(distinct deptno)
from emp;

10、groupby分组
select deptno,
avg(sal)
from emp groupby deptno;

select deptno, job,
avg(sal)
from emp groupby deptno, job;
求部门最高工资的所在部门的员工信息:

select deptno, ename, sal
from emp
where sal in (selectmax(sal)
from emp
groupby deptno);

11、having对分组数据进行过滤
求部门评价工资:

select *
from (selectavg(sal) sal, deptno
from emp
groupby deptno)
where sal > 2000;
selectavg(sal) sal, deptno
from emp
groupby deptno
havingavg(sal) > 2000;

12、子查询

求部门分组后工资最高的员工信息
select emp.ename, emp.sal, emp.deptno
from emp, (selectmax(sal) max_sal, deptno
from emp
groupby deptno) t
where emp.sal = t.max_sal
and emp.deptno = t.deptno;

求部门平均工资等级
select s.grade, t.deptno, t.avg_sal
from scott.salgrade s, (select deptno,
avg(sal) avg_sal
from emp
groupby deptno) t
where t.avg_sal >s.losal
and t.avg_sal < s.hisal;(between)

13、自连接

select a.ename, b.ename mgr_name
from emp a, emp b
where a.empno = b.mgr;

14、连接查询
select dname, ename
from dept, emp
where dept.deptno = emp.deptno;

select dname, ename
from dept
join emp on dept.deptno =emp.deptno;
select dname, ename
from dept
join emp using(deptno);

select dname, ename
from dept
leftjoin emp
on dept.deptno = emp.deptno;
select dname, ename
from dept
rightjoin emp
on dept.deptno = emp.deptno;

select dname, ename
from dept
fulljoin emp
on dept.deptno = emp.deptno;
select a.ename, b.ename mgr_name
from emp a
join emp b on a.mgr = b.empno;

select a.ename, b.ename mgr_name
from emp a
leftjoin emp b
on a.mgr = b.empno;

15、 Rownum
select rounum, deptno, dname
from dept;

select *
from (

select rownum r, dept.*
from dept

) t where
t.r > 2;

16、树状结构查询
selectlevel, empno, ename, mgr
from emp

connectbyprior mgr = empno;

17、排序函数
--按部门分组,给出分组后的序号

select row_number()
over(partition
by deptno orderby sal), emp.*
from emp;

--rank排序,空出相同部分
select rank()
over(partition
by deptno orderby sal), emp.*
from emp;

select rank()
over(orderby deptno), emp.*
from emp;
select rank()
over(orderby sal), emp.*
from emp;

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

select rank()
over(orderby sal), emp.*
from emp;
select dense_rank()
over(orderby sal), emp.*
from emp;

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

--并集:不带重复数据
select *
from emp

union
select *
from emp2;

--并集:带重复数据

select *
from emp
unionall

select *
from emp2;

--割集,显示不同部分
select *
from emp

minus
select *
from emp2;

19、查询系统表、视图

select owner, object_name, object_type, status, dba_objects.*
from dba_objects
where object_type =
'view'and status =
'invalid';

select *
from user_objects
where object_type
like'PROCEDURE';

20、练习题
--部门最高薪资员工信息

select ename, sal, deptno
from emp

where sal
in (selectmax(sal)
from emp
groupby deptno);

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

select ename, sal, emp.deptno
from emp

join (selectmax(sal) max_sal,
deptno from emp
groupby deptno) t

on emp.deptno = t.deptno
and emp.sal =t.max_sal;

--部门平均薪资等级
select grade, losal, hisal, t.avg_sal
from salgrade

join (selectavg(sal) avg_sal, deptno
from emp
groupby deptno) t
on t.avg_sal
between losal
and hisal;

--经理人

select ename, job
from emp
where empno in (select mgr
from emp);

--不用分组函数,查询薪水最高值
select *
from (select sal, ename
from emp
orderby sal
desc) where rownum = 1;

selectdistinct a.sal
from emp a
join emp b on a.sal > b.sal
where rownum = 1;
select sal
from emp
where sal notin (selectdistinct
a.sal from emp a
join emp b
on a.sal < b.sal);

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

select deptno, t.avg_sal
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno) t
where avg_sal = (

selectmax(avg_sal) max_sal
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno)
);

select deptno, t.avg_sal
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno) t

where avg_sal = (

selectmax(avg(sal)) max_sal
from emp
groupby deptno

);

--部门平均薪水最高的部门名称
select dname
from dept
where deptno = (

select deptno
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno) t
where avg_sal = (

selectmax(avg_sal) max_sal
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno)
)

);

select dname
from dept where deptno = (

select deptno from (selectavg(sal) avg_sal,
deptno from emp
groupby deptno) t

where avg_sal = (

selectmax(avg(sal))
from emp
groupby deptno

)
);

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

select dname
from dept where deptno = (
select deptno
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno)

where avg_sal = (

selectmin(avg_sal) min_sal
from (

selectavg(sal) avg_sal
from emp
groupby deptno

)

)
);

select dname
from dept
where deptno = (

select deptno
from (selectavg(sal) avg_sal, deptno
from emp
groupby deptno)

where avg_sal = (

selectmin(avg(sal)) avg_sal
from emp
groupby deptno

)

);

--平均薪水等级最低的部门的部门名称
select dname
from dept
where deptno = (

select deptno
from (

select grade, t.deptno
from salgrade s
join (

selectavg(sal) avg_sal, deptno
from emp
groupby deptno

) t

on t.avg_sal
between s.losal
and s.hisal
)

where grade = (

selectmin(grade)
from salgrade s
join (

selectavg(sal) avg_sal, deptno
from emp
groupby deptno

) t

on t.avg_sal
between s.losal
and s.hisal
)

);

--部门经理人中,平均薪水最低的部门名称
select t.deptno, dname
from (

select sal, deptno
from emp
where empno in (selectdistinct mgr
from emp)
) t
join dept

on t.deptno = dept.deptno
where sal = (

selectmin(sal)
from emp
where empno in (selectdistinct mgr
from emp)
);

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

select *
from (

select empno, ename, sal
from emp
where empno in (selectdistinct mgr
from emp
where mgr isnotnull)

) t
where t.sal > (

selectmax(sal) max_sal
from emp
where empno notin (

selectdistinct mgr
from emp
where mgr isnotnull

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