[Data Base] 5. SubQuery

김미숙's avatar
Feb 26, 2025
[Data Base] 5. SubQuery
‼️
  • 변경에 대처하기 힘들기 때문에 중복해서 만들지 않고, 연관관계를 가지게 테이블을 두 개로 만든다.
  • 다른 테이블을 참조하는 키: Fk
  • 내 테이블에서 행을 유일하게 결정하는 키: Pk
내부에 있는 코드를 먼저 실행해서 확인하기
 

Subquery (where)

Ex. DALLAS에 사는 직원을 출력하기

-- 스키마 확인 select * from emp; select * from dept; -- DALLAS에 사는 직원 확인 select * from emp where deptno = 20; -- dept 테이블에서 DALLAS의 deptno 확인 select deptno from dept where loc = 'DALLAS'; -- 20 = DALLAS -- 20자리에 select 절 삽입 select * from emp where deptno = (select deptno from dept where loc = 'DALLAS');
 

Ex. sal의 값이 최소인 사람 출력하기

-- emp 테이블에서 sal의 최솟값만 확인 select min(sal) from emp; -- emp 테이블에서 sal의 최솟값인 row 출력 select * from emp where sal in (select min(sal) from emp);
 

Ex. sal의 값이 1200보다 작은 사람 출력하기

-- emp 테이블에서 sal이 1200보다 작은 값만 확인 select sal from emp where sal < 1200; -- emp 테이블에서 sal이 1200보다 작은 row 출력 select * from emp where sal in (select sal from emp where sal < 1200);
 
 

Ex. RESEARCH부서의 직원을 출력하기

-- 스키마 확인 select * from emp; select * from dept; -- dept 테이블에서 deptno가 20인 row 확인 select * from dept where deptno = 20; -- dept 테이블에서 RESEARCH의 deptno 확인 select deptno from dept where dname = 'RESEARCH'; -- 20 = RESEARCH -- where에 dept 테이블에서 RESEARCH의 deptno 확인한 절 삽입 select * from emp where deptno = (select deptno from dept where dname = 'RESEARCH');
 
 

Inline view

‼️

From절에 들어가는 Subquery

  • 퍼올린 테이블을 다시 테이블로 사용하기 위함
select ename, sal*12 '연봉' from emp where 연봉 = 9600; -- where이 먼저 실행되서 '연봉'과 매칭 안되므로 실행되지 않는다

Ex. 연봉이 9600인 사람 출력하기

-- name, sal*12 연산된 테이블 확인 select ename, sal*12 '연봉' from emp; -- From에 name, sal*12 연산된 테이블 절 삽입 select e.* from ( select ename, sal*12 '연봉' from emp )e -- From 절은 테이블 별칭이 필요하다 where e.연봉 = 9600;
 
 

Ex. sal 평균이 2000 미만인 부서

-- 그룹핑으로 deptno별 평균계산 select avg(sal) 'avg_sal' -- 소문자로 적고 띄어쓰기는 _로 함 from emp group by deptno; -- From에 그룹핑으로 deptno별 평균계산한 절 삽입 select * from (select avg(sal) 'avg_sal' from emp group by deptno ) e where e.avg_sal < 2000;
 
select avg(sal), if(2000<=sal, "고액","소액") grade from emp group by grade; select * from ( select avg(sal), if(2000<=sal, "고액","소액") grade from emp -- 인라인 뷰 (가상 테이블_연산해서 나온 결과) );
 
 
 
 

Scala Subquery

‼️

Select 절에 있는 Subquery

  • 컬럼이 1개
  • 연산이 많이 됨

Ex. 부서별 직원수 뽑기

-- 스키마 확인 select * from dept; -- 정렬된 스키마 확인 select * from emp order by deptno; -- 별칭 'd' / dept 스키마 '직원수' 컬럼에 1 넣어보기 select d.deptno,d.dname,d.loc, 1 '직원수' from dept d; -- deptno 컬럼의 갯수 확인 select count(*) from emp where deptno = 10; -- 10 = d.deptno -- 1 자리에 Select 절 삽입 (컬럼의 갯수를 확인한 절) select d.deptno,d.dname,d.loc, (select count(*) from emp where deptno = d.deptno) '직원수' from dept d;
 
 
Share article

parangdajavous