JOIN

Suhyeon Lee·2024년 9월 8일
0

JOIN

  • 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
  • 관련된 필드들을 기준으로 결합
  • MySQL에서는 JOIN 명령어로 두 테이블을 결합할 수 있으며 이 때 결합 조건은 ON 명령어로 줌

JOIN의 종류

  • INNER JOIN(내부 조인)
    • 결합 조건을 만족하는 데이터만 선택해 두 테이블 결합
    • 두 테이블 모두 지정한 열의 데이터가 있어야 함
  • OUTER JOIN(외부 조인)
    • 결합 조건을 만족하지 않아도 종류에 따라 특정 데이터를 모두 선택해 두 테이블 결합
    • 1개의 테이블에만 데이터가 있어도 결과 나옴
    • LEFT JOIN
      • 첫 번째 테이블의 데이터를 모두 선택한 후, 두 번째 테이블의 데이터를 결합 조건에 따라 매칭
      • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
    • RIGHT JOIN
      • 두 번째 테이블의 데이터를 모두 선택한 후, 첫 번째 테이블의 데이터를 결합 조건에 따라 매칭
      • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
    • FULL OUTER JOIN
      • 두 테이블의 데이터를 모두 선택하고 결합 조건에 따라 데이터 매칭
      • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
      • MySQL에서는 FULL OUTER JOIN 명령어를 지원하지 않으므로 LEFT JOINRIGHT JOINUNION하여(합집합을 구해) 사용할 수 있음
SELECT *
FROM a
LEFT JOIN b

UNION

SELECT *
FROM a
RIGHT JOIN b;
  • UNION은 중복 제외(DISTINCT) 출력이 디폴트
    • 중복 포함 출력은 UNION ALL
  • UNIONUNION ALL은 칼럼명이 동일해야 함
    • 같지 않을 경우에는 별칭(alias)을 사용해 같게 해주어야 함
    • 칼럼별 데이터타입 또한 모두 같아야 함

  • CROSS JOIN(상호 조인)
    • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능
    • 상호 조인 결과의 전체 행 수는 두 테이블의 각 행의 개수를 곱한 수만큼 됨
      • 카티션 곱(CARTESIAN PRODUCT)이라고도 함

  • SELF JOIN(자체 조인)
    • 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용
    • 별도의 문법이 있는 건 아니고 1개로 조인하면 자체 조인이 됨

예시

Residents: A마을 거주자

idnamepet_id
1Maria1
2ErinNULL
3Rafael3
4Eugene2

Animals: A마을에 사는 동물

idnamespecies
1Momocat1
2Jindoldog4
3NabicatNULL
4ChocodogNULL
5Reodog3

INNER JOIN

  • 결합 조건을 만족하는 데이터만 선택해 두 테이블 결합
  • MySQL에서는 JOIN 명령어를 이용해 구현
  • INNER JOIN을 이용해 residents, animals 테이블에서 주인 이름과 반려동물 이름 조합들을 출력할 수 있음
SELECT residents.name AS owener_name, animals.name AS pet_name
FROM residents JOIN animals ON residents.id = animals.owner_id;
owner_namepet_name
MariaMomo
EugeneJindol
RafaelReo

OUTER JOIN

  • 결합 조건을 만족하지 않아도 그 종류에 따라 특정 테이블의 데이터를 모두 선택에 두 테이블을 결합
  • LEFT JOIN(LEFT OUTER JOIN)
    • 첫 번째 테이블의 데이터를 모두 선택한 후, 두 번째 테이블의 데이터를 결합 조건에 따라 매칭
    • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
    • MySQL에서는 LEFT JOIN 명령어를 이용
SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT JOIN animals ON residents.id = animals.owner_id;

SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT OUTER JOIN animals ON residents.id = animals.owner_id;
resident_namepet_name
MariaMomo
ErinNULL
RafaelReo
EugeneJindol
  • RIGHT JOIN(RIGHT OUTER JOIN)
    • 두 번째 테이블의 데이터를 모두 선택한 후, 첫 번째 테이블의 데이터를 결합 조건에 따라 매칭
    • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
    • MySQL에서는 RIGHT JOIN 명령어를 이용해 구현
    • LEFT JOIN과 RIGHT JOIN은 데이터를 모두 출력하는 테이블만 다르기 때문에 a LEFT JOIN bb RIGHT JOIN a와 같음
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT JOIN animals ON residents.pet_id = animals.id;

SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT OUTER JOIN animals ON residents.pet_id = animals.id;

SELECT animals.name AS animal_name, residents.name AS owner_name
FROM animals LEFT JOIN residents ON animals.id = residents.pet_id;
animal_nameowner_name
MomoMaria
JindolEugene
NabiNULL
ChocoNULL
ReoRafael
  • FULL OUTER JOIN
    • 두 테이블의 데이터를 모두 선택하고, 결합 조건에 따라 데이터를 매칭
    • 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
    • 두 테이블의 합집합 결과와 같음
    • MySQL에서는 FULL OUTER JOIN을 구현하기 위한 명령어를 기본적으로 제공하지 않기 때문에 LEFT JOIN과 RIGHT JOIN의 합집합을 구해 FULL OUTER JOIN의 값을 얻을 수 있음
SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT JOIN animals ON residents.id = animals.owner_id
UNION
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT JOIN animals ON residents.pet_id = animals.id;
resident_nameanimal_name
MariaMomo
ErinNULL
RafaelReo
EugeneJindol
NULLNabi
NULLChoco
  • 정리
    • INNER JOIN: 주인-반려동물 조합
    • OUTER JOIN
      • LEFT JOIN: 거주민-반려동물 조합
      • RIGHT JOIN: 동물-주인 조합
      • FULL OUTER JOIN: 거주민-동물 조합
profile
2 B R 0 2 B

0개의 댓글