공부

[SolveSQL] 두 테이블 결합하기, SQL 조인(JOIN) 정리

na0-0 2024. 7. 30. 13:15
반응형



SQL 기본 문법 : JOIN (INNER, OUTER, CROSS, SELF JOIN)

두 개의 테이블을 엮어야 하는 일이 정말 많은데, 그럴 때, JOIN을 사용하면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.

두 테이블의 조인을 위해, 일대다 관계로 기본키(PRIMARY KEY, PK)와 외래키(FOREIGN KEY, FK) 관계로 맺어져야 한다.



- INNER JOIN(내부 조인) : 두 테이블에 모두 일치하는 값이 있는 레코드를 반환
## INNER JOIN

SELECT <열 목록>
FROM <첫 번째 테이블>
    INNER JOIN <두 번째 테이블>
    ON <조인 조건>
[WHERE 검색 조건]

JOIN의 기본값은 INNER JOIN 이다.(교집합에 해당하는 개념)


- OUTER JOIN : 1개의 테이블에만 데이터가 있어도 됨

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
    <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
     ON <조인 조건>
[WHERE 검색 조건]

종류가 3가지가 있는데,
- LEFT OUTER JOIN : 왼쪽 테이블의 모든 값과 오른쪽 테이블의 일치하는 값을 반환
= FROM “TABLE”에 초점을 맞춘 JOIN

- RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값과 왼쪽 테이블의 일치하는 값 반환
= OUTER JOIN “TABLE”에 초점을 맞춘 JOIN
= LEFT OUTER JOIN과 거의 비슷한데, 그 방향성이 FROM에 있는지, JOIN에 있는지 차이다.
= 그래서 보통 실무에서 이 함수의 사용 빈도는 낮은 편이라고 한다.

- FULL OUTER JOIN : 왼쪽 또는 오른쪽 테이블에 일치하는 모든 값 반환
= 모든 데이터 조회를 위한 합집합 개념

출처 : https://www.w3schools.com/sql/sql_join.asp




- CROSS JOIN : 두 테이블의 모든 행을 조인
한쪽 테이블의 모든 행과 다른 테이블의 모든 행을 조인시키는 것
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼으로, 카티션 곱(CARTESIAN PRODUCT)라고 한다.

SELECT *
FROM <첫 번째 테이블>
    CROSS JOIN <두 번째 테이블>



- SELF JOIN : 자기자신과 조인하는 것으로, 1개의 테이블만 사용

SELECT <열 목록>
FROM <테이블> 별칭A
    INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]




## 두 테이블 결합하기

이 문제는 두 테이블을 JOIN을 사용하여 결합만 하면 되는 간단한 문제였는데,

틀린 이유로 쿼리의 결과 크기가 다르다고 해서 무슨 문제일까 했다.
GOLF 의 대회를 보니 단체전도 포함되어있었다.
그렇다면, 선수 ID 가 중복되는 부분이 있다는 것을 확인하고, 중복 제거를 하기 위해 “DISTINCT”을 추가해서 성공해줬다.

SELECT
  DISTINCT athlete_id
FROM
  records
  join events 
  ON events.id == records.event_id
WHERE
  sport == 'Golf'

반응형