Oracle从多个表中获取数据
1.1 【表连接】
需求:查询员工的姓名、部门号、部门名称。
-- 查询员工的姓名、部门号、部门名称。
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept
2 where emp.deptno=dept.deptno;
注意:同一列名多表使用时,要写上表名做前缀。
SCOTT@orcl>seelct ename,deptno,dname from emp,dept where emp.deptno=dept.deptno;
列定义模糊
1.2 【笛卡尔积:交叉连接】
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept;
表连接不要忘记写 **where **条件。
1.3 【使用表的别名】
SCOTT@orcl>select e.ename,e.deptno,d.deptno,d.dname from emp e,dept d
2 where e.deptno=d.deptno;
1.4 【连接的类型】
分类标准不同
1.5 【等连接】
传统 **Oracle **连接语法:
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept
2 where emp.deptno=dept.deptno;
**SQL1999 **语法(标准 SQL)
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname
2 from emp inner join dept
3 on ( emp.deptno=dept.deptno);
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept,dname
2 from emp inner join dept
3 using(deptno);
连接列名称相同时,可以使用 using,但列名前不能加修饰
SCOTT@orcl>select emp.ename,deptno,dept.dname
2 from emp inner join dept
3 using(deptno);
1.5.1 自然连接
SCOTT@orcl>select emp.ename,deptno,dept.dname
2 from emp natural join dept;
<br />
1.6 【非等连接】
需求:查询员工的工资以及对应的工资等级
-- 查询员工的工资以及对应的工资等级
SCOTT@orcl>select e.empno,e.ename,e.sal,s.losal,s.grade
2 from emp e,salgrade s
3 where e.sal>=s.losal and e.sal<=s.hisal;
SCOTT@orcl>select e.empno,e.ename,e.sal,s.losal,s.hisal,s.grade
2 from emp e,salgrade s
3 where e.sal between s.losal and s.hisal;
SCOTT@orcl>select e.ename,e.sal,s.losal,s.hisal,s.grade from emp e join salgrade s
2 on (e.sal between s.losal and s.hisal)
3 where deptno in(10,20);
1.7 【外连接】
1.7.1 【环境准备】
1.7.2 【左外连接】
需求:列出所有员工及其对应部门信息, 包括没有部门的员工。
传统 **Oracle **连接语法:
SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno(+);
**SQL:1999 **语法:
SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
2 from emp e left outer join dept d on(e.deptno=d.deptno);
1.7.3 【右外连接】
需求:列出所有部门及其对应的员工信息, 包括没有员工的部门。
传统 **Oracle **连接语法
SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname from emp e,dept d
2 where e.deptno(+)=d.deptno;
**SQL:1999 **语法:
SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
2 from emp e right outer join dept d on(e.deptno=d.deptno);
1.7.4 【全外连接】
需求:查询员工对应的部门信息, 包括没有部门的员工和没有员工的部门
SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
2 from emp e full outer join dept d
3 on (e.deptno=d.deptno);
1.8 【自连接】
(表里有从属关系)
需求:查询员工的姓名以及其经理的姓名
员工的经理号 **= **经理的员工号
SCOTT@orcl>select e.empno,e.ename,e.mgr,m.empno,m.ename
2 from emp e,emp m
3 where e.mgr=m.empno;
SCOTT@orcl>select e.empno,e.ename,e.mgr,m.empno,m.ename
2 from emp e,emp m where e.mgr=m.empno(+);
1.9 【多表关联】
需求:查询员工的姓名、部门名称、工资等级
-- 查询员工的姓名、部门名称、工资等级
SCOTT@orcl>select e.ename,d.dname,s.grade
2 from emp e,dept d,salgrade s
3 where (e.sal between s.losal and s.hisal) and (e.deptno=d.deptno);
SCOTT@orcl>select e.ename,d.dname,s.grade
2 from emp e join dept d on (e.deptno=d.deptno)
3 join salgrade s on (e.sal between s.losal and s.hisal);
【总结】
等值连接、不等值连接、外连接、自连接
笛卡尔积:忽略了连接条件
左外连接:列出所有员工的部门信息,包括没有部门的员工。
e.deptno=d.deptno(+);
传统 **oracle **连接语法
left outer join dept d on (e.deptno=d.deptno);
**SQL:1999 **连接语法
右外连接:列出所有部门的员工信息,包括没有员工的部门。
e.deptno(+)=d.deptno;
right outer join dept d on (e.deptno=d.deptno);
全外连接
full outer join dept d on (e.deptno=d.deptno);
注意:同一个外连接查询需求,使用左外连接或者右外连接都可以实现!左外连接是把左边表里数据显示完整,包括不符合连接条件的行;
右外连接是把右边表里数据显示完整,包括不符合连接条件的行。
如何区分左右:传统 **oracle **连接语法看 **where **子句中比较符,标准 **SQL **看 **from **子句中 join。
【OCP】
051-7
join using/join on
051-121 表连接
join using / natural join