개발일기/Oracle

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

민장미 2023. 5. 13. 14:46

 

10일쯤 풀어서 포스팅했던 join 문제 ,서브쿼리 문제 다르게 풀어보았다.

 

JOIN 연습문제 : 

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

 

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

오라클 학습용 계정 scott으로 접속~~ 8 실무에서 가장 많이 사용하는 SQL, 조회 연습문제 page 239 4번문제에 대한 썰이 있다 ㅠㅠ 코드치다보면 자동적으로 알게 되는데, 일단 조인하는 테이블이 총

jangmicoding.tistory.com

 

서브쿼리 연습문제: 

Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 9 (tistory.com)

 

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

오라클 학습용 계정 scott 로그인: 9 SQL문 속 또 다른 SQL문, 서브쿼리 연습문제 page 262 늘 힘들었지만 오늘 특히나 힘들었다 ㅠㅠㅠ 1번문제부터 막혀서 미치는 줄... DEPT테이블하고 EMP 테이블의 열

jangmicoding.tistory.com

 

SQL 99를 잘 안쓴다는건 내가 잘못 기억한거 같고 자주 쓴대서

교재보고 공부한 뒤에 위의 포스팅과 같은 문제(조인,서브쿼리)를 SQL-99 문법으로 다시 풀어봤다.

 

조인 문제 페이지 239 

그 유난이 문제였던 4번문제...( 외부조인)  

테이블이 4개인데, 3가지 외부조인을 다써야 문제처럼 출력이 되었다. 흠 

FULL OUTER JOIN도 써서 다시 해봄 

 

--1
SELECT DEPTNO, DNAME, EMPNO,ENAME,SAL
	FROM EMP E NATURAL JOIN DEPT D
 WHERE SAL > 2000
 	ORDER BY DEPTNO, EMPNO;

--2
SELECT DEPTNO, TRUNC(AVG(NVL(SAL,0))) AS AVG_SAL, MAX(SAL) AS MAX_SAL,
	MIN(SAL) AS MIN_SAL,
	COUNT(*) AS CNT
	FROM EMP E JOIN DEPT D USING (DEPTNO)
GROUP BY DEPTNO
ORDER BY DEPTNO;

--3
SELECT D.DEPTNO, DNAME, EMPNO,
	ENAME, JOB, SAL
FROM EMP E JOIN DEPT D ON (E.DEPTNO= D.DEPTNO)
ORDER BY DEPTNO, ENAME;

--4
SELECT D.DEPTNO, DNAME, E1.EMPNO, E1.ENAME, E1.MGR,
	E1.SAL, E1.DEPTNO, S.LOSAL, S.HISAL, S.GRADE,
 	E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
	FROM EMP E1 JOIN DEPT D ON (E1.DEPTNO = D.DEPTNO)
		JOIN SALGRADE S ON (E1.SAL>= S.LOSAL AND E1.SAL<=S.HISAL)
		JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
	ORDER BY D.DEPTNO, E1.EMPNO;
--이제 여기서 아우터조인, 외부조인만 하면 된다./ MGR과 DEPT 의 부서

CREATE TABLE EMP_CP AS SELECT * FROM EMP;

SELECT D.DEPTNO, DNAME, E1.EMPNO, E1.ENAME, E1.MGR,
	E1.SAL, E1.DEPTNO, S.LOSAL, S.HISAL, S.GRADE,
 	E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
	FROM EMP E1 LEFT OUTER JOIN EMP_CP E2 ON (E1.MGR = E2.EMPNO)
		RIGHT OUTER JOIN DEPT D ON (E1.DEPTNO = D.DEPTNO)
		LEFT OUTER JOIN SALGRADE S ON (E1.SAL BETWEEN S.LOSAL AND S.HISAL)
		ORDER BY D.DEPTNO, E1.EMPNO;
    -- SALGRADE까지 아우터 조인 처리해야   DEPT의 개발부서 그게 나온다



--FULL OUTER 써봄.  복제 테이블 제외시 출력 값 같음 
SELECT D.DEPTNO, DNAME, E1.EMPNO, E1.ENAME, E1.MGR,
	E1.SAL, E1.DEPTNO, S.LOSAL, S.HISAL, S.GRADE,
 	E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
 	FROM EMP E1 LEFT OUTER JOIN EMP_CP E2 ON (E1.MGR = E2.EMPNO)
		FULL OUTER JOIN DEPT D ON (E1.DEPTNO = D.DEPTNO)
		FULL OUTER JOIN SALGRADE S ON (E1.SAL BETWEEN S.LOSAL AND S.HISAL)
		ORDER BY D.DEPTNO, E1.EMPNO;

 

 

서브쿼리 262 페이지,  역시 SQL-99문법으로 다시 풀어봄 

 

--1
SELECT
	JOB, EMPNO, ENAME, SAL, D.DEPTNO, DNAME
	FROM EMP E JOIN DEPT D ON ( E.DEPTNO = D.DEPTNO)
 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'ALLEN')
 ORDER BY SAL DESC;


--2
SELECT EMPNO, ENAME, DNAME, TO_CHAR(HIREDATE,'YYYY-MM-DD'), LOC, SAL, GRADE
	FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
		JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL)
WHERE SAL > (SELECT AVG(NVL(SAL,0)) FROM EMP)
	ORDER BY SAL DESC, EMPNO;


--3
SELECT EMPNO, ENAME, JOB, D.DEPTNO, DNAME,LOC
	FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE JOB NOT IN (SELECT JOB FROM EMP WHERE DEPTNO=30)
 AND E.DEPTNO=10;

--4 : 다중햄 함수 사용 
SELECT EMPNO, ENAME, SAL, GRADE
	FROM EMP E JOIN SALGRADE S ON (SAL BETWEEN LOSAL AND HISAL)
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE JOB = 'SALESMAN')
ORDER BY EMPNO;

-- 4: 다중행 함수 안쓴거
SELECT EMPNO, ENAME, SAL, GRADE
	FROM EMP E JOIN SALGRADE S ON (SAL BETWEEN LOSAL AND HISAL)
WHERE SAL > ALL (SELECT SAL FROM EMP WHERE JOB = 'SALESMAN')
ORDER BY EMPNO;