多表查詢(等值連接)
SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
FROM emp,dept
WHERE empno.deptno=dept.deptno AND loc=’NEW YORK’;
表起別名
SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc
FROM emp e , dept d
WHERE e.deptno=d.deptno;
非等值連接的數據檢索
SELECT e.ename,e.sal,s.grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
外部連接
加號相當於萬能行,這個行全部由空值組成。它可以和另一邊表中所有不滿足連接條件的行連接
SELECT e.ename,d.deptno,d.dname
FROM emp e,dept d
WHERE e.deptno(+) =d.deptno
ORDER BY e.deptno;
自身連接
SELECT worker.ename||'leader is'||manager.ename
FROM emp worker,emp manager
WHERE worker.mgr=manager.empno;
交叉連接 (沒用)
SELECT emp.empno,emp.ename,dept.loc
FROM emp
CROSS JOIN dept;
自然連接
對兩表之間相同名字和數據類型的列進行的等值連接
SELECT empno,ename,sal,deptno,loc
FROM emp
NATURAL JOIN dept;
USING子句
//和自然連接差不多,不過這個是指定列,範圍更細
//NATURAL JOIN子句和USING子句相互排斥,不能同時使用
SELECT empno,ename,sal,deptno,loc
FROM emp JOIN dept USING(deptno)
WHERE deptno=20;
ON子句
//指定任意連接條件,或指定任意要連接的列
查詢員工的姓名、編號、地址、主管姓名
SELECT e.empno,e.ename,d.loc,m.ename
FROM emp e
JOIN dept d
ON (e.deptno=d.deptno)
JOIN emp m
ON e.mgr=m.empno;
左外連接
//左邊爲基本表,右邊爲空的還是會顯示出來,作用和(+)差不多
SELECT e.ename,e.deptno,d.loc
FROM emp e
LEFT OUTER JOIN dept d
ON (e.deptno=d.deptno);
右外連接
SELECT e.ename,e.deptno,d.loc
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.deptno=d.deptno);
全外連接
SELECT e.ename,e.deptno,d.loc
FROM emp e
FULL OUTER JOIN dept d
ON (e.deptno=d.deptno);
練習
- SELECTename,dept.deptno,dept.dname FROMemp, dept;
- SELECTename,dept.deptno,dept.dname FROMemp, dept;
- SELECTename,dept.loc,emp.comm FROM emp,dept WHERE dept.loc!='CHICAGO' AND emp.comm IS NOT NULL;
- SELECT* FROM emp,dept;
- SELECTename,dname,hiredate
FROM emp
NATURAL JOIN dept
WHERE hiredate>'01-5月-80';
- SELECTename,dname,manager.ename
FROM emp worker,emp manager,dept
WHERE dept.deptno=worker.deptno
AND worker.mgr=manager.empno
AND worker.ename='SMITH';
- SELECTename,dname,sal,grade
FROM emp,dept,salgrade
WHERE emp.deptno=dept.deptno
AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal
AND grade>4;
- SELECTename,m.ename
FROM emp w,emp m
WHERE w.mgr=m.empno
AND (m.ename='KING' OR m.ename='FORD');
- SELECTename worker_name,w.hiredate,m.ename manager_name,m.hiredate
FROM emp w,emp m
WHERE w.mgr=m.empno
AND w.hiredate<m.hiredate;