Oracle

Oracle Join / SubQuery

LightCY 2020. 8. 9. 17:47

★중요 !  1. Join 의 종류 6가지를 적고 각각 어떤 역할을 하는지 적으시오

 

- INNER JOIN : 외래키로 이어진 테이블들의 다른 컬럼값을 조회할때

 

 

- LEFT OUTER JOIN : 외래키로 이어진 테이블들 중 FROM 절에 있는 테이블의 외래키 컬럼값이 NULL이라도 조회할 경우

 

- RIGHT OUTER JOIN : 외래키로 이어진 테이블들 중 RIGHT JOIN 절에 있는 테이블의 외래키 컬럼값이 NULL이라도 조회할 경우

 

 

 

- OUTER JOIN : INNER JOIN과 반대

 

 

- CROSS JOIN : 공통된 컬럼의 값이 일치하든 안하든 각각의 테이블의 컬럼값을 조회하고 싶을 때

 

 

- SELF JOIN : 하나의 테이블에서 부모, 자식 구조로 컬럼값을 조회하고 싶을 때

 

 

★중요 !  2. Join 의 종류 6가지를 어떤 문법으로 사용하는지 적으시오

 

- INNER JOIN 

SELECT

테이블1.컬럼, 테이블2.컬럼

FROM

테이블1

INNER JOIN 

테이블2

ON

테이블1.공통컬럼 = 테이블2.공통컬럼

 

- LEFT OUTER 

SELECT

테이블1.컬럼, 테이블2.컬럼

FROM

테이블1

LEFT OUTER JOIN

테이블2

ON

테이블1.공통컬럼 = 테이블2.공통컬럼

 

 

- RIGHT OUTER

SELECT

테이블1.컬럼, 테이블2.컬럼

FROM

테이블1

RIGHT OUTER JOIN

테이블2

ON

테이블1.공통컬럼 = 테이블2.공통컬럼

 

- OUTER JOIN

SELECT

테이블1.컬럼, 테이블2.컬럼

FROM

테이블1

OUTER JOIN

테이블2

ON

테이블1.공통컬럼 <> 테이블2.공통컬럼

 

- CROSS JOIN

SELECT

테이블1.컬럼, 테이블2.컬럼

FROM

테이블1

CROSS JOIN

테이블2

 

 

- SELF JOIN

SELECT

테이블1.컬럼1, 테이블2.컬럼3

FROM

테이블 as 테이블1

SELF JOIN

테이블 as 테이블2

ON 

테이블1.컬럼1 = 테이블2.컬럼2

 

★중요 !  3. SELECT  (   )  FROM   (   )   WHERE  (   ) 

각 ( )위치에 해당하는 서브쿼리명칭과 역할, 결과를 적으시오.

( 보기 -  인라인 뷰,  스칼라 서브쿼리, 서브쿼리 )

 

- SELECT(스칼라 서브쿼리) : 서브쿼리의 결과를 하나의 컬럼처럼 사용하고 싶을 때 

- FROM(인라인 뷰) : 뷰테이블처럼 결과가 동적으로 생성된 테이블로 사용

- WHERE(서브쿼리) : 서브쿼리의 결과로 조건을 줘서 데이터를 조회하고 싶을 때

 

 

★중요 !  4. 단일행 서브쿼리와 다중 행 서브쿼리 비교연산자를 각각 적으시오.

 

- 단일행 서브쿼리 : =, <>, < , <=, >, >=

- 다중행 서브쿼리 : IN, ANY, ALL, EXISTS

 

★중요 !  5. 다중행 비교 연산자 각각의 설명과 사용법을 적어주세요

 

- IN : 하나의 컬럼이 여러개의 "=" 조건을 가지는 경우

SELECT

ename, sal, deptno

FROM

emp

WHERE

sal IN (select MIN(sal) from emp group by deptno)

 

- ANY : 여러 결과값 중 하나의 값만 만족하면 행 반환

select sal from emp where job = 'SALESMAN'

 

 

SELECT

*

FROM

emp

WHERE

sal > ANY (select sal from emp where job = 'SALESMAN')

 

 

설명)

SELECT

*

FROM

emp

WHERE

sal > ANY (select sal from emp where job = 'SALESMAN')

 

이거는

 

SELECT

*

FROM

emp

WHERE

sal > ANY (1600.00, 1250.00, 2850.00, 1500.00);

 

이거랑 같은 것

그러므로

SELECT

*

FROM

emp

WHERE

sal > 1600.00 OR
sal > 1250.00 OR

sal > 2850.00 OR

sal > 1500.00

이런 뜻이다.

 

 

 

 

 

- ALL : 서브쿼리 결과값 중 모든 결과를 만족하는 행을 반환

 

select *
from emp
where sal > all (select sal from emp where job="SALESMAN")

 

 

설명)

select *
from emp
where sal > all (select sal from emp where job="SALESMAN")

 

위 쿼리문은

 

select *
from emp
where sal > all (
1600.00, 1250.00, 2850.00, 1500.00)

 

이러므로

결국

 

 

select *
from emp

where

sal > 1600.00 AND

sal > 1250.00 AND

sal > 2850.00 AND

sal > 1500.00

 

이랑 같은 뜻이다.

 

 

 

 

- EXISTS : 서브쿼리의 값이 있을 경우 메인쿼리 수행

select job from emp where job="DEV"

 

해당 쿼리의 결과값은 존재하지 않는다.

 

select *
from emp
where
 exists (select job from emp where job="DEV")

 

 

 

그러므로 메인쿼리는 실행되지 않는다.

 

 

★중요 !  6. 3개 종류의 서브쿼리 예제를 각각 한개씩 작성하고 결과를 보여주세요.

 

- 인라인 뷰

select dno.*
from (select * from emp where deptno=10) as dno

 

 

 

- 스칼라 서브쿼리

select empno, (select dname from dept d where d.deptno = e.deptno) dname, job
from emp e
where e.job="MANAGER"

 

 

 

- 중첩 서브쿼리

select *
from emp
where sal > (select sal from emp where ename="ALLEN")

 

 

 

★★중요7 . 다음 결과를 도출하도록 쿼리를 작성해서 제출하고 결과를 캡쳐해서 올려주세요.

 

-    부서별로 평균 임금보다 많이 받는 사원을 구하세요.     -

 

select
 empno,
 ename,
    sal as '급여',
 (select avg(sal) from emp e2 where e1.deptno=e2.deptno group by deptno) as "평균",
    deptno
from
 emp e1
where
 sal > ANY (
  select avg(sal) from emp e2 where e1.deptno=e2.deptno group by deptno
  )
order by
 deptno