서브쿼리
SELECT *
FROM EMP
WHERE SAL > 800;
800을 서브쿼리로 바꾸기
SELECT *
FROM EMP
WHERE SAL >
(
SELECT SAL
FROM EMP
WHERE ENAME = 'SMITH'
);
조건이 1개, 비교값도 1개일 경우
SELECT *
FROM EMP
WHERE SAL >
(
SELECT SAL
FROM EMP
WHERE ENAME = 'SMITH'
);
조건이 1개, 비교값이 여러개일 경우
SELECT *
FROM EMP
WHERE SAL IN
(
SELECT SAL
FROM EMP
WHERE JOB = 'MANAGER'
);
--위 코드는 아래와 같다
SELECT *
FROM EMP
WHERE SAL IN (2975, 2850, 2450);
STUDENT 테이블과 DEPARTMENT 테이블을 사용하여
'서진수'학생과 1전공(DEPTNO1)이 동일한 학생들의
이름과 1전공 이름을 출력하세요
먼저 서진수 학생의 전공번호를 확인한다
SELECT DEPTNO1
FROM STUDENT
WHERE NAME = '서진수';
전공이 101인 학생의 이름과 전공이름을 출력한다
SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO = 101 AND S.DEPTNO1 = d.deptno;
101자리에 서브쿼리를 넣는다
SELECT S.NAME STUD_NAME, d.dname DEPT_NAME
FROM STUDENT S, DEPARTMENT D
WHERE D.DEPTNO =
(
SELECT DEPTNO1
FROM STUDENT
WHERE NAME = '서진수'
) AND S.DEPTNO1 = d.deptno;
PROFESSOR 테이블과 DEPARTMENT 테이블을 조회하여
'주승재'교수보다 나중에 입사한 사람의 이름과 입사일, 학과명을 출력하세요.
먼저 주승재 교수의 입사일을 확인한다
SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재';
위의 테이블을 서브쿼리하여 이름과 입사일 학과명을 출력한다
SELECT P.NAME , P.HIREDATE, d.dname
FROM PROFESSOR P, DEPARTMENT D
WHERE HIREDATE >
(
SELECT HIREDATE
FROM PROFESSOR
WHERE NAME = '주승재'
)
AND p.deptno = d.deptno;
STUDENT 테이블에서 1전공(DEPTNO1)이 201번인 학과의
평균 몸무게보다 몸무게가 많은 학생들의 이름과 몸무게를 출력하세요.
먼저 201번 학과의 평균 몸무게를 검색한다
SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1;
위의 테이블을 서브쿼리하여 학생들의 이름과 몸무게를 출력한다
SELECT NAME, WEIGHT
FROM STUDENT
WHERE WEIGHT >
(
SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO1 = 201
GROUP BY DEPTNO1
);
EMP2 테이블을 사용하여 전체 직원 중 '과장' 직급의 최소 연봉자보다
연봉이 높은 사람의 이름과 직급, 연봉을 출력하세요.
단, 연봉 출력 형식은 아래와 같이 천 단위 구분 기호화 $표시를 하세요.
먼저 EMP2 테이블의 과장직급의 최소 연봉을 구한다
SELECT MIN(PAY) -- MIN함수는 월급을 찾는다
FROM EMP2
WHERE POSITION = '과장'
4900만원이 최소치이므로 WHERE으로 그 이상인 사람들을 찾을 수 있다.
SELECT NAME, POSITION, to_char(pay, '$999,999,999')
FROM EMP2
WHERE pay > 49000000;
서브쿼리로 처음 코드를 넣으면
SELECT NAME, POSITION, to_char(pay, '$999,999,999')
FROM EMP2
WHERE pay >
(
SELECT MIN(PAY)
FROM EMP2
WHERE POSITION = '과장'
);
EMP2 테이블과 DEPT2 테이블을 조회하여 각 부서별 평균 연봉을 구하고
그중에서 평균 연봉이 가장 적은 부서의 평균 연봉보다
적게받는 직원들의 부서명, 직원명, 연봉을 출력하세요.
먼저 각부서별 평균연봉을 구한다
SELECT AVG(PAY)
FROM EMP2
GROUP BY DEPTNO
ORDER BY AVG(PAY);
위의 코드를 서브쿼리하여서 1번째 것을 출력
SELECT *
FROM
(
SELECT AVG(PAY)
FROM EMP2
GROUP BY DEPTNO
ORDER BY AVG(PAY)
)
WHERE ROWNUM = 1;
그리고 출력할 것들을 SELECT 정리하고 25000000자리에 위 코드를 서브쿼리한다
SELECT DEPT2.DNAME, EMP2.NAME, TO_CHAR(EMP2.PAY, '$999,999,999') SALARY
FROM EMP2, DEPT2
WHERE PAY < 25000000 AND EMP2.DEPTNO = DEPT2.DCODE;
SELECT DEPT2.DNAME, EMP2.NAME, TO_CHAR(EMP2.PAY, '$999,999,999') SALARY
FROM EMP2, DEPT2
WHERE PAY <
(
SELECT *
FROM
(
SELECT AVG(PAY)
FROM EMP2
GROUP BY DEPTNO
ORDER BY AVG(PAY)
)
WHERE ROWNUM = 1
)
AND EMP2.DEPTNO = DEPT2.DCODE;
IN 과 EXISTS의 차이
IN 은 서브쿼리 데이터를 WHERE 오른쪽의 DEPTNO 와 비교해서 같은 값인 경우에만 출력한다
SELECT DEPTNO
FROM DEPT
WHERE DEPTNO = 20;
20이 출력
DEPTNO가 20인 모든 데이터를 출력
SELECT * FROM DEPT
WHERE DEPTNO IN (
SELECT DEPTNO
FROM DEPT
WHERE DEPTNO = 20
);
EXISTS는 서브쿼리 데이터가 있으면 메인 쿼리를 모두 실행하고, 없으면 아예 실행하지 않는다
SELECT * FROM DEPT
WHERE EXISTS (
SELECT DEPTNO
FROM DEPT
WHERE DEPTNO = 20
);
SELECT * FROM DEPT
WHERE EXISTS (
SELECT DEPTNO
FROM DEPT
WHERE DEPTNO = 50
);
'Database > OracleSQL' 카테고리의 다른 글
오라클 서브쿼리 문제 (0) | 2020.04.03 |
---|---|
200402 // SYNONYM, VIEW, CRUD, 인덱스 INDEX, , 클러스터링 (0) | 2020.04.02 |
오라클 DML, INSERT, SELECT, UPDATE, DELETE (0) | 2020.04.02 |
오라클 VIEW (0) | 2020.04.02 |
오라클 ANSI JOIN (0) | 2020.04.02 |