«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 8 본문

개발일기/Oracle

Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 8

민장미 2023. 5. 11. 00:31

오라클 학습용 계정 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;

망할 40번 부서...

 

 

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;