Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 8
오라클 학습용 계정 scott으로 접속~~
8 실무에서 가장 많이 사용하는 SQL, 조회
연습문제 page 239
4번문제에 대한 썰이 있다 ㅠㅠ
코드치다보면 자동적으로 알게 되는데,
일단 조인하는 테이블이 총 4개에 비등가조인, 자체조인에
외부조인까지 아주 잡탕으로 다 섞은 문제임;
나름 자신있어서 바로 풀었는데, 아무리 고쳐도 이상하게 출력되었다. 카타시안 곱해서 나온거같이 ㅠㅠ
알고보니 멍청이 같이 테이블 복사를 안해두고 했던것 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
emp 테이블을 복사해두고 시작했어야 했는데 아는데 까먹음...
CREATE TABLE COPY_EMP
AS SELECT*FROM EMP;
이 단 2줄을 안적어서 ㅠㅠ
그리고 아무리 해도 맨 밑의 데이터가 나오지 않는다. 외부조인 제대로 적용했고,
심지어 3번문제가 같은 데이터를 외부조인해서 푸는 건데, 그건 잘 나옴! 대체 뭐지?
다 해놓고 맨 마지막 망할 40번 부서 한줄때문에 1시간은 보낸 듯...
gpt는 오늘도 틀린 답을 말하다가 드디어 바른 코드를 줌 !!
근데 문제가...
학원에서는 sql-99 잘 안쓴다고 (사실 정확히 기억은 안남) 진도를 스킵함
아래 코드를 보면 알겠지만, 이전 방식으로 풀었음 ㅇㅇ
근데 gpt가 준 답은 sql-99 방식임
대체 왜 외부조인, D.DEPTNO = E1.DEPTNO(+) 이게 3번문제에는 작동되고
4번에서 안되서 난리인지 너무 궁금...
내가 쓴 코드:
CREATE TABLE COPY_EMP
AS SELECT*FROM EMP;
SELECT D.DEPTNO, D.DNAME, E1.EMPNO, E1.ENAME,
E1.MGR, E1.SAL,
E1.DEPTNO AS DEPTNO_1,
MIN(S.LOSAL) AS LOSAL,
MAX(S.HISAL) AS HISAL,
S.GRADE,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM DEPT D, EMP E1, COPY_EMP E2, SALGRADE S
WHERE D.DEPTNO = E1.DEPTNO(+)
AND E1.MGR= E2.EMPNO(+)
AND E1.SAL BETWEEN S.LOSAL AND S.HISAL
GROUP BY D.DEPTNO, D.DNAME, E1.EMPNO,
E1.ENAME,E1.MGR, E1.SAL,
E1.DEPTNO,S.GRADE,E2.EMPNO,E2.ENAME
ORDER BY D.DEPTNO, E1.EMPNO;
gpt가 준 코드 ( sql-99 )
SELECT D.DEPTNO, D.DNAME, E1.EMPNO, E1.ENAME,
E1.MGR, E1.SAL,
E1.DEPTNO AS DEPTNO_1,
MIN(S.LOSAL) AS LOSAL,
MAX(S.HISAL) AS HISAL,
S.GRADE,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM DEPT D
LEFT OUTER JOIN EMP E1 ON D.DEPTNO = E1.DEPTNO
LEFT OUTER JOIN COPY_EMP E2 ON E1.MGR = E2.EMPNO
LEFT OUTER JOIN SALGRADE S ON E1.SAL BETWEEN S.LOSAL AND S.HISAL
GROUP BY D.DEPTNO, D.DNAME, E1.EMPNO,
E1.ENAME,E1.MGR, E1.SAL,
E1.DEPTNO,S.GRADE,E2.EMPNO,E2.ENAME
UNION
SELECT D.DEPTNO, D.DNAME, E1.EMPNO, E1.ENAME,
E1.MGR, E1.SAL,
E1.DEPTNO AS DEPTNO_1,
MIN(S.LOSAL) AS LOSAL,
MAX(S.HISAL) AS HISAL,
S.GRADE,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM DEPT D
RIGHT OUTER JOIN EMP E1 ON D.DEPTNO = E1.DEPTNO
LEFT OUTER JOIN COPY_EMP E2 ON E1.MGR = E2.EMPNO
LEFT OUTER JOIN SALGRADE S ON E1.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE E1.DEPTNO IS NULL
GROUP BY D.DEPTNO, D.DNAME, E1.EMPNO,
E1.ENAME,E1.MGR, E1.SAL,
E1.DEPTNO,S.GRADE,E2.EMPNO,E2.ENAME
ORDER BY DEPTNO, EMPNO;
1~3번은 그럭저럭 쉽게 품
--연습문제 239 페이지
--1번
SELECT D.DEPTNO, D.DNAME, E.EMPNO, E.ENAME, E.SAL
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO
AND E.SAL > 2000
ORDER BY D.DEPTNO;
--2번문제
SELECT D.DEPTNO,
D.DNAME,
TRUNC(AVG(NVL(E.SAL,0))) AS AVG_SAL,
MAX(E.SAL) AS MAX_SAL,
MIN(E.SAL) AS MIN_SAL,
COUNT(*) AS CNT
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO
GROUP BY D.DEPTNO, D.DNAME;
--3번문제
SELECT D.DEPTNO,
D.DNAME,
E.EMPNO,
E.ENAME,
E.JOB,
E.SAL
FROM DEPT D, EMP E
WHERE D.DEPTNO=E.DEPTNO(+)
ORDER BY D.DEPTNO, E.ENAME;