5월 21일 금요일 (9일차) - 조인 기본ㅇ

@_@·2021년 5월 21일
0

Database

목록 보기
15/28

<목차>
ㅇ 카테시안 곱
ㅇ 조인 사용할 때 규칙

  • n-1개 조인조건
  • 접두어로 소유한 테이블 이름 붙이기

ㅇ FROM절에 ALIAS




ㅇ 조인

ㅇ 카테시안 곱

  • FROM 절에 여러 테이블을 선언할 때 조인조건을 생략하거나, 부적합한 경우
    모든 경우의 수로 조합되어 출력돼
  • 예) 질문 : 우리 회사에 근무하는 사원의 이름과 그 사원이 근무하는 부서이름을 출력하시오.
    • 분석 : FROM절은 SELECT LIST절에 나열된 컬럼을 소유한 테이블을 나열해야 해
      • 사원의 이름 -> 사원 테이블
      • 근무하는 부서 이름 -> 부서 테이블
    • 그래서 테이블 2개 다 그냥 적어주면?
      조인조건이 없어서 모든 경우의 수가 나와
    • 사원수107×부서수27=2889개의 행

ㅇ 데이터의 무결성이 깨진 상황

  • 앞의 두 사람은 (departments의)d_id = (employees의)d_id
    : ' d_id=d_id ' = 데이터 일치 = 무결성이 보장되었다
  • 102번 사원은 d_id≠d_id
    : 데이터 불일치 = 무결성이 깨져있다.
  • 여러 테이블의 행을 매칭시켜 줄 때 무결성이 보장되어야 해
  • 무결성을 보장하기 위한 조건 d.d_id = e.d_id (이게 조인조건이 되어야겠지)



ㅇ 조인 : 여러 개의 테이블에서 데이터를 검색하는 방법

  • 테이블들의 데이터를 (행을) 하나로 연결
  • 행 연결을 위해서는 무결성이 보장되어야 한다.
    = 조건에 맞는 데이터로 행을 연결시켜서 무결성을 보장한다.
    = 이 조건이 조인조건


ㅇ 조인을 사용할 때 규칙 2가지

  • n개 테이블 조인하려면 n-1개의 조인조건을 WHERE절에 명시
    • WHERE절이 먼저 실행돼서 조건에 맞는 데이터가 먼저 필터링 돼
  • 조인시킬 테이블에 똑같은 이름의 컬럼이 있을 때
    이를 셀렉트절에 명시할 때는 반드시 컬럼의 소유주인 테이블의 이름을 접두어로 명시
    • 예)
    • 이유
      • last_name은 e에 있고 d에 없어, department_name은 e에 없고 d에 있어
        (즉, 테이블의 고유한 컬럼이라서 헷갈리지 않아)
      • department_id는 e와 d에 모두 있어
        똑같은 컬럼 2개 있는데 나 어디 테이블에서 가져와야 해?? => 에러 나
      • 파싱의 1단계 검증 때 에러 발생
  • 근데 결국 접두어는 항상 붙이는 게 좋아
    • 고유한 컬럼이라도 테이블들 다 뒤지는 작업을 하므로 접두어 붙여주면 그 테이블만 뒤지니까 성능 더 좋아져 (파싱)
    • CF. 테이블 이름은 전문 용어로는 스키마
    • 안 그래도 조인이 시스템의 성능을 떨어뜨리는데 그나마 성능 보장할 수 있도록 접두어 적극 권장
      (성능 떨어뜨리는 기능 1정렬 2조인)



ㅇ FROM절에 ALIAS 사용하기

  • 이 문장이 실행되는 동안만 임플로이는 e 디파트먼트는 d를 사용하겠다.
SELECT e.last_name, d.department_name, e.department_id
FROM employees e, departments d
WHERE e.department_id=d.department_id
  • 현업에서 많이 쓰고, 가독성도 좋아
  • FROM절의 ALIAS 기능은 간단해 보이지만, 실제로는 엄청난 기능들을 제공 (나중에 살펴볼 거야)
  • 풀네임과 알리아스는 혼용에서 사용할 수 없다.
    • 예) FROM절에 employees e 쓰면 employees를 다 e로 바꿔버린 거라서
      elployees라는 테이블은 이 문장에서는 존재하지 않는 게 돼버려
    • 즉, FROM절에 풀네임 썼으면 끝까지 풀네임, ALIAS 썼으면 끝까지 ALIAS
  • 실행 순서가 프럼->웨어->셀렉트->오더바이 라서
    웨어절에는 column에 알리아스 쓸 수 없었지만
    프럼절에서 table에 알리아스 쓰는 것 가능



Q. SELECT절에 e.d_id 말고 d.d_id 써도 되나요??
A. 써도 돼! 그리고 결과는 똑같이 나와
다만, 코드상으로 봤을 때 (코드를 가지고 평가를 한다면) 기준에 맞춰서 써주는 게 좋겠지

  • 내가 사원들을 나열하고 사원들이 근무하는 부서번호를 출력하고 싶으면 -> employees table
  • 내가 회사에 존재하는 부서번호, 거기에 근무하는 사원들 이렇게 나열하고 싶으면 -> departments table


CF. 어떤 조인조건을 써야 할 지가 관건 ㅠㅠ

  • 테이블 관계나 테이블 구조를 정확히 이해 못 하면 이거 자체가 어려워.
  • 첫 프로젝트 때 직접 테이블을 만들기 때문에 구조 정확히 이해할 수 있을 거야~

CF. 성능적으로 보면 조인을 수행 안 할 수 있으면 안 하는 게 좋기는 해. 하지만 현업에서는 발생이 안 할래야 안 할 수 없어.


ㅇ 우리는 오라클 전용 조인 배울 거야
( SQL1999는 명령문을 수행한다는 차이만 있어서)


profile
STEP BY STEP

0개의 댓글