Coding/데이터베이스

[오라클] JOIN 함수

찡콩찡 2022. 4. 18. 13:56

 

조인함수란
: 한 개 이상의 테이블에서 데이터를 조회

 

복습 

--1. 부서별 급여 총계와 평균을 구하라
select deptno, sum(sal), trunc(avg(sal)) from emp group by deptno order by deptno;

--2.HIREDATE의 자료형 확인 -> DATE
DESC EMP;
--3.입사년도 출력
select to_char(hiredate,'yyyy') as 입사년도 from emp;

--4. 입사 년도별 인원수
select TO_CHAR(HIREDATE, 'YYYY') as 입사년도 , COUNT(*) as 인원수
from emp 
GROUP BY TO_CHAR(HIREDATE,'YYYY');

--5.직무별 인원수, 급여 평균
SELECT JOB,COUNT(*) AS 인원수 ,ROUND(AVG(SAL)) AS 급여평균 FROM EMP GROUP BY JOB;

--6.부서별 보너스 받는 사원의 수
SELECT DEPTNO,COUNT(*) AS 인원수 FROM EMP WHERE COMM>0 GROUP BY DEPTNO;

--7. 부서별 입사년도별 인원수, 최고급여, 급여합계,평균급여 출력하되 부서별 소계와 총계 출력하기
SELECT DEPTNO,TO_CHAR(HIREDATE,'YYYY'),COUNT(*),MAX(SAL),SUM(SAL),AVG(SAL) 
FROM EMP 
GROUP BY ROLLUP(DEPTNO,TO_CHAR(HIREDATE,'YYYY'));

--8. 사원수
SELECT COUNT(*) FROM EMP;

--9.부서수 DEPT(전체부서)
SELECT COUNT(*) FROM DEPT;

--10. 사원이 하나도 없는 부서번호
--전체부서
SELECT DEPTNO FROM DEPT
MINUS SELECT DISTINCT DEPTNO FROM EMP;

--11.부서별 사원의 이름
SELECT DEPTNO,ENAME FROM EMP GROUP BY DEPTNO,ENAME;

--12.부서별 사원의 이름을 출력하되, 급여순으로 출력 WITHIN -> 그 그룹안에서 어떻게 줄세울거니?
SELECT DEPTNO,LISTAGG(ENAME,',')WITHIN GROUP(ORDER BY SAL) FROM EMP GROUP BY DEPTNO;

--13. 직무별 사원의 이름을 출력하되, 입사순으로 출력
SELECT JOB,LISTAGG(ENAME,',') WITHIN GROUP(ORDER BY HIREDATE) FROM EMP GROUP BY JOB;

--14.부서별 사원의 사원번호를 출력하되, 사원번호순으로 
SELECT DEPTNO,LISTAGG(EMPNO,',') WITHIN GROUP(ORDER BY EMPNO) FROM EMP GROUP BY DEPTNO;



JOIN 함수 예제

--15.모든 사원과 부서의 정보를 출력 : CROSS JOIN,카디전 곱(CARTESIAN PRODUCT)
SELECT * FROM EMP,DEPT ORDER BY EMPNO;    --56개 EMP:14개 DEPT:4개 ==> 14*4=56개 한사람당 4개씩 나옴 한사람당 부서번호륻 다 조인해서 그럼 그럴려면 조인 기준을 정해주면 됨

--16.  '.'은 소속을 나타냄
SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY EMPNO;

--17. 16번과 동일하나 보이는 방식을 다르게 할 수 있음 FROM 절에서 EMP E=> EMP테이블 E라고 지칭
SELECT * FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY EMPNO;

--18. 사원번호,사원명, 부서번호, 부서명,부서위치 출력 ★ 소속을 밝히는 습관을 가지자!
SELECT E.EMPNO,E.ENAME,E.DEPTNO,D.DNAME,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO; 

--19.급여가 3000이상인 사원들의 번호,사원명,급여,부서번호,부서명,부서위치 출력  ★ E.DEPTNO
SELECT EMPNO,ENAME,SAL, E.DEPTNO,D.DNAME,LOC FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL>=3000;

--20.급여등급 테이블 정보 확인 --SALGRADE테이블
SELECT * FROM SALGRADE;

--21. 모든 사원의 정보와 급여등급정보를 출력
SELECT * FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;

--22.SCOTT이라는 사원의 급여와 급여등급 구하기
SELECT SAL, GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND E.ENAME='SCOTT';
SELECT SAL,GRADE FROM EMP E, SALGRADE S WHERE ENAME='SCOTT' ,E.SAL BETWEEN S.LOSAL AND S.HISAL;  ->내가 한거 수정하기

--23.사원번호,사원명, 관리자번호,관리자의 사원번호, 관리자명 : 자체조인(SELF JOIN)
SELECT E.EMPNO, E.ENAME, E.MGR, M.EMPNO, M.ENAME FROM EMP E ,EMP M WHERE E.MGR = M.EMPNO;

--24.관리자가 없는 사원의 이름 (KING)
SELECT ENAME FROM EMP WHERE MGR IS NULL;

--25. CROSS JOIN  C(ROSS JOIN빼고 , 작성해도 값이 나옴)
SELECT * FROM EMP CROSS JOIN DEPT;

--26.★ 모든 사원의 사원번호, 사원명, 관리자번호,관리자이름 단 관리자가 없더라도 나오도록! 사장님도 포함(외부조인)
SELECT E.EMPNO AS 사원번호,E.ENAME AS 사원명 ,E.MGR AS 관지라번호,M.ENAME AS 관리자명 FROM EMP E,EMP M WHERE E.MGR = M.EMPNO(+);

--27. 사원번호,사원명,관리자 번호,관리자 이름, 관지라의 부서번호-->관리자 없는 사람 제외한 결과:13개
SELECT E.EMPNO,E.ENAME,E.MGR,M.ENAME,M.DEPTNO FROM EMP E,EMP M WHERE E.MGR=M.EMPNO;

--28. 모든 관리자의 정보를 출력하고 부하직원이 없더라도 포함 (없으면 NULL값으로 채워줘 = 부하직원이 없어도 채워줘)
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2 WHERE E1.MGR(+) = E2.EMPNO ORDER BY E1.EMPNO;

--29.NATURALJOIN(자연조인)
--사원번호, 사원명, 직무,관리자번호,입사일,급여,보너스,부서번호,부서명,부서위치 출력하되,부서번호순, 사원번호순
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,E.DEPTNO,DNAME,LOC 
FROM EMP E, DEPT D 
WHERE E.DEPTNO=D.DEPTNO ORDER BY E.DEPTNO,EMPNO; 
--다른 방법 사용해서 작성
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,DNAME,LOC 
FROM EMP E NATURAL JOIN DEPT D
ORDER BY DEPTNO,EMPNO; 

--30. FROM A JOIN B USING(공통속성)사용해서 29번 풀기 : D.E.이렇게 소속을 정해주면 틀린거야
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,DNAME,LOC 
FROM EMP E JOIN DEPT D USING(DEPTNO)
ORDER BY DEPTNO,EMPNO;

--31.사원번호,사원명,직무,관리자번호,입사일,급여,보너스,부서번호,부서명,부서위치를 출력하되 급여가 3000이상인 자
--대상으로 부서번호순, 사원번호순으로! JOIN USING 사용하여
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,DNAME,LOC 
FROM EMP E JOIN DEPT D USING(DEPTNO)
WHERE SAL>=3000
ORDER BY DEPTNO,EMPNO;