分页,外连接

本文详细探讨了Oracle数据库中如何使用SQL外连接查询数据,结合实例阐述了左连接、右连接和全连接的用法。同时,介绍了在大量数据查询时,如何有效地实现分页查询,提高数据库查询性能。通过对索引和ROWNUM的使用,展示了实现高效分页的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 假设A公司的管理系统中有部门信息表(Dept)、员工信息表(Emp)、
工资信息表(Sal),表结构如下图所示:
Dept
部门号部门名称
DnoDname
Emp
员工号姓名性别年龄部门号
EnoEnameEsexEageDno
Sal
员工号工资等级工资
EnoSlevelSsal
请回答以下问题:
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 ,ename,esex ,eage   from  emp where  dno=  (select  don   from dept   where  dname='研发部')    order  by   ename asc
select   e.eno,e.ename,e.esex,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,emp.name,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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值