/* SQL語句的歷史版本 SQL89 比較多 SQL92 SQL99 多表關聯查詢 笛卡爾積 等值關聯查詢 非等值關聯查詢 左外連接 右外連接 全外連接 自連接 */ ----------------------------------92語法 --查詢部門名稱和員工名稱(兩張表的關聯沒有任何的約束條件) SELECT * FROM EMP; SELECT * FROM DEPT; SELECT * FROM SALGRADE; SELECT * FROM EMP,DEPT; SELECT * FROM EMP,DEPT,SALGRADE; --等值關聯查詢 SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; SELECT DEPT.DNAME,EMP.ENAME FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; --查詢sott所在的部門名稱 SELECT DEPT.DNAME FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.ENAME = 'SCOTT'; --非等值關聯查詢 SELECT EMP.ENAME,EMP.SAL,SALGRADE.GRADE FROM EMP,SALGRADE WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL; --給表設置一個別名,這個別名只有當前查詢有效 SELECT E.ENAME,E.SAL,S.GRADE FROM EMP E,SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; --查詢部門編號,部門名稱,員工姓名,員工薪資,員工薪資等級 SELECT D.DEPTNO,D.DNAME,E.ENAME,E.SAL,S.GRADE FROM EMP E,DEPT D,SALGRADE S WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL; --外連接:就是為了找回不符合條件的數據 SELECT DEPTNO,COUNT(*) FROM EMP GROUP BY DEPTNO; SELECT D.DEPTNO,D.DNAME,E.ENAME FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO; --右外連接 SELECT D.DEPTNO,D.DNAME,E.ENAME FROM EMP E,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO; --左外連接 SELECT D.DEPTNO,D.DNAME,E.ENAME FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO(+); --修改數據 UPDATE EMP SET DEPTNO = NULL WHERE EMPNO = 7934; COMMIT; --自連接 SELECT * FROM EMP; --查詢當前員工和經理的名字 SELECT E.ENAME ,E.MGR ,M.ENAME,M.EMPNO FROM EMP E,EMP M WHERE E.MGR = M.EMPNO(+); ----------------------------------99語法 --笛卡爾積 SELECT * FROM EMP E,DEPT D; SELECT * FROM EMP E CROSS JOIN DEPT D; --等值連接(就是自動匹配名字,類型相同的列) SELECT * FROM EMP E NATURAL JOIN DEPT D; SELECT * FROM EMP E JOIN DEPT D USING(DEPTNO); SELECT * FROM EMP E JOIN DEPT D ON(E.DEPTNO = D.DEPTNO); --非等值連接 SELECT * FROM EMP E JOIN SALGRADE S ON(E.SAL BETWEEN S.LOSAL AND S.HISAL); --外連接 SELECT * FROM EMP E LEFT JOIN DEPT D USING(DEPTNO); SELECT * FROM EMP E RIGHT JOIN DEPT D USING(DEPTNO); SELECT * FROM EMP E FULL JOIN DEPT D USING(DEPTNO); --自連接 SELECT E.ENAME,M.ENAME FROM EMP E JOIN EMP M ON(E.MGR = M.EMPNO); SELECT E.ENAME,M.ENAME FROM EMP E LEFT JOIN EMP M ON(E.MGR = M.EMPNO); --子查詢(作為查詢條件) SELECT * FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP); SELECT * FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP); --子查詢(作為一張虛擬的表) SELECT * FROM EMP E ,(SELECT AVG(SAL) ASL,DEPTNO FROM EMP GROUP BY DEPTNO) T WHERE E.SAL>T.ASL AND E.DEPTNO = T.DEPTNO; --單行子查詢 SELECT * FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP); --多行子查詢 SELECT * FROM EMP E WHERE E.SAL IN(SELECT MAX(SAL) FROM EMP WHERE DEPTNO IS NOT NULL GROUP BY DEPTNO); /* IN:取其中之一相等就Ok ALL:必須所有得都滿足條件 SOME:滿足一部分即可 */
