DB/sql

6. select 심화 - join

wooweee 2023. 4. 16. 15:53
728x90
  • join
    == 이중 for 문
    사용 위치 : where
    • equijoin
    • non-equijoin : 등급
    • outer join : (+), data가 부족한 쪽
    • self join : 계층구조, alias 필요

 

-- 이중 for문
SELECT * 
FROM STUDENT.S_EMP, STUDENT.S_DEPT; -- 275개 생성. for문처럼 개수 내려옴.
where -- 을 써야지 필요한 경우의 내용만 추려서 나온다.
;

 

1. equijoin

-- 1. equijoin

-- 직원(s.emp)테이블과 부서(s.dept)테이블을 join하여 사원의 이름,부서,부서명 나타내시오.
SELECT se.NAME , se.DEPT_ID , sd.NAME  
from S_EMP se , S_DEPT sd 
WHERE se.DEPT_ID = sd.ID 
;

-- 서울 지역에 근무하는 사원에 대해 사원의 이름과 근무하는 부서명 출력
-- 현재 join을 3개 사용하는 이유는 3개 필요하기 때문 -> and와 = 을 이용해서 서로 연결 시켜준다.
-- 연결된 상태에서 사원, 서울을 조건으로 맞춰준다. - 순서는 상관 없다.

SELECT  se.NAME , sd.NAME 
from S_REGION sr , S_DEPT sd ,S_EMP se 
WHERE sr.ID = sd.REGION_ID
AND sd.ID =se.DEPT_ID 
AND se.TITLE = '사원'
AND sr.NAME = '서울특별시'
;

 

2. non-equijion

-- 2. non-equijoin 
-- between
-- 각 사원에 대하여 급여와 급여 동급이 무엇인지 알고 싶을 경우
SELECT se.NAME , se.SALARY , s.GRADE  
FROM S_EMP se , SALGRADE s
WHERE se.SALARY BETWEEN s.LOSAL AND s.HISAL
;

-- 아래와 같이 *로 모든 table의 column값을 보면 이해가 쉽다.
SELECT *
FROM S_EMP se , SALGRADE s
WHERE se.salary BETWEEN s.losal and s.hisal

 

3. outer join

-- 3. outer join
-- inner join 반대 의미로, 부족한 부분을 채워준다.
-- 직원과 고객에서 사원의 이름과 사번, 각 사원 담당고객 이름을 나타내시오. 고객이 담당영업사원없어도 나타내시오.
SELECT se.NAME , se.ID , sc.NAME 
FROM S_EMP se , S_CUSTOMER sc
WHERE se.ID = sc.SALES_REP_ID(+) -- 데이터 양이 부족한 부분에 (+) 작성
-- data가 부족한 부분만 보고 싶으면 AND id is not Null  작성
;

 

4. self join

-- 4. self join
-- 자기 자신, 계층 구조 때 사용 - 대중소 비교, 상사-부하 관
-- 각 직원의 이름과 상사의 이름을 출력
SELECT se.NAME , se.MANAGER_ID , se2.NAME 
FROM S_EMP se , S_EMP se2 
WHERE se.MANAGER_ID = se2.ID 
;

-- 김정미와 같은 직책(se1.title)을 가지는 사원(se.title)의
-- 이름(se.name), 직책(se.title) 급여(se.salary), 부서번호(se.dept)
-- 서울 지역에 근무하는 사원에 대해 사원의 이름과 근무하는 부서명 출력 - 이것과 반대로 where문 수행

SELECT se1.name, se1.TITLE ,se1.SALARY , SE1.DEPT_ID 
FROM S_EMP se , S_EMP se1
WHERE se.NAME = '김정미' -- 이중 for문 생각
and se1.TITLE = '사원'  -- 이중 for문 생각
and se.DEPT_ID = se1.DEPT_ID 
;

 

 

5. join 실행 방법 종류

 

  • normal 하게 사용
    • Nested Loop Join: 바깥쪽 테이블의 각 행을 내부 루프로 순회하며 조인 조건과 일치하는 행을 찾습니다. Nested Loop Join은 작은 테이블과 큰 테이블을 조인할 때 주로 사용됩니다.
  • data 너무 많을 경우 사용
    • new version
      Hash Join: 조인 조건의 해시 값을 기준으로 바깥쪽과 내부 테이블을 해시 테이블로 만들고, 해시 테이블을 기반으로 조인을 수행합니다. 일반적으로 메모리를 많이 사용하지만 대용량 데이터를 처리할 때 성능이 우수합니다.

    • old version
      Sort Merge Join: 조인에 참여하는 테이블을 정렬한 후에 정렬된 순서로 조인을 수행합니다. 정렬 작업이 필요하지만 테이블의 크기가 클 경우에도 효율적으로 동작합니다
  • 굳이 추가하면 subquery join