DB
JOIN의 종류
Tree
2024. 10. 19. 12:46
JOIN
JOIN의 종류
- INNER JOIN: 두 테이블에서 매칭되는 데이터만 가져옵니다.
- LEFT JOIN: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 매칭 데이터를 가져옵니다.
- RIGHT JOIN: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 매칭 데이터를 가져옵니다.
- FULL OUTER JOIN: 양쪽 테이블의 모든 데이터를 가져옵니다.
예시
JOIN 구문에서 "왼쪽"과 "오른쪽" 테이블의 기준은 다음과 같습니다:
- 왼쪽 테이블:
- FROM 절에 명시된 테이블
- JOIN 키워드 앞에 오는 테이블
- 오른쪽 테이블:
- 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" 테이블에서 정보를 가져오기 시작할 거예요라고 말하는 것과 같습니다.
🫥 주요 차이점
- FROM은 항상 하나만 있지만 JOIN(LEFT JOIN 포함)은 여러 개 있을 수 있습니다.
- 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;