inblog logo
|
parangdajavous
    Data Base

    [Data Base] 5. SubQuery

    김미숙's avatar
    김미숙
    Feb 26, 2025
    [Data Base] 5. SubQuery
    Contents
    Subquery (where)Inline viewScala 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
    Contents
    Subquery (where)Inline viewScala Subquery

    parangdajavous

    RSS·Powered by Inblog