[09단원] 서브쿼리
						2021. 9. 13. 20:08
					
				728x90
    
    
  교재명 : Do it! 오라클로 배우는 데이터베이스 입문 (이지스퍼블리싱 / 이지훈 지음)
[ Q1 ]

[ A1 ]
SELECT E.JOB, E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
   AND JOB = (SELECT JOB
                FROM EMP
               WHERE ENAME = 'ALLEN');
[ Q2 ]

[ A2 ]
SELECT E.EMPNO, E.ENAME, D.DNAME, E.HIREDATE, D.LOC, 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
   AND SAL > (SELECT AVG(SAL)
                FROM EMP)
 ORDER BY E.SAL DESC, E.EMPNO;
오답: SALGRADE TABLE을 사용안함
SELECT ...
  FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO
 WHERE E.SAL > (SELECT AVG(SAL) FROM EMP)
 ORDER BY E.SAL DESC, E.EMPNO ASC
[ Q3 ]

[ A3 ]
*서브쿼리 안에 JOB 조회할 때, DISTINCT 를 사용하여 중복 제거를 해주어야 메인쿼리의 JOB와 비교할 수 있음 (데이터 갯수가 일치해야 함)
SELECT E.EMPNO, E.ENAME, E.JOB, E.DEPTNO, D.DNAME, D.LOC
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
   AND E.DEPTNO = 10
   AND JOB NOT IN (SELECT DISTINCT JOB
                     FROM EMP
                    WHERE DEPTNO = 30);
[ Q4 ]

[ A4 ]
-- 다중행 함수 사용하지 않는 방법
SELECT E.EMPNO, E.ENAME, E.SAL, S.GRADE
  FROM EMP E, SALGRADE S
 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
   AND SAL > (SELECT MAX(SAL)
                FROM EMP
               WHERE JOB = 'SALESMAN')
ORDER BY E.EMPNO; 
--다중행 함수 사용하는 방법
SELECT E.EMPNO, E.ENAME, E.SAL, S.GRADE
  FROM EMP E, SALGRADE S
 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
   AND SAL > ALL (SELECT DISTINCT SAL
                    FROM EMP
                   WHERE JOB = 'SALESMAN')
ORDER BY E.EMPNO;
[ 참고자료 ]
728x90
    
    
  'SQL > Oracle SQL' 카테고리의 다른 글
| [08단원] 조인(JOIN) (0) | 2021.09.13 | 
|---|---|
| [07단원] 다중행 함수와 데이터 그룹화 (0) | 2021.09.11 | 
| [06단원] 데이터 처리와 가공 (0) | 2021.08.30 | 
| [05단원] Where절과 연산자 (0) | 2021.08.30 | 
						
							
							
							
							
										


