1 분 소요

⚠️ 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');

댓글남기기