DB

JOIN의 종류

Tree 2024. 10. 19. 12:46

JOIN

JOIN의 종류

  • INNER JOIN: 두 테이블에서 매칭되는 데이터만 가져옵니다.
  • LEFT JOIN: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 매칭 데이터를 가져옵니다.
  • RIGHT JOIN: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 매칭 데이터를 가져옵니다.
  • FULL OUTER JOIN: 양쪽 테이블의 모든 데이터를 가져옵니다.

예시

JOIN 구문에서 "왼쪽"과 "오른쪽" 테이블의 기준은 다음과 같습니다:

  1. 왼쪽 테이블:
    • FROM 절에 명시된 테이블
    • JOIN 키워드 앞에 오는 테이블
  2. 오른쪽 테이블:
    • JOIN 키워드 뒤에 오는 테이블
SELECT *
FROM TableA
LEFT JOIN TableB ON TableA.id = TableB.id
  • TableA가 왼쪽 테이블
  • TableB가 오른쪽 테이블

LEFT JOIN: TableA의 모든 행을 포함하고, 조건에 맞는 TableB의 데이터를 가져옵니다.

RIGHT JOIN: TableB의 모든 행을 포함하고, 조건에 맞는 TableA의 데이터를 가져옵니다.

🤖 FROM

  • 주된 목적: 쿼리의 주 테이블을 지정합니다.
  • 비유하자면: 당신이 찾고 있는 정보의 "시작점"
  • 예: FROM file f는 "file" 테이블에서 정보를 가져오기 시작할 거예요! 라고 말하는 것과 같습니다.

🤖 LEFT JOIN

  • 주된 목적: 쿼리의 주 테이블을 지정합니다.
  • 비유하자면: 당신이 찾고 있는 정보의 "시작점"이에요.
  • 예: FROM file f는 "file" 테이블에서 정보를 가져오기 시작할 거예요라고 말하는 것과 같습니다.

🫥 주요 차이점

  1. FROM은 항상 하나만 있지만 JOIN(LEFT JOIN 포함)은 여러 개 있을 수 있습니다.
  2. FROM은 기본 데이터를 가져오고 LEFT JOIN은 그 데이터에 추가 정보를 덧붙입니다.

실생활 예시

  • FROM: 도서관에서 책(file) 목록을 가져오는 것.
  • LEFT JOIN: 각 책에 대해 현재 대출 중인 **사람(user)**의 정보를 추가로 가져오는 것.

예시로 이해하기

테이블 A (직원)

id name

1 Alice
2 Bob
3 Carol

테이블 B (부서)

id department

2 HR
3 IT
4 Finance

INNER JOIN

SELECT A.id, A.name, B.department
FROM A
INNER JOIN B ON A.id = B.id

결과

id name department

2 Bob HR
3 Carol IT

INNER JOIN:

두 테이블에서 매칭되는 데이터만 가져옵니다 (Bob과 Carol).

LEFT JOIN

SELECT A.id, A.name, B.department
FROM A
LEFT JOIN B ON A.id = B.id

id name department

1 Alice NULL
2 Bob HR
3 Carol IT

LEFT JOIN:

왼쪽 테이블(A)의 모든 데이터를 가져오고, 오른쪽 테이블(B)에서 매칭되는 데이터를 가져옵니다 (Alice도 포함).

RIGHT JOIN

SELECT A.id, A.name, B.department
FROM A
RIGHT JOIN B ON A.id = B.id

id name department

2 Bob HR
3 Carol IT
NULL NULL Finance

RIGHT JOIN:

오른쪽 테이블(B)의 모든 데이터를 가져오고, 왼쪽 테이블(A)에서 매칭되는 데이터를 가져옵니다 (Finance 부서도 포함).

⇒ INNER JOIN은 두 테이블 간에 공통된 데이터만을 가져오므로 때로는 데이터 손실이 있을 수 있습니다.

⇒ 반면 LEFT JOIN과 RIGHT JOIN은 각각 왼쪽 또는 오른쪽 테이블의 모든 데이터를 보존하면서 매칭되는 데이터를 가져옵니다.

WHERE

SELECT name, age, department
FROM Employees
WHERE age >= 30;
  • 모든 직원의 데이터가 포함
  • 지정된 조건에 맞는 행만 선택
  • 데이터베이스에서 원하는 정보만을 정확하게 추출

또 다른 예시 JOIN 예시

SELECT s.name, c.course_name, e.grade
FROM students s
INNER JOIN enrollments e ON s.student_id = e.student_id
INNER JOIN courses c ON e.course_id = c.course_id;

 

  • Students와 Enrollments 테이블을 student_id로 조인
  • 그 결과와 Courses 테이블을 course_id로 다시 조인
  • 최종적으로 name, course_name, grade 컬럼만 선택하여 결과를 반환

 

결과

"어떤 학생이 어떤 과목을 수강하고 어떤 성적을 받았는지" 한 번에 조회가 가능합니다.

자주 사용되는 작업

-- 1. SELECT: 조회할 컬럼을 지정
SELECT name, age FROM students;

-- 2. FROM: 데이터를 가져올 테이블을 지정
SELECT * FROM students;

-- 3. WHERE: 조건에 맞는 행을 필터링
SELECT * FROM students WHERE age > 20;

-- 4. GROUP BY: 지정된 컬럼을 기준으로 그룹화
SELECT major, AVG(age) FROM students GROUP BY major;

-- 5. HAVING: 그룹화된 결과에 대한 조건 지정
SELECT major, AVG(age) FROM students 
GROUP BY major HAVING AVG(age) > 22;

-- 6. ORDER BY: 결과를 정렬
SELECT * FROM students ORDER BY age DESC;

-- 7. LIMIT (또는 TOP): 반환할 행의 수를 제한
SELECT * FROM students LIMIT 10;

-- 8. JOIN: 여러 테이블을 결합
SELECT s.name, c.course_name 
FROM students s 
JOIN enrollments e ON s.student_id = e.student_id
JOIN courses c ON e.course_id = c.course_id;

-- 9. UNION: 여러 SELECT 문의 결과를 결합
SELECT name FROM students
UNION
SELECT name FROM professors;

-- 10. DISTINCT: 중복된 행을 제거
SELECT DISTINCT major FROM students;