ok了家人们,今天学习了orcle的基本用法,一日不见,如隔三秋啊,
一.多表联合查询
和之前学习的MySQL数据库一样的用法,
1.1 笛卡尔积查询
SELECT * FROM A表,B表
查询员工表和部门表
select * from emp e, dept d;
emp
表和
dept
表的记录数的乘积,我们称其为笛卡尔积。
1.2 内连接查询
1.2.1 隐式内连接
SELECT * FROM A表,B表 where 关联条件
使用内连接查询员工编号、员工姓名、部门名称
select emp.empno,emp.ename,dept.dname from emp,
dept where emp.deptno=dept.deptno;
select e.empno,e.ename,d.dname from emp e, dept
d where e.deptno=d.deptno;
select e.empno 员工编号,e.ename 员工名称,d.dname 部
门名称 from emp e, dept d where
e.deptno=d.deptno;
1.2.2 显示内连接
select * from A表 inner join B表 on 关联条件;
使用内连接查询员工编号、员工姓名、部门名称
select emp.empno,emp.ename,dept.dname from emp
inner join dept on emp.deptno=dept.deptno;
select e.empno,e.ename,d.dname from emp e inner
join dept d on e.deptno=d.deptno;
select e.empno 员工编号,e.ename 员工名称,d.dname 部
门名称 from emp e inner join dept d on
e.deptno=d.deptno;
1.3 外连接查询
1.3.1 左外连接查询
左外连接查询两张表条件都满足的数据,以及左边表
(A
表
)
存
在的数据
(
以左边表为主查询表
)
。
select [字段][*] from A表 left join B表 on 关联条
件
需求:使用左外连接将
dept
表作为主查询表,查询员工编
号、员工姓名、部门名称。
select emp.empno ,emp.ename, dept.dname from
dept left join emp on dept.deptno = emp.deptno;
select e.empno ,e.ename, d.dname from dept d
left join emp e on d.deptno = e.deptno;
select e.empno 员工编号,e.ename 员工名称, d.dname
部门 from dept d left join emp e on d.deptno =
e.deptno;
1.3.2 右外连接查询
右外连接查询两张表条件都满足的数据,以及右边表
(B
表
)
存
在的数据
(
以右边表为主查询表
)
。
select [字段][*] from A表 right join B表 on 关联条
件
需求:使用右外连接将
dept
表作为主查询表,查询员工编
号、员工姓名、部门名称。
select emp.empno ,emp.ename, dept.dname from emp
right join dept on dept.deptno = emp.deptno;
select e.empno ,e.ename, d.dname from emp e
right join dept d on d.deptno = e.deptno;
select e.empno 员工编号,e.ename 员工名称, d.dname
部门 from emp e right join dept d on d.deptno =
e.deptno;
1.3.3 自连接查询
自连接其实就是站在不同的角度把一张表看成多张表。
需求:查询出员工姓名,员工领导姓名
select e1.ename, e2.ename from emp e1, emp e2
where e1.mgr = e2.empno;
查询出员工姓名,员工部门名称,员工领导姓名,员工领
导部门名称
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1, emp e2, dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;
1.4 子查询
1.4.1 子查询返回一个值
需求:查询出工资和
WARD
一样的员工信息
select * from emp where sal in
(select sal from emp where ename = 'WARD')
1.4.2 子查询返回一个集合
需求:查询出工资和
10
号部门任意员工一样的员工信息
select * from emp where sal in
(select sal from emp where deptno = 10);
1.4.3 子查询返回一张表
需求:查询出每个部门最低工资,和最低工资员工姓名,
和该员工所在部门名称
-- 先查询出每个部门最低工资
select deptno, min(sal) msal
from emp
group by deptno;
select t.deptno, t.msal, e.ename, d.dname
from (select deptno, min(sal) msal
from emp
group by deptno) t, emp e, dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;
二.Rownum与分页查询
rownum
行号:当我们做
select
操作的时候,每查询出一行记
录,就会在该行上加上一个行号,行号从
1
开始,依次递增,
不能跳着走。
rownum
不支持大于号,只支持小于号
需求:找到员工表中工资最高的前三名
select rownum,e.* from emp e;
-- 降序排序
select rownum,e.* from emp e order by sal desc;
-- 查询前3条 不是想要的结果
select rownum,e.* from emp e order by sal desc;
-- 查询前3条
select rownum,e1.* from (select rownum,e.* from
emp e order by sal desc) e1 where rownum <=3;
需求:
emp
表工资倒叙排列后,每页五条记录,查询第二页
-- 错误写法 rownum不支持大于号,只支持小于号
select rownum,e.* from (select * from emp order
by sal desc) e where rownum <11 and rownum <11
and rownum >5;
select * from
(select rownum rn,e.* from (select * from emp
order by sal desc) e where rownum <11) where rn
>5
see you later