多表查询
查询格式
(select 内容 from 范围 where 条件)
引入多表消除笛卡儿积
SQL> select * from emp,dept;
SQL> select * from emp, dept where emp.deptno=dept.deptno;
指定
select e.emp,e.ename,e.job, d.loc
from emp e,dept d
where e.deptno=d.deptno;
同一张emp组合查询
查询姓名 职位和领导姓名
select e.ename,e.job,m.ename
from emp e,emp m
where e.mgr=m.empno;
两张表组合查询
编号 姓名 基本工资 职位
姓名 部门名称 位置
思路: 1、首先确认需要的表;
emp表可以查询雇员的编号,姓名,职位;
dept表可以查询部门名称和位置;
2、确定表的关联字段;
emp.deptno=dept.deptno
select e.empno,e.ename,e.sal,e.job,m.ename,d.dname,d.loc
from emp e,emp m,dept d
where e.mgr=m.empno and e.deptno=d.deptno;
连接机制
查询字段时,需要多表关联,需要用到表别名,内连接,外连接,自然连接,自连接
一些关键连接方法。
内连接
内连接 A(inner) join B on 连接条件
内连接中用join on 取代where条件语句
内连接必须满足连接条件,不满足的信息无法显示
外连接
不同的左右链接方式产生的查询结果有差别
姓名 职位和领导姓名
左连接产生的结果
select e.ename,e.job,m.ename
from emp e left join emp m on e.mgr=m.empno;
SQL> select e.ename,e.job,m.ename
from emp e left join emp m on e.mgr=m.empno;
2
ENAME JOB ENAME
---------- --------- ----------
FORD ANALYST JONES
SCOTT ANALYST JONES
JAMES CLERK BLAKE
TURNER SALESMAN BLAKE
MARTIN SALESMAN BLAKE
WARD SALESMAN BLAKE
ALLEN SALESMAN BLAKE
MILLER CLERK CLARK
ADAMS CLERK SCOTT
CLARK MANAGER KING
BLAKE MANAGER KING
JONES MANAGER KING
SMITH CLERK FORD
KING PRESIDENT
14 rows selected.
右连接产生的结果
select e.ename,e.job,m.ename
from emp e right join emp m on e.mgr=m.empno;
SQL>
select e.ename,e.job,m.ename
from emp e right join emp m on e.mgr=m.empno;SQL> 2
ENAME JOB ENAME
---------- --------- ----------
SMITH CLERK FORD
ALLEN SALESMAN BLAKE
WARD SALESMAN BLAKE
JONES MANAGER KING
MARTIN SALESMAN BLAKE
BLAKE MANAGER KING
CLARK MANAGER KING
SCOTT ANALYST JONES
TURNER SALESMAN BLAKE
ADAMS CLERK SCOTT
JAMES CLERK BLAKE
FORD ANALYST JONES
MILLER CLERK CLARK
TURNER
WARD
MARTIN
ALLEN
MILLER
SMITH
ADAMS
JAMES
21 rows selected.
完全外连接 full join
select * from emp e full join dept d on e.deptno=d.deptno;
SQL> select e.empno,e.ename,d.dname from emp e full join dept d on e.deptno=d.deptno;
自然连接 natural join
Oracle 自动分区查询
缺点如果表名不确定,不能查询
自连接
注:连接必须在条件范围内查询