7.多表查询

7.1笛卡尔集【使用Excel图表】

oracle-----------------多表查询

 

7.2连接类型

等值连接

查询员工信息: 员工号 姓名 月薪 部门名称

SQL> select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;

oracle-----------------多表查询

不等值连接

查询员工信息: 员工号 姓名 月薪 工资级别【员工表和级别表是没有外键关联的】

 

SQL> select * from salgrade;

SQL>select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal

外连接

1.按部门统计员工人数:部门号 部门名称 人数

SQL> select d.deptno,d.dname,count(e.empno) from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname;

oracle-----------------多表查询

  1. 对于某些不成立的记录,任然希望包含在最后的结果中

左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含

写法:where e.deptno=d.deptno(+)

右外连接:当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含

写法: where e.deptno(+)=d.deptno

SQL> select d.deptno,d.dname,count(e.empno) from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;

oracle-----------------多表查询

自连接

自连接: 通过表的别名,将同一张表视为多张表

查询员工信息:员工姓名 老板(上级)姓名

SQL> select e.ename 员工,b.ename 老板 from emp e,emp b where e.mgr = b.empno;

笛卡尔集总数

select count(*) from emp e,emp b;

 

 

 

7.3 层次查询

 

oracle-----------------多表查询

 

from 表

connect by prior 条件

start with 开始条件

 

select level,empno,ename,mgr

from emp

connect by prior empno=mgr

start with mgr=7566

order by 1

level是伪列

select level,empno,ename,mgr

from emp

connect by prior empno=mgr

start with mgr is null

order by 1

 

相关文章: