語法:
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;