概述
多表联合查询又称之为 关联查询
SQL92 和 SQL99 是数据库的一个ANSI/ISO标准。它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。
多表联合查询在 SQL92 和 SQL99 有些不同,本文讲的是 SQL92
提出问题
查询员工所在部门名称、员工姓名、职务
部门名称在dept表,员工信息在emp表,为了完成上面的查询,就需要用到 多表联合查询,sql如下:
select dname,ename,job from emp,dept where emp.deptno=dept.deptno
结果
DNAME ENAME JOB
-------------- ---------- ---------
ACCOUNTING CLARK MANAGER
ACCOUNTING KING PRESIDENT
ACCOUNTING MILLER CLERK
RESEARCH JONES MANAGER
RESEARCH FORD ANALYST
RESEARCH ADAMS CLERK
RESEARCH SMITH CLERK
RESEARCH SCOTT ANALYST
SALES WARD SALESMAN
SALES TURNER SALESMAN
SALES ALLEN SALESMAN
SALES JAMES CLERK
SALES BLAKE MANAGER
SALES MARTIN SALESMAN
14 rows selected
笛卡尔积
笛卡尔积就是 笛卡尔乘积,是我们数学学的知识,两个集合的乘积
见下面的sql语句,from后面跟两个表名
select * from emp,dept
从结果中可知,emp表的每一条记录,与dept表的每一条记录都一 一对应
所以查询结果的行数=emp表行数*dept表行数
注意:
如果两个表的数据量很大,慎用笛卡尔积,否则会给数据库带来巨大压力
在笛卡尔积中,很多数据没有意义,比如:名字是SMITH的员工,其部门编号是20,但该记录与dept表的每一条记录都有对应,其实只有dept表中部门编号是20的,才有意义,其他的对应记录都没有意义

等值连接
查询员工所在部门名称、员工姓名、职务,并且是 emp表中deptno 与 dept表中deptno 相等的记录
select dname,ename,job from emp,dept where emp.deptno=dept.deptno
注意:
OPERATIONS部门没有查询出来,因为该部门的deptno是40,而emp表中没有员工的deptno是40的,所以查询不到
由于两个表中都有deptno,为了区分,所以在
where后面加上了 表名emp.deptno,dept.deptno如果
select后面的 列名,在两个表中都有,也要加上 表名 ,以示 区分,最好全都加上表名,如下:select emp.deptno,dept.dname,emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno如果表名长度较长,可以给表名起 别名,然后用
别名.列名,如下:select d.dname,e.ename,e.job from emp e,dept d where e.deptno=d.deptno
不等值连接
查询员工姓名、职务、工资、工资级别
工资级别在salgrade表中,
select e.ename,e.job,e.sal,s.grade from emp e,salgrade s where s.losal<=e.sal and e.sal<=s.hisal
自连接
查询员工姓名、职务、工资、上级领导姓名
在emp表中MGR是领导的编号,通过该编号查找emp表中的姓名,这种就是自己关联自己,sql如下:
select a.ename,a.job,a.sal,b.ename from emp a,emp b where a.mgr=b.empno
注意: 名字是KING的是董事长,没有领导,但查询结果里没有这条记录
练习
工资大于3000的,员工,所在的部门,工资
查询部门,并显示各部门的员工名称、薪资、奖金,以及和,按照部门名称排序
select a.dname,b.ename,nvl(b.sal,0)+nvl(b.comm,0) from dept a left join emp b on a.deptno=b.deptno order by dname
