1. 程式人生 > >Oracle - 查詢語句 - 多表關聯查詢

Oracle - 查詢語句 - 多表關聯查詢

/*    
    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:滿足一部分即可

*/

原文地址:https://www.cnblogs.com/chenglc/p/6922998.html