一、内连接
select * from emp ,dept ;
select * from emp ,dept where emp.deptno = dept.deptno;
select * from emp e , dept d where e.deptno = d.deptno;
select * from emp e, emp m where e.mgr = m.empno;
select e.empno ,e.ename,d.dname ,'||',m.empno ,m.ename
from emp e, emp m ,dept d
where e.mgr = m.empno and e.deptno = d.deptno;
select e.empno ,e.ename,d.dname ,'||',m.empno ,m.ename,d2.dname
from emp e, emp m ,dept d ,dept d2
where e.mgr = m.empno and e.deptno = d.deptno
and m.deptno = d2.deptno;
select e.empno ,e.ename,d.dname ,s1.grade,'||',m.empno ,m.ename,d2.dname ,s2.grade
from emp e, emp m ,dept d ,dept d2, salgrade s1 ,salgrade s2
where e.mgr = m.empno and e.deptno = d.deptno
and m.deptno = d2.deptno
and e.sal between s1.losal and s1.hisal
and m.sal between s2.losal and s2.hisal;
select
case 3
when 1 then '一'
when 2 then '二'
else '其他'
end
from dual;
select e.empno ,e.ename,d.dname ,
case s1.grade
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
when 4 then '四级'
else '其他'
end 员工工资等级
,'||',m.empno ,m.ename,d2.dname ,s2.grade
from emp e, emp m ,dept d ,dept d2, salgrade s1 ,salgrade s2
where e.mgr = m.empno and e.deptno = d.deptno
and m.deptno = d2.deptno
and e.sal between s1.losal and s1.hisal
and m.sal between s2.losal and s2.hisal;
select e.empno ,e.ename,d.dname ,
case s1.grade
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
when 4 then '四级'
else '其他'
end 员工工资等级
,'||',m.empno ,m.ename,d2.dname ,
decode(s2.grade ,4,'四级',5,'五级','其他')领导的工资等级
from emp e, emp m ,dept d ,dept d2, salgrade s1 ,salgrade s2
where e.mgr = m.empno and e.deptno = d.deptno
and m.deptno = d2.deptno
and e.sal between s1.losal and s1.hisal
and m.sal between s2.losal and s2.hisal;
二、外连接
select e.empno ,e.ename,m.empno ,m.ename
from emp e left join emp m
on e.mgr = m.empno;
select e.empno ,e.ename,m.empno ,m.ename
from emp m right join emp e
on e.mgr = m.empno;
select e.empno ,e.ename,m.empno ,m.ename
from emp m full join emp e
on e.mgr = m.empno;
select e.empno ,e.ename,m.empno ,m.ename
from emp e , emp m
where e.mgr = m.empno(+);
三、子查询
子查询:在一条sql语句中包含另一条sql查询语句
select * from emp where job = (select job from emp where empno = 7876);
select distinct deptno from emp ;
select * from dept where deptno in (10,20,30);
select * from dept where deptno =any (10,20,30);
select * from dept where deptno in (select distinct deptno from emp);
select min(sal) minsal,deptno from emp group by deptno;
select e.empno ,e.ename ,e.sal ,e.deptno, t.minsal ,t.deptno
from emp e,(select min(sal) minsal,deptno from emp group by deptno) t
where e.deptno = t.deptno and t.minsal = e.sal;
select * from emp where job = (select job from emp where empno = 7790);
四、exists运算符
select * from emp where exists (select * from emp where empno = 7788);
select * from emp where 1=1;
select * from emp where exists (select * from emp where empno = 8890);
select * from emp where 1=2;
select * from dept where deptno in (select distinct deptno from emp);
select * from dept d where
exists (select * from emp e where e.deptno = d.deptno);
五、分页
select e.*,rowid from emp e where rowid= 'AAAMfPAAEAAAAAgAAA';
select e.*,rownum from emp e;
select e.*,rownum from emp e where rownum <= 3;
select e.*,rownum from emp e
-- 把结果集作为表使用,做条件筛选
select t.*
from (select e.*,rownum rn from emp e) t
where t.rn between 4 and 6;
select e.* from emp e order by sal desc;
select t.*
from (select e.* from emp e order by sal desc) t
where rownum <= 3
-- 举例: 查询工资最高的 4 - 6名
-- 先按照工资的降序排序
select e.* from emp e order by sal desc
-- 作为表示用,生成行号
select t.* ,rownum rn from (select e.* from emp e order by sal desc) t
-- 作为表示用,条件筛选
select m.*
from (select t.* ,rownum rn from (select e.* from emp e order by sal desc) t) m
where m.rn between 4 and 6;
select t.*
from (select e.* ,row_number() over(order by sal desc) rn from emp e) t
where t.rn between 4 and 6;
六、练习
select avg(sal) , deptno from emp group by deptno;
select e.empno ,e.ename ,e.sal ,e.deptno , t.avgsal ,t.deptno
from emp e ,(select avg(sal) avgsal , deptno from emp group by deptno) t
where e.deptno = t.deptno and e.sal > t.avgsal;
select count(1),to_char(hiredate ,'yyyy') hireyear from emp group by to_char(hiredate ,'yyyy');
select sum(c) "Total",
avg(decode(hireyear ,'1980',c)) "1980",
avg(decode(hireyear ,'1981',c)) "1981",
avg(decode(hireyear ,'1982',c)) "1982",
avg(decode(hireyear ,'1987',c)) "1987"
from (select count(1) c,to_char(hiredate ,'yyyy') hireyear
from emp group by to_char(hiredate ,'yyyy')) t
七、集合运算符
select * from emp where deptno = 20
intersect
select * from emp where job = 'CLERK';
select * from emp where deptno = 20 and job = 'CLERK';
select * from emp where deptno = 20
union
select * from emp where job = 'CLERK';
select * from emp where deptno = 20 or job = 'CLERK';
select * from emp where deptno = 20
minus
select * from emp where job = 'CLERK';
select * from emp where job = 'CLERK'
minus
select * from emp where deptno = 20;
select empno ,ename from emp where deptno = 20
union
select deptno ,dname from dept;
八、递归查询
select * from emp
start with empno = 7369
connect by prior mgr = empno;
select * from emp
start with empno = 7839
connect by mgr = prior empno;