13垂涯、多表查詢:
笛卡爾積: ? ? SELECT e.empno,e.ename,e.job,e.sal,d.dname,s.grade?
? ? ? ? ? ? ? ? ? ? ? FROM emp e,dept d,salgrade s?
? ? ? ? ? ? ? ? ? ? ? WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal;?
內(nèi)連接:滿足關(guān)聯(lián)條件的數(shù)據(jù)出現(xiàn)颖侄,不滿足的不出現(xiàn)。
笛卡爾積外連接:指定一張數(shù)據(jù)表中的所有數(shù)據(jù)室抽,但是沒有對應(yīng)其他表數(shù)據(jù),內(nèi)容為NULL
左外連接:關(guān)聯(lián)數(shù)據(jù)1 = 關(guān)聯(lián)數(shù)據(jù)2(+)
右外連接:關(guān)聯(lián)數(shù)據(jù)1(+) = 關(guān)聯(lián)數(shù)據(jù)2全外連接靡努;
交叉連接:SELECT * FROM emp CROSS JOIN dept;
自然連接:SELECT * FROM emp NATURAL JOIN dept;
14坪圾、統(tǒng)計函數(shù):注意在數(shù)據(jù)表中沒有數(shù)據(jù)時候,只有COUNT函數(shù)會返回結(jié)果惑朦。
SELECT COUNT(*) 人數(shù),AVG(sal) 員工平均工資,SUM(sal) 每月總支出,MAX(sal) 最高工資, MIN(sal) 最低工資 FROM emp;COUNT(*):
可以準確返回表中的全部記錄數(shù)COUNT(字段):
統(tǒng)計不為空的所有數(shù)據(jù)量COUNT(DISTINCT):消除重復數(shù)據(jù)之后的結(jié)果注意:
如果查詢不使用GROUP BY,那么SELECT子句中只允許出現(xiàn)統(tǒng)計函數(shù)兽泄,其他任何字段都不能出現(xiàn)。
e.g SELECT COUNT(*) FROM emp;? ? ? ? ? ? 正確
e.g SELECT empno,COUNT(*) FROM emp;? ? ? 錯誤注意:如果查詢中使用了GROUP BY子句漾月,那么SELECT只允許出現(xiàn)分組字段病梢、統(tǒng)計函數(shù),其他任何字段都不能出現(xiàn)。
e.g SELECT job,COUNT(*) FROM emp GROUP BY job;? ? ? ? ? 正確
e.g SELECT ename,job,COUNT(*) FROM emp GROUP BY job;? ? 錯誤注意:統(tǒng)計函數(shù)允許嵌套蜓陌,但是嵌套之后的SELECT子句里只允許出現(xiàn)嵌套函數(shù)觅彰,而不允許其他字段,包括分組字段钮热。
e.g SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;? ? ? ? ? 正確
e.g SELECT deptno,MAX(AVG(sal)) FROM emp GROUP BY deptno;? ? 錯誤
15填抬、多表查詢和分組統(tǒng)計查詢所有部門的名稱:
SELECT d.dname, COUNT(e.empno), AVG(e.sal)FROM emp e, dept dWHERE e.deptno(+) = d.deptnoGROUP BY d.dname;
查詢每個部門編號、名稱隧期、位置飒责、部門人數(shù)、平均工資:
? ? ? ? ? ? ? SELECT d.deptno, d.dname, d.loc, COUNT(e.empno), AVG(e.sal)FROM emp e, dept dWHERE e.deptno(+) = d.deptnoGROUP BY d.deptno, d.dname, d.loc;
查詢每個職位的名稱厌秒,職位的平均工資读拆,且平均工資高于2000:
? ? ? ? ? ? ?SELECT job,AVG(sal)FROM empGROUP BY jobHAVING AVG(sal)>2000;
查詢所有非銷售人員的工作名稱及從事同一工作的雇員的月工資總和,并且要求滿足從事同一工作工資合計大于5000鸵闪,顯示按照月工資的合計的升序排列:
? ? ? ? ? ? ? SELECT job,SUM(sal) sumFROM empWHERE job<>'SALESMAN'GROUP BY jobHAVING SUM(sal)>5000ORDER BY sum;
查詢所有領(lǐng)取傭金和不領(lǐng)取傭金人員人數(shù)檐晕、平均工資:
? ? ? ? ? ? ? SELECT '領(lǐng)取傭金' info, COUNT(*), AVG(sal)FROM empWHERE comm IS NOT NULLUNIONSELECT '不領(lǐng)取傭金' info, COUNT(*), AVG(sal)FROM empWHERE comm IS NULL;
16、子查詢:
在WHERE子句中執(zhí)行子查詢:統(tǒng)計公司最低工資:SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);
查找公司最早雇員:SELECT * FROM emp WHERE hiredate=(SELECT MIN(hiredate) FROM emp);
查詢與SCOTT雇員同職位同薪水的員工:SELECT * FROM emp WHERE (sal,job)=(SELECT sal,job FROM emp WHERE ename='SCOTT') AND ename<>'SCOTT';
IN操作:查詢所有經(jīng)理的薪水:SELECT * FROM emp WHERE sal IN(SELECT sal FROM emp WHERE job='MANAGER');
NOT IN操作:一定要保證子查詢的結(jié)果沒有NULL
ANY操作:=ANY功能上與IN一樣:? ? ? ? SELECT * FROM emp WHERE sal =ANY(SELECT sal FROM emp WHERE job='MANAGER');
>ANY比子查詢最小的內(nèi)容要大: SELECT * FROM emp WHERE sal >ANY(SELECT sal FROM emp WHERE job='MANAGER');
ALL大于子查詢返回值最大的: SELECT * FROM emp WHERE sal >ALL(SELECT sal FROM emp WHERE job='MANAGER');(SELECT AVG(sal) FROM emp);
在SELECT子句中執(zhí)行子查詢:實際目的進行行列轉(zhuǎn)換
在FROM子句中執(zhí)行子查詢:子查詢的效率會比表連接查詢效率高
SELECT d.deptno, d.dname, d.loc, temp.count, temp.avg
FROM dept d,(SELECT deptno, COUNT(empno) count, AVG(sal) avg FROM emp GROUP BY deptno) temp
WHERE d.deptno = temp.deptno(+);
17蚌讼、復雜查詢例子
e.g 列出薪金高于在部門30工作的所有員工薪水的員工姓名和薪金辟灰、部門名稱、部門人數(shù)篡石。
SELECT e.empno, e.sal, d.dname, temp.count
FROM emp e, dept d,(
SELECT deptno dno, COUNT(empno) count
FROM emp
GROUP BY deptno) temp
WHERE e.sal > ALL(SELECT sal FROM emp WHERE deptno=30)
AND e.deptno = d.deptno
AND d.deptno=temp.dno;
e.g 列出與“SCOTT”從事相同工作的所有員工及部門名稱芥喇、部門人數(shù)、領(lǐng)導姓名凰萨。
SELECT e.empno, e.ename, e.job, d.dname, temp.count, m.ename
FROM emp e, dept d,(
SELECT deptno dno, COUNT(empno) count
FROM emp
GROUP BY deptno) temp, emp m
WHERE e.job=(SELECT job FROM emp WHERE ename='SCOTT')
AND e.ename<>'SCOTT'
AND e.deptno=d.deptno
AND d.deptno=temp.dno
AND e.mgr=m.empno;
e.g 列出薪金比"SMITH"或"ALLEN"多的員工編號继控、姓名、部門名稱胖眷、其領(lǐng)導姓名武通、部門人數(shù)、平均工資珊搀、最高及最低工資冶忱。
SELECT e.empno, e.ename, e.sal, d.dname, m.ename, temp.count, temp.avg, temp.max, temp.min
FROM emp e, dept d, emp m,(
SELECT deptno dno, COUNT(empno) count, AVG(sal) avg, MAX(sal) max, MIN(sal) min
FROM emp GROUP BY deptno) temp
WHERE e.sal>ANY(SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN'))
AND e.ename NOT IN('SMITH','ALLEN')
AND e.deptno=d.deptno
AND e.mgr=m.empno(+)
AND d.deptno=temp.dno;
e.g 列出受雇日期早于直接上級的所有員工編號、姓名境析、部門名稱囚枪、部門位置、部門人數(shù)劳淆。
SELECT e.empno, e.ename, d.dname, d.loc, temp.count
FROM emp e,emp m, dept d,(
SELECT deptno dno,COUNT(empno) count FROM emp GROUP BY deptno) temp
WHERE e.mgr=m.empno(+)
AND e.hiredate