ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • select (join부터)
    oracle 2020. 8. 13. 02:11

    ●조인

    -두 개 이상의 테이블에 있는 컬럼의 값을 한번에 가져오기 위해 사용하는 것이 조인이다.

    -select 컬럼명 from 테이블1, 테이블2;

    -두 개 이상의 테이블에서 가져온 결과 중에 정확한 결과만 가져오기 위해 공통 부분을 이용한 조건문이 반드시 필요하다.

     

     

    --사원테이블(emp)과 부서테이블(dept) join한다.

     

    select * from emp,dept;

     

    select *

    from emp, dept

    where emp.deptno = dept.deptno;

     

    select *

    from emp a1, dept a2

    where a1.deptno = a2.deptno;

     

    --사원의 사원번호이름근무부서 이름을 가져온다.

    select empno, ename, dname

    from emp a1, dept a2

    where a1.deptno = a2.deptno;

     

    select a1.empno, a1.ename, a2.dname

    from emp a1, dept a2

    where a1.deptno = a2.deptno;

     

    --사원의 사원번호이름근무지역을 가져온다.

    select a1.empno, a1.ename, a2.loc

    from emp a1, dept a2

    where a1.deptno = a2.deptno;

     

    --DALLAS에 근무하고 있는 사원들의 사원번호이름직무를 가져온다.

    select a1.empno, a1.ename, a1.job

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a2.loc = 'DALLAS';

     

    --SALES 부서에 근무하고 있는 사원들의 급여 평균을 가져온다.

    select avg(a1.sal)

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a2.dname = 'SALES';

     

    --1982년에 입사한 사원들의 사원번호이름입사일근무부서이름을 가져온다.

    select a1.empno, a1.ename, a1.hiredate, a2.dname

    from emp a1, dept a2

    where a1.deptno = a2.deptno and trunc(a1.hiredate,'YYYY') = '1982/01/01';

    --각 사원들의 사원번호이름급여급여등급을 가져온다.

    select a1.empno, a1.ename, a1.sal, a2.grade

    from emp a1, salgrade a2

    where a1.sal >= a2.losal and a1.sal <= a2.hisal;

     

    select a1.empno, a1.ename, a1.sal, a2.grade

    from emp a1, salgrade a2

    where a1.sal between a2.losal and a2.hisal;

     

    --SALES부서에 근무하고 있는 사원의 사원번호이름급여등급을 가져온다.

    select  a1.empno, a1.ename, a2.grade, a3.dname

    from emp a1, salgrade a2, dept a3

    where a1.deptno = a3.deptno and a1.sal between a2.losal and a2.hisal

            and a3.dname = 'SALES';

    --각 급여 등급별 급여의 총합과 평균사원의 수최대급여최소급여를 가져온다.

    select grade,sum(sal),avg(sal),count(*),max(sal),min(sal)

    from emp a1, salgrade a2

    where a1.sal between a2.losal and a2.hisal

    group by grade;

    --급여등급이 4등급인 사원들의 사원번호이름급여근무부서 이름근무지역을 가져온다.

    select grade, a1.empno, a1.ename, a1.sal, a2.deptno, a2.loc

    from emp a1, dept a2, salgrade a3

    where a1.deptno = a2.deptno and a1.sal between a3.losal and a3.hisal and a3.grade =4;

     

    self join

    -같은 테이블을 두 번 이상 조인하는 것을 의미한다.

    EX)

    --SMITH사원의 사원번호이름직속상관 이름을 가져온다.

    select * from emp;

     

    --이거는 조인 안쓰고 해본거

    select empno, ename, (select ename from emp where empno = (select mgr from emp where ename = 'SMITH'))

    from emp

    where ename= 'SMITH';

    --a1 : SMITH 사원의 정보  a2 : 직속상관의 정보

    select a1.empno, a1.ename, a2.ename

    from emp a1, emp a2

    where a1.mgr = a2.empno and a1.ename = 'SMITH';

     

    --FORD 사원 밑에서 일하는 사원들의 사원번호이름직무를 가져온다.

    --a1 : 부하직원의 정보

    --a2 : FORD의 정보

    select a1.empno, a1.ename, a1.job

    from emp a1, emp a2

    where a1.mgr = a2.empno and a2.ename = 'FORD';

     

    --SMITH 사원의 직속상관과 동일한 직무를 가지고 있는 사원들의 사원번호이름직무를 가져온다.

    --a1 : SMITH사원

    --a2 : SMITH사원의 직속상관

    --a3 : 사원들

    select a3.empno, a3.ename, a3.job

    from emp a1, emp a2, emp a3

    where a1.mgr = a2.empno and a2.job = a3.job and a1.ename = 'SMITH';

     

     

     

    outer join

    -조인 조건에 해당하지 않기 때문에 결과에 포함되지 않는 로우까지 가져오는 조인이다.

    EX)

    --각 사원의 이름사원번호직장상사 이름을 가져온다단 직속상관이 없는 사원도 가져온다.

    --a1 : 각 사원의 정보

    --a2 : 직장상사의 정보

    select a1.ename, a1.empno, a2.ename

    from emp a1, emp a2

    where a1.mgr = a2.empno(+);

     

    --모든 부서의 소속사원의 근무부서명사원번호사원이름급여를 가져온다.

    select distinct(deptno) from emp;

    select * from dept;

     

    select a2.dname, a1.empno, a1.ename, a1.sal

    from emp a1, dept a2

    where a1.deptno(+) = a2.deptno;

     

    ●서브쿼리

    -쿼리문 안에 들어가는 쿼리문을 서브쿼리라고 한다.

    -쿼리문 작성시 사용되는 값을 다른 쿼리문을 통해 구해야 할 경우 사용한다.

    --SMITH사원이 근무하고 있는 부서의 이름을 가져온다.

    select a2.dname

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a1.ename = 'SMITH';

     

    select dname

    from dept

    where deptno = (select deptno

                    from emp

                    where ename='SMITH');

     

    --SMITH와 같은 부서에 근무하고 있는 사원들의 사원번호이름급여액부서이름을 가져온다.

    select a3.empno, a3.ename, a3.sal, a2.dname

    from emp a1, dept a2, emp a3

    where a1.deptno =  a2.deptno and a1.ename = 'SMITH' and a1.deptno = a3.deptno;

     

    select ename, empno, sal, a2.dname

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a1.deptno = (select deptno

                                                from emp

                                                where ename = 'SMITH');

     

    select deptno

    from emp

    where ename = 'SMITH';

     

     

    --MARTIN과 같은 직무를 가지고 있는 사원들의 사원번호이름직무를 가져온다.

    select a2.empno, a2.ename, a2.job

    from emp a1, emp a2

    where a1.job = a2.job and a1.ename = 'MARTIN';

     

    select empno, ename, job

    from emp

    where job = (select job

                from emp

                where ename = 'MARTIN'

                );

     

    --ALLEN과 같은 직속상관을 가진 사원들의 사원번호이름직속상관이름을 가져온다.

    select a2.empno, a2.ename, a1.mgr, a2.mgr, a3.ename

    from emp a1, emp a2, emp a3

    where a1.mgr = a2.mgr and a1.ename = 'ALLEN' and a1.mgr = a3.empno;

     

    select a1.empno, a1.ename, a2.ename

    from emp a1, emp a2

    where a1.mgr = a2.empno and a1.mgr = (

                                            select mgr

                                            from emp

                                            where ename = 'ALLEN');

                                           

    --WARD와 같은 부서에 근무하고 있는 사원들의 사원번호이름부서번호를 가져온다,

    --a1 : ward의 정보, a2 : ward와 같은 부서에 근무하고 있는 사원들의 정보

    select a2.empno, a2.ename, a2.deptno

    from emp a1, emp a2

    where a1.deptno = a2.deptno and a1.ename = 'WARD';

     

    select empno, ename, deptno

    from emp

    where deptno = (select deptno

                    from emp

                    where ename = 'WARD');

                   

    --SALESMAN의 평균 급여보다 많이 받는 사원들의 사원번호이름급여를 가져온다.

    select empno, ename, sal

    from emp

    where sal > (select avg(sal)

                from emp

                where job = 'SALESMAN');

     

    --DALLAS 지역에 근무하는 사원들의 평균 급여를 가져온다.

    select avg(sal)

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a2.loc = 'DALLAS';

     

    select avg(sal)

    from emp

    where deptno = (select deptno

                        from dept

                        where loc = 'DALLAS');

    --SALES 부서에 근무하는 사원들의 사원번호이름근무지역을 가져온다.

    select a1.empno, a1.ename, a2.loc

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a2.dname = 'SALES';

     

    select a1.empno, a1.ename, a2.loc

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a1.deptno = (select deptno

                                                from dept

                                                where dname = 'SALES');

                                               

                                               

    --CHICAGO 지역에 근무하는 사원들 중 BLAKE이 직속 상관인 사원들의 사원번호이름직무를 가져온다.

    --a1 : 시카고 지역의 정보 a2 :시카고 근무사원들 a3 : BLAKE이 직속상관인 사원들

    select a2.empno, a2.ename, a2.job

    from dept a1, emp a2, emp a3

    where a1.deptno = a2.deptno and a2.mgr = a3.empno and a3.ename = 'BLAKE' and a1.loc='CHICAGO';

     

    select empno, ename, job

    from emp

    where deptno = (select deptno

                    from dept

                    where loc = 'CHICAGO'

                    )

        and mgr = (select empno

                    from emp

                    where ename = 'BLAKE');

     

    ●결과가 하나 이상인 서브쿼리

    -서브쿼리를 통해 가져온 결과가 하나이상인 경우 결과를 모두 만족하거나 결과중 하나만 만족하거나 해야 하는 경우가 있다.

    -이때 다음과 같은 연산자를 사용하면 된다.

    IN : 서브쿼리의 결과 중 하나라도 일치하면 조건은 참이 된다.

    ANY, SOME : 서브쿼리의 결과와 하나이상 일치하면 조건은 참이 된다.

    ALL : 서브쿼리의 결과와 모두 일치해야 조건은 참이 된다.

    ...

     

    --3000 이상의 급여를 받는 사원들과 같은 부서에 근무하고 있는 사원의 사원번호이름급여를 가져온다.

    select empno, ename, sal

    from emp

    where deptno in(select deptno

                    from emp

                    where sal >= 3000);

     

    --직무가 CLERK인 사원과 동일한 부서에 근무하고 있는 사원들의 사원번호이름입사일을 가져온다.

    select empno, ename, hiredate

    from emp

    where deptno in (

                select deptno

                from emp

                where job = 'CLERK'

                    );

     

    --KING을 직속상관으로 가지고 있는 사원들이 근무하고 있는 근무 부서명지역을 가지고 온다.

    select  a1.ename,a3.dname, a3.loc

    from emp a1, emp a2, dept a3

    where a1.mgr = a2.empno and a2.ename = 'KING' and a1.deptno = a3.deptno;

     

    select a1.ename, a2.dname, a2.loc

    from emp a1, dept a2

    where a1.deptno = a2.deptno and a1.mgr = (select empno

                                                from emp

                                                where ename='KING');

                                               

    select dname, loc

    from dept

    where deptno in (select deptno

                    from emp

                    where mgr = (select empno

                                from emp

                                where ename = 'KING'));

     

    --CLERK들의 직속상관의 사원번호이름급여를 가져온다.

    select a2.empno, a2.ename, a2.sal

    from emp a1, emp a2

    where a1.mgr = a2.empno and a1.job = 'CLERK';

     

    select empno, ename, sal

    from emp

    where empno in (select mgr

                    from emp

                    where job = 'CLERK');

     

    --각 부서별 급여 평균보다 더 많이 받는 사원의 사원번호이름급여를 가져온다.

    select empno, ename, sal

    from emp

    where sal  > all (select avg(sal)

                    from emp

                    group by deptno

                    );

                   

    select empno, ename, sal

    from emp

    where sal  > (select max(avg(sal))

                    from emp

                    group by deptno

                    );

     

    --각 부서별 급여 최저치보다 더 많이 받는 사원들의 사원번호이름급여를 가져온다.

     

    select empno, ename, sal

    from emp

    where sal > all(select min(sal)

                    from emp

                    group by deptno);

     

    select empno, ename, sal

    from emp

    where sal >     (select max(min(sal))

                    from emp

                    group by deptno);

     

    select min(sal)

    from emp

    group by deptno;

     

    --SALESMAN보다 급여를 적게받는 사원들의 사원번호이름급여를 가져온다.

    select empno, ename, sal

    from emp

    where sal < all(select sal

                from emp

                where job = 'SALESMAN');

     

    select empno, ename, sal

    from emp

    where sal < (select min(sal)

                from emp

                where job = 'SALESMAN');

     

    select sal

    from emp

    where job = 'SALESMAN';

     

    https://rongscodinghistory.tistory.com/90

     

    SET

    - select문을 통해 얻어온 결과에 대해 집합 연산을 할 수 있는 명령문이다.

    - select문을 통해 가져온 컬럼의 형태가 완전히 일치해야 한다.

    -UNION : 합집합 (중복된 데이터 배제)

    -UNION ALL : 합닙합. 중복된 데이터를 모두 가져온다.

    -INTERSECT : 교집합

    -MINUS : 차집합

     

    --UNION 

    select empno, ename, job, deptno 
    from emp 
    where deptno = 10 
    union 
    select empno, ename, job, deptno 
    from emp 
    where job = 'CLERK'; 

    --UNION ALL 
    select empno, ename, job, deptno 
    from emp 
    where deptno = 10 
    union all 
    select empno, ename, job, deptno 
    from emp 
    where job = 'CLERK'; 

    --INTERSECT 
    select empno, ename, job, deptno 
    from emp 
    where deptno = 10 
    intersect 
    select empno, ename, job, deptno 
    from emp 
    where job = 'CLERK'; 

    --minus (
    위에 있는 select문에서 아래 있는 select문을  
    select empno, ename, job, deptno 
    from emp 
    where deptno = 10 
    minus 
    select empno, ename, job, deptno 
    from emp 
    where job = 'CLERK';

     

    인프런 - 윤재성의 Oracle SQL Database 11g PL/SQL Developer

    'oracle' 카테고리의 다른 글

    requestScope Bean주입  (0) 2020.09.15
    Update  (0) 2020.08.27
    select( join전까지)  (0) 2020.08.12

    댓글

Designed by Tistory.