select ename from emp where empno=(select mgr from emp where ename='FORD');
4. 找出在任意年份2月受聘的所有员工
select ename from emp where extract(monthfrom hiredate)=2;
select ename from emp where to_char(hiredate,'mm')=2;
5. 列出员工表中每个部门的员工数(员工数必须大于 3),和部门名称
select dname,count(*)from emp e join dept d on e.deptno=d.deptno groupby e.deptno havingcount(*)>3;
6. 以职位分组,找出平均工资最高的两种职位
select rownum,e.*from(select job,avg(sal)from emp groupby job orderbyavg(sal)desc) e where rownum<=2;
7. 查找出不在部门 20,且比部门 20 中任何一个人工资都高的员工姓名、部门名称
select ename,dname from emp e join dept d on e.deptno=d.deptno and e.deptno<>20and sal>all(select sal from emp where deptno=20);
8. 得到平均工资大于 2000 的工作职种
select job from emp groupby job havingavg(sal)>2000;
9. 查找出职位和’MARTIN’ 或者’SMITH’一样的员工的平均工资
selectavg(sal)from emp where job in(select job from emp where ename in('MARTIN','SMITH'));
10. 查询出 king 所在部门的部门号\部门名称\部门人数
select deptno,dname,count(*)from emp e join dept d on e.deptno=d.deptno and e.deptno=(select deptno from emp where ename=’king’)groupby e.deptno,dname;
二、PLSQL编程
1、输入一个雇员编号,根据它所在的部门涨工资,规则:
• 10 部门上涨 10%
• 20 部门上涨 20%
• 30 部门上涨 30%
所有部门的上涨工资,最高不能超过 5000,如果超过 5000,则工资就为 5000。
set serveroutput ondeclare
v_deptno emp.deptno%type;
v_sal emp.sal%type;
v_empno emp.empno%type :=&a;beginselect deptno into v_deptno from emp where empno = v_empno;case v_deptno
when10thenupdate emp set sal=sal*1.1where deptno = v_deptno;when20thenupdate emp set sal=sal*1.2where deptno = v_deptno;when30thenupdate emp set sal=sal*1.3where deptno = v_deptno;endcase;update emp set sal=5000where deptno=v_deptno and sal>5000;end;
2、用 loop 循环结构,为 dept 表增加 50-90 这些部门
declare
i number(3) :=50;beginloopinsertinto dept(deptno)values(i);
i = i +10;exitwhen i>90;endloop;end;
declare
v_ename emp.ename%type :='&a';
v_mess emp%rowtype;beginselect*into v_mess from emp where ename = upper(v_ename);
dbms_output.put_line('雇员姓名:'|| v_mess.ename ||'雇员编号:'|| v_mess.empno);
exception
when no_data_found then
dbms_output.put_line('没有这个员工');end;
三、游标、函数和存储过程
1. 使用游标 和 loop 循环来显示所有部门的名称
declarecursorshowisselect dname from dept;
v_name dept.dname%type;beginopenshow;loopfetchshowinto v_name;exitwhenshow%not found;
dbms_output.put_line(v_name);endloop;closeshow;end;
2. 写一个函数 输入一个员工名字,判断该名字在员工表中是否存在。存在返回 1,不存在返回 0
createorreplacefunction if_emp (name emp.ename%type)return number
is
num number;beginselectcount(*)into num from emp where ename=upper(name);if num=0thenreturn0;elsereturn1;endif;end;set serveroutput on
v_name emp.ename%type :='&a';begin
dbms_output.put_line(if_emp(v_name));end;