1. 假设A公司的管理系统中有部门信息表(Dept)、员工信息表(Emp)、 | |||||||
工资信息表(Sal),表结构如下图所示: | |||||||
Dept | |||||||
部门号 | 部门名称 | ||||||
Dno | Dname | ||||||
Emp | |||||||
员工号 | 姓名 | 性别 | 年龄 | 部门号 | |||
Eno | Ename | Esex | Eage | Dno | |||
Sal | |||||||
员工号 | 工资等级 | 工资 | |||||
Eno | Slevel | Ssal | |||||
请回答以下问题: | |||||||
1、查询所有在“研发部”的员工的员工号、姓名、性别和年龄,并且按姓名升序排序。 | |||||||
2、查询出工资最高的员工的工资和姓名。 | |||||||
3、在Emp表中增加字段备注(Eremark),允许为空,类型为字符串,最大长度为400。 | |||||||
4、给每个工资小于等于3000元的员工增加1000元工资。 | |||||||
5、现发现Sal表中记录比Emp中少几条,即有些员工的工资信息没有被存储到Sal表, | |||||||
请筛选出这些员工的员工号、姓名和所属部门名称。 |
1、select eno,ename,esex,eage from emp where dno =(select dno from dept where bname='研发部') order by ename asc select e.eno,e.ename,e.esex,e.eage,e.dno from emp e inner join dept d on e.dno=d.dno where dname='研发部' order by e.ename desc 2、select s.sal,e.ename from emp e,sal s where e.eno=s.eno and ssal=(select max (ssal) from sal ) 3、alter table emp add eremark varchar2400() 4、update sal set ssal=ssal +1000 where sal<=3000 5、select emp.eno,emp.ename,dept.dname from emp,dept where emp.eno=dept.dno and emp.eno not in (select eno from sal) ------------------------------- 1、seleect eno,eage from emp where dno= (select don from dept where dname='研发部') order by ename asc select e.eno,e.eage from emp e inner join dept d on e.do=d.do where d.dname='研发部' order by e.ename desc; 2、select s.sal,e.name from emp e innner joi n sal s where e.no =d.no and ssal=(select max(sal ) from sal) 3、alter table emp add eremark varchar2(400) 4 、update sal set sal=sal+1000 where sal<=3000 5、select emp.no,emp.name,dept.name from emp,dept whe re emp.no=dept.no and emp.no not in (select eno from sal) 使用左外连接: select emp.eno,dept.dno from emp left out join sal emp.no=sal.no inner join dept on emp.no=dept.no wh ere sal.no is null;--1. 表连接补充 --左外连接(左边表独有的数据)、 --右外连接(右边表独有的数据),--全外连接(两张表独有数据) --内连接 select e.*,d.* from emp e inner join dept d on e.deptno=d.deptno; select e.*,d.* from emp e,dept d where e.deptno=d.deptno; --左外连接 select e.*,d.* from emp e left join dept d on e.deptno=d.deptno; --左外连接(左边表独有的数据,右表为空) select e.*,d.* from emp e left join dept d on e.deptno=d.deptno where d.deptno is null; --右外连接 select e.*,d.* from emp e right join dept d on e.deptno=d.deptno; --右外连接(右边表独有的数据,左表为空) select e.*,d.* from emp e right join dept d on e.deptno=d.deptno where e.deptno is null; --全外连接 select e.*,d.* from emp e full join dept d on e.deptno=d.deptno; --全外连接(两张表独有数据,左表或右表为空) select e.*,d.* from emp e full join dept d on e.deptno=d.deptno where e.deptno is null or d.deptno is null; --like例子 select * from emp where empno like '76%'; select * from emp where ename like '_IN%'; select * from emp where ename like '_A%'; select * from emp where ename like '[A-Z]'; select * from emp where regexp_like(ename,'[A-C]'); select * from emp where regexp_like(empno,'^7[68]'); select * from emp where regexp_like(empno,'7[68]'); --3.rownum补充 -- 不能对ROWNUM使用>(大于或等于1的数值)、>=(大于1的数值)、=(大于1的数值) -- 所以直接用只能从1开始 -- rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1, --所以永远没有满足条件的记录。 select * from emp where rownum<=5; -- 查询第5到第10记录 select * from emp where rownum<=10; --如果想要用rownum不从1开始,需按下面方法使用 select a1.* from (select emp.*,rownum rn from emp) a1 where rn >5; select e.* from (select * from emp order by sal desc)e where rownum <=5; select * from emp; --分页一 select a1.* from (select e.*,rownum rn from emp e where rownum<=10) a1 where a1.rn>=5; --分页二 select a1.* from (select e.*,rownum rn from emp e) a1 where a1.rn>=5 and a1.rn<=10; select a1.* from (select e.*,rownum rn from emp e) a1 where a1.rn between 5 and 10; -- 分页三 select e.* from emp e; -- 分页三 select a1.* from (select b.*,rownum rn from (select * from emp order by sal desc) b where rownum<=10) a1 where a1.rn>=1; -- 分组查询 select * from emp; select * from dept; --显示部门平均工资低于2000的部门号和它的平均工资,并按平均工资倒序排列 select e.deptno,avg(sal) from emp e where e.deptno is not null group by e.deptno having avg(sal)<2000 order by avg(sal) desc;