스마트인재개발원에서 배운 데이터베이스 - 복습2-1

ㅇ 본 수업은 "스마트인재개발원"에서 진행되었습니다.

https://www.smhrd.or.kr/


#스마트인재개발원 #국비지원코딩교육 #데이터베이스 #등가조인 #포괄조인 #비등가조인 #자체조인




<목차>
ㅇ 등가 조인
ㅇ 포괄 조인
ㅇ 비등가 조인
ㅇ 자체 조인




(내생각) 윗도리랑 바지 이야기로 이해하면 쉬운 듯




ㅇ 조인조건의 종류

(2개 이상의 테이블에 수행)

  • 등가 조인 : 조인시킬 테이블에 같은 데이터가 존재할 때
    • = 연산자 사용
    • 현업에서 발생하는 99% : PK=FK
  • 비등가 조인 : 데이터가 다를 때
    • 다른 비교연산자 사용. 가장 많이 사용하는 건 비트윈
  • 포괄 조인 : 어느 한쪽 테이블에 데이터가 더 많을 때
    • 적은 쪽에 (+)를 붙여

(1개의 테이블에 수행)

  • 자체 조인
    • 조인시킬 테이블이 한 개야
    • 셀프조인 내에서 이큐.논이큐.아우터 조인



ㅇ 등가조인 이큐조인 equi join

  • 테이블에 같은 데이터 존재할 시 수행
  • PRIMARY KEY와 FOREIGN KEY로 연결되어 있는 테이블에서 가장 많이 발생

ㅇ 실습

SELECT e.last_name, d.department_name, e.department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id

106 rows selected.

  • 사원 107명인데 왜 106명 나올까?
    • 부서 번호가 없는 애가 있어서

ㅇ AND 연산자 사용한 추가 검색 조건

ㅇ 실습 : 90번 부서에 근무하는 사원 이름, 급여, 근무하는 부서이름을 출력하자.

SELECT e.last_name, d.department_name, e.department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id
AND e.department_id=90
  • 풀이 순서
    • 셀렉트 리스트 결정하기 : 이름, 급여, 부서
    • 프럼절 : 테이블이 2개 필요하네? => 조인
      • 알리아스 쓰고 셀렉트에 접두어 붙여
    • 조인조건 : 2-1=1개 => PK=FK
    • 추가 조건 : 90번 부서
      • 사원에 대해 얘기하고 있고, d에는 사원이 없는 부서번호도 존재하므로 e에서 찾자
      • 조건이 추가되니까. AND로 조건절 추가

ㅇ 세 개 이상의 테이블 조인

  • 조인 조건 : e.d_id=d.d_id, d.lo=l.lo
  • 사원들 이름과 각자가 근무하는 부서 이름과 도시를 알고 싶을 때
SELECT e.last_name, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id=d.department_id 
AND d.location_id=l.location_id



ㅇ 포괄조인 아우터조인 outer join

  • 조인 기준 열의 어느 한쪽이 NULL이어도 강제로 출력하는 방식
  • 부족한 쪽에 아우터 연산자 (+)를 붙여 NULL 행을 삽입

ㅇ 실습 : 우리회사에 근무하는 모든 사원 나열하고 그 사원이 근무하고 있는 부서 이름 출력하기 (사원 빼먹지 않고 출력)

SELECT e.last_name, e.salary, d.department_name
FROM employees e, departments d
WHERE e.department_id=d.department_id (+)

107 rows selected.

  • (+) 없이 그냥 이큐 조인 한다면?

    • 행 106개 나와 (사원수인 107이 아니라)
    • 사원 한 명이 부서 이름이 배당되지 않아서 제외되어 버렸어
    • 즉, 부서 이름이 NULL인 사람은 날라가버려
  • e.department_id (+) = d.department_id 로 한다면?

    • 부서 빼먹지 않고 출력
    • 사원 별 근무 부서가 뜨되, 근무하는 사원이 없는 부서까지 모두 출력
    • 122 rows selected. 가 뜸

ㅇ 실습 자료를 해석하는 것이 중요해

  • 122-106=16의 의미 : 사원이 없는 부서 수

    • 122 : 모든 사원과 + (사원이 없는) 부서까지
    • 106 : 근무하는 부서가 있는 사원 수
  • 27-16=11의 의미 : 사원이 있는 부서 수

    • 27 : 전체 부서 수
    • 16 : 사원이 없는 부서 수



ㅇ 비등가조인 논이큐조인 non-equi join

  • 데이터가 서로 다를 때 수행
    • salary는 구체적인 가격 ≠ job grades는 low ~ high salary에 대한 등급
    • 즉 샐러리(숫자)와 등급(문자)를 연결하고 싶을 때
  • 보통 BETWEEN 연산자 사용
  • 예)
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal




ㅇ 자체 조인

ㅇ 자체 참조

  • 테이블 내에서 FK 설정
  • 예) e테이블에서 m_id는 e_id를 참조하는 FK
  • 자체 참조의 첫 번째 행은 무조건 널
    • 아무것도 없는 데서 값을 가져올 수 없잖아 ~
    • 첫 번째가 널인 컬럼은 자체참조 의심하기!

ㅇ 자체조인 셀프조인 self join

  • ALIAS를 이용해 여러 개의 테이블인 것처럼 만들어 사용
    ( FROM 절에 ALIAS를 써서 하나의 테이블을 여러 개로 만드는 건 엄청 막강한 거니 꼭꼭 알아두기 ★★)

ㅇ 실습 : 우리 회사에 근무하는 사원의 번호와 이름, 그 사원을 관리하는 관리자의 번호와 관리자 이름을 출력하시오.

  • e테이블에는 관리자인 사람, 관리자가 아닌 사람 모두의 사원 정보가 저장되어 있어
  • 관리자 이름 => e테이블의 사원이름
    관리자 번호 => e테이블의 사원번호
  • 내가 찾고자 하는 데이터가 그 데이터 내에 있어 => 셀프조인
    • 사원 찾을 e테이블과 관리자 찾을 m테이블로 구분
  • e테이블의 관리자 번호 = m테이블의 사원 번호

SELECT e.employee_id, e.last_name, e.manager_id, m.last_name
FROM employees e, employees m
WHERE e.manager_id=m.employee_id


좋은 웹페이지 즐겨찾기