[데이터베이스] 5. Subquery

문정준's avatar
Feb 26, 2025
[데이터베이스] 5. Subquery

1. Subquery

  • where 절에 포함됨
    • 두 테이블의 중복되는 데이터를 연관 관계(Relation)를 만들어 참조
      • 다른 테이블을 참조하는 키 = 외래 키(FK, Foreign Key)
      • 테이블의 행을 유일하게 결정하는 키 = 기본 키(PK, Primary Key)
-- 1. 서브쿼리 (where) -- 중복해서 만들지 않는다. = 변경에 대처하기 힘들다. -- 연관 관계를 가지도록 테이블을 두 개 만든다. (relation) -- 다른 테이블을 참조하는 키를 FK(Foreign Key) -- 내 테이블에서 행을 유일하게 결정하는 키를 PK(Primary Key) -- DALLAS에서 일하는 직원을 추출해주세요. SELECT * FROM emp where deptno = ( SELECT deptno FROM dept where loc = 'DALLAS' );
notion image
notion image
 
-- 문제 : RESEARCH 부서의 직원을 출력해주세요. select * from emp where deptno = ( select deptno from dept where dname = 'RESEARCH' );
notion image
notion image
 
-- 김재수 학생의 담당 교수를 출력해주세요. select * from professor where profno = ( select profno from student where name = '김재수' );
notion image
 

2. Inline View

  • from 절에 포함됨
    • 별칭을 where, group by에 기본적으로 사용할 수 없음 (SQL 동작 순서)
    • 별칭을 포함한 테이블을 처음에 올려주면 사용 가능 (from 연산이 1순위)
      • 이 테이블은 따로 이름이 없어서 이름 지정이 필요
-- 2. Inline View (from에 select) -- 아래 경우는 오류 발생 (SQL 실행 순서) select ename, sal*12 '연봉' from emp where 연봉 = 9600; -- 해결법 -- 새로 만든 테이블은 이름이 필요 select e.* from ( select ename, sal*12 '연봉' from emp ) e where 연봉 = 9600;
notion image
 
-- having과 동일한 역할 (사용할 필요 없어짐) select * from ( select avg(sal) 'avg_sal' from emp group by deptno ) e where e.avg_sal < 2000; select avg(sal) 'avg_sal' from emp group by deptno having avg_sal < 2000;
notion image

3. Scalar Subquery

  • select 절에 포함됨
  • 결과값이 스칼라(1개)일때만 사용 가능
    • 커서를 다른 테이블에 옮기기 위해 별칭 사용
-- 3. Scalar Subquery (select 절에 서브쿼리) -- 결과값이 Scalar (행과 값이 딱 1개) select d.deptno, d.dname, d.loc, ( select count(*) from emp where deptno = d.deptno ) '직원수' from dept d;
notion image

Subquery

  • 규칙을 찾는 것이 가장 중요
    • 규칙을 찾아서 연산 횟수를 감소 = 속도 증가
  • 규칙을 찾기 위해서는 직접 DB 테이블을 보면서 실제 동작을 확인해볼 것
notion image
Share article

sxias