조인공부

이소연's avatar
Aug 05, 2024
조인공부
 

현 상황

커뮤니티의 상세보기 화면 구현 중, 커뮤니티 게시판, 주제, 제목, 내용은 구현하였음 댓글의 내용, 유저-유저id는 어떻게 들고 올 것인가?
 
JOIN 5줄 요약 조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다. OUTER JOIN(외부 조인)은 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다. CROSS JOIN(상호 조인)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다. SELF JOIN(자체 조인)은 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.
 
 
 
일단 하나씩 해보자.
제일 간단한
userid를 받아오는 것부터 해보자.
 
조인 예제 1
 
 
내 식으로 정리하자면,
💡
-inner join : 교집합 -outer join : 둘 중 어디에 있어도 나올게 -cross join : 합집합
 
조인 : 내가 원하는 결과들을 합해 놓은 것.
지금은 조인의 종류보다는 조인을 쓸 줄 아는 것에 초점.
 

조인 틀

💡
select <출력할 열 > From <가져올 table> where <조건>
💡
select <출력할 열> from <기본 틀 되는 table> [inner/outer/cross] join <조인할 테이블>on <조인을 할 조건>
 
조인예제

students 테이블

id
name
1
Alice
2
Bob
3
Carol
4
Dave

scores 테이블

student_id
score
1
85
2
90
4
78
5
92

INNER JOIN

INNER JOIN은 두 테이블에서 매칭되는 행만 반환합니다.
sql코드 복사 SELECT students.id, students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.student_id;

결과

id
name
score
1
Alice
85
2
Bob
90
4
Dave
78

LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 매칭되는 행을 반환합니다. 매칭되지 않는 오른쪽 테이블의 값은 NULL로 표시됩니다.
sql코드 복사 SELECT students.id, students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.student_id;

결과

id
name
score
1
Alice
85
2
Bob
90
3
Carol
NULL
4
Dave
78

RIGHT JOIN

RIGHT JOIN은 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 매칭되는 행을 반환합니다. 매칭되지 않는 왼쪽 테이블의 값은 NULL로 표시됩니다.
sql코드 복사 SELECT students.id, students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.student_id;

결과

id
name
score
1
Alice
85
2
Bob
90
NULL
NULL
92
4
Dave
78

FULL OUTER JOIN

FULL OUTER JOIN은 두 테이블에서 매칭되는 행을 모두 반환하며, 매칭되지 않는 행은 NULL로 표시됩니다.
sql코드 복사 SELECT students.id, students.name, scores.score FROM students FULL OUTER JOIN scores ON students.id = scores.student_id;

결과

id
name
score
1
Alice
85
2
Bob
90
3
Carol
NULL
4
Dave
78
NULL
NULL
92
 

조인3개

notion image
목표는 각 학생이 어떤 과목을 수강했는지 조회하는 것입니다.

JOIN을 사용한 쿼리

세 개의 테이블을 조인하기 위해 두 번의 JOIN을 사용합니다. 각 학생이 수강한 과목 이름을 조회하려면 students 테이블과 enrollments 테이블을 먼저 조인하고, 그 결과를 courses 테이블과 조인하면 됩니다.
sql코드 복사 SELECT students.name, students.age, courses.course_name FROM students JOIN enrollments ON students.student_id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.course_id;
이 쿼리의 결과는 다음과 같습니다:
이름 (name)
나이 (age)
과목 이름 (course_name)
철수
21
수학
철수
21
과학
영희
22
역사
민수
20
미술
민수
20
물리학

설명

  1. studentsenrollmentsstudent_id를 기준으로 조인합니다.
  1. 그 결과를 coursescourse_id를 기준으로 조인합니다.
이 방식으로 세 개의 테이블을 쉽게 조인할 수 있습니다. 각 테이블 간의 관계를 명확하게 이해하고, 그 관계를 기준으로 조인하여 필요한 데이터를 조회할 수 있습니다.
 

조인 쿼리의 기본 틀

기본적으로 조인 쿼리는 다음과 같은 구조를 가집니다:
sql코드 복사 SELECT [컬럼 목록] FROM [첫 번째 테이블] JOIN [두 번째 테이블] ON [조인 조건] JOIN [세 번째 테이블] ON [조인 조건] ...
여기서:
  • [컬럼 목록]은 조회하고자 하는 컬럼들을 나열한 것입니다.
  • [첫 번째 테이블]은 기본 테이블입니다.
  • [두 번째 테이블][세 번째 테이블] 등은 조인할 테이블들입니다.
  • [조인 조건]은 두 테이블 간에 어떤 기준으로 조인할지를 지정하는 조건입니다.
SELECT students.name, students.age, courses.course_name FROM students JOIN enrollments ON students.student_id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.course_id;
이 쿼리를 실행하면 각 학생이 수강한 과목 이름을 조회할 수 있습니다.

세부 설명

  1. SELECT: 조회할 컬럼 목록을 나열합니다.
      • students.name: 학생의 이름
      • students.age: 학생의 나이
      • courses.course_name: 과목 이름
  1. FROM: 기본 테이블을 지정합니다.
      • students 테이블을 기본 테이블로 사용합니다.
  1. JOIN: 다른 테이블과의 조인 조건을 지정합니다.
      • enrollments 테이블을 students.student_idenrollments.student_id를 기준으로 조인합니다.
      • courses 테이블을 enrollments.course_idcourses.course_id를 기준으로 조인합니다.
       

      기본 테이블 선택 기준

    1. 조회하고자 하는 주요 데이터: 조회하려는 주요 데이터는 학생의 이름과 나이입니다. 따라서 students 테이블이 기본 테이블이 됩니다.
    2. 데이터의 논리적 흐름: 학생 정보에서 시작하여 수강 기록을 통해 과목 정보로 흐르는 논리적 순서를 따릅니다.
    3. 다른 테이블과의 관계: students 테이블은 enrollments 테이블과 student_id를 통해 관계를 맺고 있으며, enrollments 테이블은 courses 테이블과 course_id를 통해 관계를 맺고 있습니다.
    4. 쿼리 작성

      이제 기본 테이블을 students 테이블로 선택하고, 조인 쿼리를 작성합니다.
      sql코드 복사 SELECT students.name, students.age, courses.course_name FROM students JOIN enrollments ON students.student_id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.course_id;

      세부 설명

    5. FROM students: students 테이블을 기본 테이블로 선택합니다.
    6. JOIN enrollments ON students.student_id = enrollments.student_id: enrollments 테이블과 학생 ID를 기준으로 조인합니다.
    7. JOIN courses ON enrollments.course_id = courses.course_id: courses 테이블과 과목 ID를 기준으로 조인합니다.
Share article

Coding's note