[코딩 자율학습 14기] SQL 데이터베이스 입문 7장

안지원·2025년 5월 1일

SQL

목록 보기
7/10

7장. 테이블 조인하기

  • 여러 테이블에 분산 저장된 데이터 중 연관된 데이터들을 한 번에 보려면 어떻게 해야 할까요?
  • 이 글에선 여러 테이블에 있는 데이터를 하나로 가져오는 방법인 JOIN에 대해 알어보도록 하겠습니다.

📗조인(JOIN)

  • 조인(join)이란 테이블 간에 일치하는 칼럼을 기준으로 두 테이블을 하나로 합쳐 보여주는 명령어입니다.
  • 두 테이블을 연결하면 각 테이블에 따로 저장된 데이터들을 한 번에 조회할 수 있습니다.
  • 6장에서 만들었던 DB를 통해 실습을 진행할 예정입니다.(별그램 테이블)

📌 1번 사진의 댓글 조회하기

  • 1번 사진의 댓글을 가져오는건 photo_id가 1인 댓글들을 가져오는 where절을 통해 쉽게 가져올 수 있습니다.
  • 하지만 현재 가져온 테이블에선 댓글을 단 유저의 닉네임은 확인할 수 없습니다.
  • 댓글을 단 유저의 닉네임을 확인하기 위해선 comments 테이블뿐만 아니라 users테이블에 있는 nickname 칼럼도 가져와야 합니다.
  • 이때 조인(JOIN)을 사용하면 두 테이블의 값을 묶어 하나의 논리 테이블(논리 테이블 맞나?)을 만들 수 있습니다.
  • 조인 방식은 다음과 같습니다.
SELECT 칼럼명1, 칼럼명2 ...
FROM 테이블A
JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼
  • SELECT절에 입력하는 칼럼명은 조인하는 테이블들 안에 있는 칼럼명을 넣으면 됩니다.(*를 입력하면 두 테이블의 칼럼을 합쳐 가져옵니다.)
  • FROM절엔 기준이 될 테이블을 입력하면 됩니다.(테이블A를 기준으로 테이블B를 조인한다.)
  • JOIN절엔 JOIN할 테이블명을 입력하고 뒤에 붙는 ON키워드 뒤엔 테이블 통합 조건을 넣으면 됩니다.
  • 여기서 테이블 통합 조건은 보통 테이블끼리 연결되어있는 기본키(PK)와 외래키(FK)의 관계로 조건을 넣습니다.

📌 조인의 특징

  • 두 테이블을 하나로 합치는 조인은 7가지 특징이 있습니다.

1. 조인 칼럼이 필요하다.

  • 두 테이블 간에 조인을 수행하기 위해선 최소한 하나의 공통 칼럼, 즉 조인 칼럼이 필요합니다.
  • 조인 칼럼은 보통 한 테이블에서는 외래키(FK)이고, 다른 테이블에서는 기본키(PK)가 됩니다.

2. 조인 칼럼은 자료형이 일치해야 한다.

  • 조인 칼럼은 서로 자료형이 일치해야 합니다.
  • 예를 들어 정수형 값을 가진 칼럼과 문자형 값을 가진 칼럼을 조인하려고 하면 에러가 납니다.
  • 자료형이 같은 칼럼만 조인이 가능합니다.

3. 조인 조건을 명시해야 한다.

  • 투 테이블을 조인하려면 반드시 ON 키워드를 넣어 조인이 되는 조건을 명시해야 정상적으로 조인할 수 있습니다.

4. 연속적으로 조인할 수 있다.

  • 조인은 2개 테이블뿐만 아니라 3개, 4개 이상으로 늘려가며 수행할 수 있습니다.
  • 다음과 같이 JOIN절을 추가하면 comments 테이블과 users테이블을 합친 결과에 다시 photos 테이블을 합칠 수 있습니다.

5. 중복 칼럼은 테이블명을 붙여 구분한다.

  • 조인한 테이블들 사이에 중복된 칼럼이 존재한다면 테이블명.칼럼명과 같이 칼럼명 앞에 테이블명을 붙여 사용합니다.
  • 만약 중복 칼럼인테 테이블명을 명시하지 않으면 에러가 발생하게 됩니다.
  • 중복되는 테이블명 입력시 오류 발생
  • comments.id, users.id로 중복되는 칼럼명을 구분해주면 정상적으로 값 출력

6. 테이블명에 별칭을 사용할 수 있다.

  • 조인하는 테이블에 별칭을 붙여 사용할 수 있습니다.
  • 별칭을 붙일땐 AS키워드를 사용하여 붙입니다.

7. 적절한 조인 유형을 선택한다.

  • 조인할 때는 상황에 따라 적절한 조인 유형(INNER 조인, LEFT 조인, RIGHT 조인, FULL 조인)을 선택해야 합니다.
  • 어떤 조인을 선택하냐에 따라 테이블의 형태와 포함하는 데이터가 달라집니다.

📌 조인의 유형

  • 조인은 4가지 유형을 가지고 있습니다.
  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN

INNER 조인

  • INNER 조인은 가장 기본이 되는 조인입니다.
  • 양쪽 테이블에서 조인 조건을 만족하는 데이터를 찾아 조인합니다.
  • INNER 조인의 형식인 다음과 같습니다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
INNER JOIN 테이블B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;
  • 여기서 INNER 키워드는 생략할 수 있습니다.
  • JOIN의 기본형태가 INNER JOIN이기 때문입니다.

LEFT 조인

  • LEFT 조인은 왼쪽 테이블(FROM 절의 테이블)의 모든 데이터에 대해 오른쪽 테이블(JOIN 절의 테이블)을 조인합니다.
  • 다시 말해 왼쪽 테이블의 모든 데이터에 대해 조인 조건을 만족하는 오른쪽 테이블의 데이터를 찾아 조인하고, 오른쪽 테이블에 해당하는 데이터가 없으면 NULL 값으로 채웁니다.
  • LEFT 조인의 형식은 다음과 같습니다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
LEFT JOIN 테이블.B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

  • 다음과 같이 LEFT 조인하면 photos 테이블의 모든 데이터에 대해 조인 가능한 users 테이블의 데이터를 찾아 연결하고 조인이 불가능할 경우 NULL값으로 채웁니다.

RIGHT 조인

  • RIGHT 조인은 오른쪽 테이블(JOIN 절의 테이블)의 모든 데이터에 대해 왼쪽 테이블(FROM 절의 테이블)을 조인합니다.
  • LEFT와 조인 조건의 주체가 바뀐 테이블 JOIN방식입니다.
  • RIGHT 조인의 형식은 다음과 같습니다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
RIGHT JOIN 테이블.B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;

FULL 조인

  • FULL 조인은 두 테이블의 모든 데이터를 결합하는 조인입니다.
  • 두 테이블에 조인 칼럼 값이 같은 데이터뿐만 아니라 그렇지 않고 한 테이블에만 존재하는 데이터도 모두 반환하고 빈 칼럼은 NULL 값으로 채웁니다.
  • FULL 조인의 형식은 다음과 같습니다.
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블A
FULL JOIN 테이블.B ON 테이블A.조인_칼럼 = 테이블B.조인_칼럼;
  • 그런데 mySql에선 FULL JOIN을 지원하지 않습니다.
  • 하지만 유니온 연산자를 사용하면 FULL JOIN을 한 것 처럼 결과를 만들수 있습니다.

📌 UNION 연산자

  • UNION 연산자는 두 쿼리의 결과 테이블을 하나로 합치는 집합 연산자입니다.
  • 만약 중복 튜플을 제거하지 않고 합치고싶다면 UNION ALL 연산자를 사용합니다.
  • UNION 연산자를 사용하려면 두 쿼리의 결과 테이블 내 칼럼 개수와 각 칼럼의 자료형이 정확히 일치해야 합니다.
-- 중복 튜플 제거하고 합치기
(쿼리A)
UNION
(쿼리B);
-- 중복 튜플 그대로 둔 채 합치기
(쿼리A)
UNION ALL
(쿼리B);

  • 다음과 같이 LEFT JOIN 테이블과 RIGHT JOIN 테이블을 UNION으로 결합해 FULL JOIN을 한 테이블과 같은 결과값을 만들 수 있습니다.

📌 조인 실습 : 별그램 DB

1. '홍팍'이라는 사용자가 올린 사진 목록 출력하기

2. '홍팍'이라는 사용자가 올린 사진의 좋아요 수 세기

  • JOIN절에 AND를 붙이면 where절을 쓸 필요없이 상세하게 필터링을 할 수 있습니다.

3. '해삼'이라는 사용자가 쓴 댓글 개수 세기

4. 모든 댓글 본문 및 댓글이 달린 사진의 파일명 조회

  • 또는

📌 셀프체크

1. 사용자가 자신의 계정을 공개하는지 여부 조회

2. 누가 올렸는지 확인할 수 있는 사진에 대해서만 사진 파일명과 올린 사람 조회하기

3. 모든 사진에 대해 사진 파일명과 올린 사람 조회(올린 사람이 누구인지 모르는 사진도 조회)

profile
frontend개발자가 되기 위해 노력합니다.

0개의 댓글