查工资等级:
--工资等级 SELECT e.empno,e.ename,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN S.LOSAL AND S.HISAL;
查工资等级,并用中文表示:
--将等级替换成中文 SELECT e.empno,e.ename,e.sal,s.grade, decode(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') FROM emp e,salgrade s WHERE e.sal BETWEEN S.LOSAL AND S.HISAL;
三张表的查询:
--三张表的查询 SELECT e.empno,e.ename,e.job,e.sal, s.grade, decode(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') FROM emp e,dept d,salgrade s WHERE e.deptno=d.deptno AND e.sal BETWEEN S.LOSAL AND S.HISAL
左连接、右链接的查询:
--使用内连接只有满足连接条件的数据才会全部显示,可是如果说现在emp或者dept显示完整,那么可以利用外链接进行 --显示部门40 SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno(+) SELECT * FROM emp e,dept d WHERE e.deptno(+)=d.deptno
自身查询:
--自身关联 --在emp表存在mgr字段,表示雇员的领导 --查询出对应领导信息, SELECT * FROM emp e, emp m WHERE e.mgr=m.empno(+)
复杂的查询方法:
--查询在1981年雇佣的全部雇员的编号、姓名、雇佣日期、工作,领导、月工资、年工资、工资等级、部门编号、名称、位置,同时要求这些雇员的月工资在1500-3500之间,最后的结果按照年工资进行排列,工资相同,按照工作排序 --确定所需要的表 --emp:编号、姓名、雇佣日期、工作、月工资、计算年工资 --emp:领导姓名 --salgrade:工资等级 --确定已知的关联字段 --雇员和领导:emp.mgr=emp.empno --雇员和部门:emp.deptno=dept.deptno --雇员和工资等级:emp.sal between salgrade.losal and salgrade.hisal 步骤一:查询出所有1981年雇佣的雇员编号、姓名、雇佣日期、工作、月工资、年工资 SELECT e.empno,e.ename,e.hiredate,e.sal, (e.sal+NVL(e.comm,0))*12 income,m.ename, s.grade, decode(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') FROM emp e, emp m,salgrade s,dept d WHERE TO_CHAR(e.hiredate,'YYYY')='1981' AND e.sal BETWEEN 1500 AND 3500 AND e.mgr=m.empno(+) AND e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal ORDER BY income DESC ,e.job
还有其他的全连接及其他子句连接方法:
--还差全外链接 --SQL:1999语法 --交叉连接 --主要功能,产生笛卡儿积,产生56行,emp的14*dept4 SELECT * FROM emp CROSS JOIN dept --内链接的方式 SELECT * FROM emp NATURAL JOIN dept --USING子句 SELECT * FROM emp JOIN dept USING(deptno) --ON子句 SELECT * FROM emp e JOIN salgrade s ON (e.sal BETWEEN s.losal AND s.hisal) --全外链接只能依靠sql1999语法的
--右外连接
SELECT * FROM emp RIGHT OUTER JOIN dept USING(deptno)
--全外链接只能够sql1999语法 实现,但是对于这种全外链接,使用的情况不多 --个人建议,如果使用的是oracle,就用外链接(+) SELECT * FROM emp e FULL OUTER JOIN dept d ON (e.deptno=d.deptno)