Oracle SQL(2) 서브쿼리
⚠️ Group by절 사용 시 주의점
- group by절에 사용된 컬럼 이외의 컬럼은 단독으로 select절에 사용할 수 없다.
- group by절에는 반드시 컬럼명이 와야하고, alias는 사용이 불가능하다.
- 그룹에 대한 조건은 where절이 아닌 having절에 작성해야 한다.
📖 SQL 구문 작성 순서
select - from - where - group by - having - order by
📖 일반 SubQuery 종류
1) 단일행 서브쿼리
- 쿼리 결과가 단일행만을 리턴
2) 다중행 서브쿼리
- 쿼리 결과가 다중행을 리턴
- 다중행 비교 연산자를 사용해야 한다
IN #결과중 하나라도 일치하면 TRUE
ANY #결과중 하나 이상 일치하면 TRUE
# =ANY 와 IN은 같은 의미이며, <ANY, >ANY 와 같이 사용
ALL #모든 결과가 만족하면 TRUE
EXISTS #서브쿼리의 결과가 1개라도 존재하면 TRUE
3) 다중컬럼 서브쿼리
- 두 개 이상의 컬럼을 리턴
📖 상관 SubQuery
부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 상관 서브쿼리라 한다. 상관 서브쿼리는 부모 명령과 연관되어 처리되기 때문에 단독으로 실행할 수 없다.
예시
적어도 한 명의 직원으로부터 보고를 받을 수 있는 직원의 사번, 이름, 업무, 급여를 조회하시오(mgr인 사원 조회)
- 일반 서브쿼리
select empno, ename, job, sal from emp
where empno IN (select distinct mgr from emp);
- 상관 서브쿼리
select empno, ename, job, sal from emp e
where exists (select * from emp where e.empno = mgr);
두 가지 방식으로 해결할 수 있는데, 상관 서브 쿼리는 부모 쿼리 없이 단독으로 실행될 수 없음을 확인할 수 있다.
📖 서브쿼리 활용 예시
Oracle DBMS에서 실습 예제로 제공해주는 scott.sql를 활용한다.
1. 해당 쿼리에서 보너스가 null인 사람도 출력될 수 있도록 수정하시오.
SELECT empno, ename, deptno, sal, comm FROM emp
WHERE (sal, comm) IN(SELECT sal, comm FROM emp WHERE deptno=30);
- null값끼리는 비교가 안 되는 모양이라 nvl함수로 감싸주었다.
SELECT empno, ename, deptno, sal, comm FROM emp
WHERE (sal, nvl(comm,0)) IN(SELECT sal, nvl(comm, 0) FROM emp WHERE deptno=30);
2. 부서의 위치가 dallas인 모든 직원에 대해 사번, 이름, 급여, 업무를 조회하시오.
select empno, ename, sal, job from emp
where deptno = (select deptno from dept
where loc = 'DALLAS');
3. King에게 보고하는 모든 직원의 이름과 부서, 업무, 급여를 조회하시오.
select ename, deptno, job, sal from emp
where mgr = (select empno from emp
where ename = 'KING');
댓글남기기