Oracle数据库(2)

select * from emp where deptno=30;

select ename,empno,deptno from emp where job='CLERK';

select * from emp where comm>sal;

select * from emp where comm>sal*0.6;

select * from emp where (deptno=10 and job='MANAGER') or(deptno=20 and job='CLERK');

select * from emp where comm is null or comm<100;

select * from emp where (sysdate - hiredate)>12;

select * from emp where extract(day from hiredate)=extract(day from last_day(hiredate)-2);

select * from emp where length(ename)=5;

select * from emp where ename not like '%R%';

select initcap(ename) from emp;

select ename,job,sal from emp order by job,sal;

select ename,extract(year from hiredate)year,extract(month from hiredate)month from emp order by year,month;

select ename,round((sysdate-hiredate),3) "天数" from emp;

select empno "编号" from emp;

select * from emp where sal>1500;

select * from emp where job!='CLERk';

select * from emp where sal>=1500 and sal<=3000;

select * from emp where job='SALESMAN' and sal>1200;

select * from emp where(deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK');

select * from emp where job!='CLERK' and sal>2000;

select * from emp where sal between 1500 and 3000 order by sal;

select * from emp where hiredate between '01-1月-81' and '31-12月-81';

select * from emp where comm is null;

select * from emp where comm is not null and comm>0;

select * from emp where (comm is null or comm=0) and sal>2000;

select * from emp where comm is null or comm<100;

select distinct job from emp where comm is null or comm<=0;

select * from emp where empno not in (7369,7788,null);--not in 中不能有null

select * from emp where length(ename)>=6;

select * from emp where sal like '%1%' and hiredate not like '%81%';

select empno,ename from emp group by empno,ename;

select * from emp order by sal desc;

select * from emp order by sal desc,hiredate;

select ename ,replace(ename,'A','_') from emp;

select * from emp where substr(ename,1,3)='JAM';

select ename,substr(ename,-2,2) from emp;

select empno 雇员编号,ename 雇员姓名,trunc((sysdate-10)-hiredate) 十天前的雇佣时间 from emp; 

select sysdate,add_months(sysdate,3) from dual;

--查询每个雇员在被雇佣三个月之后的日期:
select empno,ename,job,sal,hiredate,add_months(hiredate,3) from emp;

select sysdate,next_day(sysdate,'星期一') 下一个星期一 from dual;

--查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整时间
select empno,ename,job,hiredate,last_day(hiredate) from emp where last_day(hiredate)-2=hiredate;

--查询每个雇员的编号、姓名、雇佣时间、
select empno 雇员编号,ename 雇佣姓名,hiredate 雇佣日期,trunc(Months_between(sysdate,hiredate)) 雇佣总月数,trunc(months_between(sysdate,hiredate)/12) 雇佣总年份,trunc(sysdate-hiredate) 雇佣总天数 from emp;

--截取日期中的年月日
select extract(year from sysdate) year,extract(month from sysdate)month,extract(day from sysdate)day from dual;

select extract(year from systimestamp)year,extract(month from systimestamp)month,extract(day from systimestamp)day,extract(hour from systimestamp)hour,extract(minute from systimestamp)minute,extract(second from systimestamp)second from dual;

--to_timestamp()将字符转换为时间戳;
select to_timestamp('1997-09-01','yyyy-MM-dd') from dual;

--to_char()可以将数据进行格式化,9表示以为数字,0表示前导0,$表示货币的符号,L表示根据语言环境显示货币符号
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')格式化日期 from dual;

select to_char(sysdate,'year-month-day')格式化日期 from dual;

--查询雇佣的月:
select to_char(hiredate,'yyyy') 雇佣年,to_char(hiredate,'mm') 雇佣月,to_char(hiredate,'dd') 雇佣日 from emp;

select * from emp where to_char(hiredate,'mm')='02';

select to_char(3456789.5678,'L999,999,999,999.999')格式化数据 from dual;

--to_date()函数:将字符串变为日期形式;
select to_date('1997-09-01','yyyy-mm-dd') from dual;

select '09'+'78' from dual;--87

--通用函数:
--nvl()
--要求查询每个雇员的编号、姓名、职位、雇佣日期、年薪:
select empno,ename,job,hiredate,(sal+nvl(comm,0))*12 年薪 from emp;

select nvl(null,3),nvl(4,5) from dual; --如果为空,则显示第二个参数,否则显示第一个参数

select nvl2(3,1,-1) from dual;--nvl2(p1,p2,p3)如果参数p1为空,则显示第三个参数,否则显示第二个参数

select empno,ename,job,(sal+nvl(comm,0))*12 年薪1,nvl2(comm,sal+comm,sal)*12 年薪2 from emp;

--nullif()函数,相同返回空,不同返回第一个参数
select nullif(1,1),nullif(1,2) from dual;

select empno,ename,length(ename),job,length(job),nullif(length(ename),length(job)) nullif from emp;

--decode()函数:相当于程序中的if...elseif..elseif...else..
select decode(2,1,'n1',2,'n2') from dual;

--查询雇员的姓名、职位
select ename,sal,job,decode(job,'CLERK','办事员','SALESMAN','销售员','MANAGER','经理','ANALYST','分析员') from emp;

select ename,sal,case job when 'CLERK' then sal*1.1 when 'MANAGER' then sal*1.2 else sal*1.4 end 工资 from emp;

--coalesce()选择查询函数,当第一个为空,则选择第二个,第二个为空选择第三个...
select comm,coalesce(comm,null,100) from emp;

--多表查询:
--统计emp表中的数据量
select count(*) from emp;
select count(*) from dept;

select * from emp,dept;

--查询雇员的编号、姓名、职位、基本工资、部门名称、部门编号
select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;

--查询每个雇员的编号、姓名、雇佣日期、基本工资、部门名称、工资等级
select e.empno,e.ename,e.hiredate,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;

select e.empno,e.ename,e.hiredate,e.sal,d.dname,decode(s.grade,1,'E',2,'D',3,'C',4,'B',5,'A')工资等级 from emp e,salgrade s,dept d where e.deptno=d.deptno and e.sal between s.losal and s.hisal;

select * from emp,dept where emp.deptno(+)=dept.deptno

--查询每个雇员的编号、姓名及其上级领导的编号、姓名
select e.empno eno,e.ename ename,m.empno meno,m.ename from emp e,emp m where e.mgr=m.empno(+);

--查询在1981年雇佣的全部雇员的编号、姓名、雇佣日期、工作、月工资、年工资、工资等级、部门编号、部门名称、位置、同时要求这些雇员的月工资在1500~3500之间、最后的结果按照年工资进行排序,工资相同按照工作排序

select e.empno 雇员编号,e.ename 雇员姓名,e.hiredate 雇佣日期,e.job 职位,e.sal 月工资,nvl2(e.comm,e.sal+e.comm,e.sal)*12 年工资 ,m.ename 领导姓名,s.grade 工资等级,d.deptno 部门编号,d.dname 部门名称,d.loc 部门位置 from emp e,salgrade s,dept d,emp m where (e.mgr=m.empno) and (d.deptno=e.deptno) and (e.sal between s.losal and s.hisal) and (e.sal between 1500 and 3500) and to_char(e.hiredate,'yyyy')='1981' order by 年工资,e.job;

--SQL1999语法:
--交叉连接:
select * from emp natural join dept ;--本身是一种内连接

--USING子句
select * from emp join dept using(deptno);

select * from emp e join salgrade s on(e.sal between s.losal and s.hisal);

--全外连接只能使用sql1999语法来实现
--select * from emp e right outer join dept d on(e.deptno=d.deptno)
select * from emp e full outer join dept d on(e.deptno=d.deptno)

--数据的集合运算:集合运算时一种二目运算符,集合操作时,各个查询语句返回的结构要求是一致的
--union 并,(重复不显示),union all 并,重复显示,
select * from dept union all select * from dept where deptno=10;--在能使用的情况下可以代替or

select * from emp where job='SALESMAN' or job='CLERK';--建议写成union,可以提高性能
select * from emp where job='SALESMAN' union select * from emp where job='CLERK';

--minus 差
select * from dept minus select * from dept where deptno=10;

--intersect 交集
select * from dept intersect select * from dept where deptno=10;

--统计函数:
--count():可以统计一张表中的所有数据量
--sum()列字段的总和
select sum(sal) from emp;

--查询公司的最高工资、最低工资、平均工资
select avg(sal),round(avg(sal),2),max(sal),min(sal) from emp;

--统计公司最早雇佣和最晚雇佣日期
select min(hiredate)最早雇佣日期,max(hiredate)最晚雇佣日期 from emp;

--统计公司工资之中中间的工资值
select median(sal) from emp;

select count(comm) from emp;

--查询每个部门的部门名称和每个部门的最低工资
select m.ename 领导姓名,e.empno 雇员编号,e.ename 雇员姓名,e.sal 雇员工资,d.dname 部门名称,t.最低工资,t.平均工资,t.最高工资 from emp m, dept d,emp e,(select deptno,min(sal)最低工资,round(avg(sal),2)平均工资,max(sal)最高工资 from emp group by deptno) t where d.deptno=t.deptno and e.sal=t.最高工资 and m.empno=e.mgr and t.平均工资>2000 order by e.sal;

--统计函数允许嵌套使用,select子句中不允许出现其他任何字段
select deptno, avg(sal) from emp group by deptno;

--在没有使用group by子句的情况下,select子句中统计函数和其他任何字段不能共存
select count(empno) from emp;

--查询每个部门的名称、部门人数、部门的平均工资、平均服务年限
select d.dname 部门名称,count(d.deptno) 部门人数,round(avg(e.sal),2) 平均工资,round(avg(months_between(sysdate,e.hiredate)/12),2)平均服务年限 from dept d,emp e where d.deptno=e.deptno(+) group by d.dname;

--查询公司各个工资等级雇员的数量,平均工资
select s.grade 工资等级 ,count(e.empno) 每个等级的雇员数,round(avg(e.sal),2) 平均工资 from salgrade s,emp e where e.sal between s.losal and s.hisal group by s.grade;

--查询领取佣金与不领取佣金的雇员的平均工资、平均雇佣年限、雇员人数
select '有佣金',round(avg(e.sal),2),round(avg(months_between(sysdate,hiredate)/12),2),count(e.empno) from emp e where nvl(comm,0)>0 union select '无佣金', round(avg(e.sal),2),round(avg(months_between(sysdate,hiredate)/12),2),count(e.empno) from emp e where nvl(comm,0)<=0;

select nvl2(comm,'有佣金','无佣金') ,round(avg(e.sal),2),round(avg(months_between(sysdate,hiredate)/12),2),count(e.empno) from emp e group by nvl2(comm,'有佣金','无佣金') ;

--多字段分组:
--查询每个部门的详细信息、平均工资、总工资、最高工资、最低工资、部门人数
select d.deptno 部门编号,d.dname 部门名称,d.loc 部门位置,round(avg(e.sal),2) 平均工资,sum(e.sal) 总工资, max(e.sal) 最高工资, min(e.sal) 最低工资,count(e.empno) 部门总人数 from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno,d.dname,d.loc

--having 子句:
--having子句是对group by 子句操作之后的再次过滤,而where是在执行from子句之后执行。因此having子句只能和group by子句配合使用
--查询所有平均工资大于2000的职位信息、平均工资、雇员人数
select distinct e.job 职位名称, round(avg(e.sal),2) 平均工资,count(e.empno) 总人数 from emp e group by job having round(avg(e.sal),2)>2000 order by job desc;

--查询出至少有一个员工所在部门编号、名称、并统计出这些部门的平均工资、最低工资、最高工资
select d.deptno 部门编号,d.dname 部门名称,round(avg(e.sal),2) 平均工资,min(e.sal) 最低工资,max(e.sal) 最高工资 from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno,d.dname having count(e.empno)>=1;

--查询非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足形式同一工作的雇员的月工资合计大于5000,输出结果按月工资的合计升序排列。
select job 工作名称, sum(sal) 月工资总和 from emp where job!='SALESMAN' group by job having sum(sal)>5000 order by 月工资总和;

--子查询:

/*
子查询可以返回的数据类型一共分为四种:
1.单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
2.单行多列:返回一行数据中多个列的内容
3.多行多列:返回多行记录之中同一列的内容,相当于给出了一个操作的范围
4.多行多列:查询返回的结果时一张临时表。
子句查询常见的操作;
1.where子句:此时子查询范湖的结果一般都是单行单列,单行多列,多行单列
2.having子句:此时子查询返回的结果时单行单列数据,同时为了使用统计函数的操作;
3.from子句:此时子查询返回的结果一般都是多行多列,可以按照一张数据表(临时表)的形式操作。
*/

--where子句中使用子查询:

--查询出公司中工资最低的雇员信息
select * from emp where sal=(select min(sal) from emp);

--查询出基本工资比ALLEN低的全部雇员信息
select * from emp where sal<(select sal from emp where ename='ALLEN');

--查询基本工资高于公司平均新金的全部雇员信息
select *from emp where sal>(select avg(sal) from emp);

--查询与ALLEN从事相同工作、并且基本工资高于雇员编号为7521全部雇员的信息
select * from emp where job=(select job from emp where ename='ALLEN') and sal>(select sal from emp where empno=7521);
select * from emp where job=(select job from emp where ename='ALLEN') minus select * from emp where sal>(select sal from emp where empno=7521);

--子查询返回单行多列:
--查询与scott从事相同工作的雇员信息

select * from emp where job=(select job from emp where ename='SCOTT') and ename!='SCOTT';
select * from emp where job=(select job from emp where ename='SCOTT') minus select * from emp where ename='SCOTT';

--查询与雇员7566从事相同工作的全部雇员信息
select * from emp where job=(select job from emp where empno=7566);

--查询与ALLEN相同工作并且在同一年雇佣的全部雇员信息(包括ALEEN)
select job from emp where ename='ALLEN';
select to_char(hiredate,'yyyy') from emp where ename='ALLEN';
select * from emp where job=(select job from emp where ename='ALLEN') and to_char(hiredate,'yyyy')=(select to_char(hiredate,'yyyy') from emp where ename='ALLEN');

--子查询返回多行单列:
--IN 操作:
--查询与每个部门中最低工资相同的全部雇员信息
select min(e.sal) from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno;
select * from emp where sal in (select min(sal) from emp group by deptno);
select * from emp where sal in(select min(e.sal) from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno);
select * from emp e, (select min(e.sal) minsal from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno) t where sal=t.minsal;

--查询出与每个部门中不是最低工资相同的全部雇员信息
select min(sal) from emp group by deptno;
select * from emp where sal not in (select min(sal) from emp group by deptno);

/*
 ANY 操作符:
 any在使用中有如下三种使用形式:
 1.=any:表示与子查询中的每个元素进行比较,功能与in类似(然而<>any不等价于not in);
 2.>any:比子查询中返回结果的最小的要大(还包含了>=any);
 3.<any:比子查询中返回的结果的最大要小(还包含了<=any).
*/

--查询每个部门经理的最低工资:--此时等于any相当于in操作
select min(sal) from emp where job='MANAGER' group by deptno;
select * from emp where sal=any(select min(sal) from emp where job='MANAGER' group by deptno);
--此时小any相当于
select * from emp where sal<any(select min(sal) from emp where job='MANAGER' group by deptno);

/*
 ALL操作:
 all 操作符有以下三种用法:
 1.<>all:等价于not in (但=all并不等价于in);
 2.>all: 比子查询中最大的值还要大(还包含了>=all);
 3.<all: 比子查询中最小的值还要小(还包含了<=all)。
*/
--等于all并没有任何返回值
select * from emp where sal=all(select min(sal) from emp where job='MANAGER' group by deptno);
select * from emp where sal>all(select min(sal) from emp where job='MANAGER' group by deptno);
select * from emp where sal<all(select min(sal) from emp where job='MANAGER' group by deptno);

--在where子句中使用子查询:
--空数据判断:
--在sql中提供了一个exists结构用于判断子查询是否有数据返回,如果子查询中有数据返回,则exists结构返回true,反之返回false.
select * from emp where not exists( select * from emp where empno=9999);

--Having中使用子句查询:一般having中的子句查询返回的是单行单列的数据
--查询部门编号、雇员人数、平均工资、并且要求这些部门的平均工资高于公司平均新金
select avg(sal) from emp;
select deptno,count(empno),avg(sal) from emp group by deptno having(avg(sal)>(select avg(sal) from emp));

--查询出每个部门平均工资最高的部门名称以及平均工资
select max(avg(sal)) from emp group by deptno;--求出平均工资最高的平均工资
select d.dname,avg(e.sal) from emp e,dept d where e.deptno=d.deptno group by d.dname having avg(e.sal)=(select max(avg(sal)) from emp group by deptno);

--在from中使用子查询:
--查询每个部门的编号、名称、位置、部门人数、平均工资
select count(empno),avg(sal) from emp group by deptno;
select d.deptno 部门编号,d.dname 部门名称,d.loc 部门位置,t.count 部门人数,round(t.avgsal,2) 平均工资 from dept d,(select deptno,count(empno) count,avg(sal) avgsal from emp group by deptno) t where t.deptno(+)=d.deptno;

-- 查询所有在部门‘SALES’工作的员工的编号、姓名、基本工资、奖金、职位、雇佣日期、部门的最高和最低工资
select empno,ename,sal,nvl2(comm,comm,0),job,hiredate from emp;
select deptno from dept where dname='SALES';
select min(sal),max(sal) from emp group by deptno;
select e.empno,e.deptno,e.ename,e.sal,nvl2(e.comm,e.comm,0),e.job,e.hiredate,t.minsal,t.maxsal from emp e,(select deptno,min(sal) minsal,max(sal) maxsal from emp group by deptno) t where e.deptno=t.deptno and e.deptno=(select deptno from dept where dname='SALES');

--查询所有新金高于公司平均新金的员工编号、姓名、基本工资、职位、雇佣日期、所在部门的名称、位置、上级领导姓名、公司的工资等级,部门人数、平均工资、平均服务年限

select e.empno,e.ename,e.sal,e.hiredate,m.ename,s.grade,d.dname,d.loc,t.sum,t.avgsal,t.avghiredate from emp e,emp m,salgrade s,dept d,(select deptno,count(empno) sum, round(avg(sal),2) avgsal,round(avg(months_between(sysdate,hiredate)),2) avghiredate from emp group by deptno) t where e.sal>(select avg(sal) from emp) and e.empno=m.empno and (e.sal between s.losal and s.hisal) and d.deptno(+)=e.deptno and e.deptno=t.deptno(+) order by sal desc;
1.select avg(sal) from emp;
2.select e.empno,e.ename,e.sal,e.hiredate from emp;
3.select d.dname,d.loc from dept d;
4.select m.ename from emp m;
5.select s.grade from salgrade;
6.select deptno,count(empno) sum, round(avg(sal),2) avgsal,round(avg(months_between(sysdate,hiredate)),2) avghiredate from emp group by deptno;

--列出新金比‘ALLEN’ 或‘CLARK’多的所有员工的编号、姓名、基本工资、部门名称、领导姓名、部门人数
1.select e.empno,e.ename,e.sal from emp e;
2.select d.dname from dept d;
3.select m.ename from emp m;
4.(select count(e.empno)count from emp group by deptno) t;
5.select sal from emp where ename='ALLEN';
6.select sal from emp where ename='CLARK';
select e.empno 雇员编号,e.ename 雇员姓名,e.sal 基本工资, d.dname 部门名称,m.ename 领导姓名 from emp e,dept d,emp m,(select deptno, count(empno)count from emp group by deptno) t where e.deptno=d.deptno(+) and e.mgr=m.empno and t.deptno=e.deptno(+) and (e.sal>(select sal from emp where ename='ALLEN') or e.sal>(select sal from emp where ename='CLARK'));

--列出各个部门的经理(假设每个部门只有一个经理)姓名、薪金、部门名称、部门人数、部门的平均工资
1.select m.ename,m.sal from emp m where job='MANAGER';
2.select d.dname from dept d;
3.(select count(e.empno)count ,avg(sal) avgsal from emp e group by e.deptno) t;
select m.ename 经理姓名,m.sal 基本工资,t.count 部门人数,t.avgsal 平均工资,d.dname 部门名称 from emp m,(select deptno,count(e.empno)count ,round(avg(sal),2) avgsal from emp e group by e.deptno) t,dept d where job='MANAGER' and t.deptno(+)=m.deptno and d.deptno(+)=m.deptno;

 

posted @ 2016-08-08 08:48  非若  阅读(318)  评论(0编辑  收藏  举报