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)步步为营
如:查询每个雇员的姓名、工资、部门名称、工资在公司的等级、及其领导的姓名及工资所在公司的等级
分析:需要雇员表与部门表、工资等级表,雇员与部门用部门编号连接,雇员与工资等级是用sal在工资表的LOSAL和HISAL的范围内来连接
第一步:首先查询每个雇员的姓名、工资、部门名称、工资在公司的等级
第二步:其领导的姓名及工资所在公司的等级,所以加入蓝色部分
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;
第三步:要求按照以下的样式显示工资等级:
-
第五等工资
-
第四等工资
-
第三等工资
-
第二等工资
-
第一等工资
此时肯定只能使用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;
-
左右连接
如dept表中有四个部门,emp表中的雇员在其中3个部门中,查询雇员及所在部门的编号、名称与位置
发现没有编号为40的部门,因为雇员没有在这个部门的,所以没有显示,如果想让它显示出来,就要用到右连接
(+)在=左边:表示右连接
(+)在=右边,表示左连接(系统默认就是左连接)
如:查找雇员的编号、姓名及其领导的编号、姓名