标签:
语法:
SELECT [DISTINCT] * | 列名称 [AS]别名,........
FROM 表名称1 [别名1],表名称2 [别名2],...
[WHERE 条件(s)]
[ORDER BY 排序的字段 1,ASC| DESC,排序的字段2 ASC| DESC,....]
SELECT * FROM EMP,DEPT;
查询结果可以看到有56条记录,而emp表只有14条,dept表只有4条,很多重复记录,这就是多表查询所产生的笛卡尔积
消除笛卡尔积,在where中加入条件来消除
SELECT * FROM emp e,dept d
WHERE e.deptno=d.deptno;
这样结果就正常了
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno;
此时要想进行等级查询就要用要salgrade表,但是salgrade表中并没有字段与emp表中字段相对应,但是在salgrade表中有losal(最低工资)、hisal(最高工资)用于表示一个工资等级的范围,所以,可以通过BETWEEN...AND进行笛卡尔积的消除
SELECT e.empno,e.ename,e.hiredate,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT e.empno,e.ename,e.hiredate,e.sal, 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;
数据在3张表中emp,dept,salgrade
SELECT e.ename,e.sal,d.dname, 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;
标签:
原文地址:http://www.cnblogs.com/liunanjava/p/4214388.html