6.多表查询

1) 基本语法

a) 用WHERE消除笛卡尔积

SELECT * FROM emp,dept

WHERE emp.deptno=dept.deptno;

如果表名太长,可以给表起别名:

SELECT * FROM emp e,dept d

WHERE e.deptno=d.deptno;

b)自相关

如查询每个雇员的姓名、工作、雇员的直接上级领导的姓名(上级领导也是在雇员表中,所以是自相关)

    SELECT e.ename,e.job,m.ename

    FROM emp e,emp m

    WHERE e.mgr=m.empno;

c)步步为营

如:查询每个雇员的姓名、工资、部门名称、工资在公司的等级、及其领导的姓名及工资所在公司的等级

Oracle从零开始05——SQL语句04——多表查询_Oracle

分析:需要雇员表与部门表、工资等级表,雇员与部门用部门编号连接,雇员与工资等级是用sal在工资表的LOSAL和HISAL的范围内来连接

第一步:首先查询每个雇员的姓名、工资、部门名称、工资在公司的等级

Oracle从零开始05——SQL语句04——多表查询_从零开始_02

第二步:其领导的姓名及工资所在公司的等级,所以加入蓝色部分

SELECT e.ename, e.sal, d.dname, s.grade, m.ename, m.sal, ms.grade

FROM emp e, dept d, salgrade s, emp m, salgrade ms

WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal AND e.mgr=m.empno

            AND m.sal BETWEEN ms.losal AND ms.hisal;

Oracle从零开始05——SQL语句04——多表查询_05_03

第三步:要求按照以下的样式显示工资等级:

  1. 第五等工资
  2. 第四等工资
  3. 第三等工资
  4. 第二等工资
  5. 第一等工资

此时肯定只能使用DECODE()函数,将s.grade和ms.grade和改为红色部分

SELECT e.ename, e.sal, d.dname,

DECODE(s.grade,1,'第五等工资', 2,'第四等工资', 3,'第三等工资', 4,'第二等工资', 5,'第一等工资'),m.ename, m.sal, DECODE(ms.grade,1,'第五等工资', 2,'第四等工资', 2,'第三等工资', 4,'第二等工资', 5,'第一等工资')

FROM emp e, dept d, salgrade s, emp m, salgrade ms

WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal AND e.mgr=m.empno

            AND m.sal BETWEEN ms.losal AND ms.hisal;

Oracle从零开始05——SQL语句04——多表查询_05_04

  1. 左右连接

如dept表中有四个部门,emp表中的雇员在其中3个部门中,查询雇员及所在部门的编号、名称与位置

Oracle从零开始05——SQL语句04——多表查询_Oracle_05

发现没有编号为40的部门,因为雇员没有在这个部门的,所以没有显示,如果想让它显示出来,就要用到右连接

Oracle从零开始05——SQL语句04——多表查询_05_06

(+)在=左边:表示右连接

(+)在=右边,表示左连接(系统默认就是左连接)

如:查找雇员的编号、姓名及其领导的编号、姓名

Oracle从零开始05——SQL语句04——多表查询_从零开始_07