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;