스터디
[DB] Join 본문
< Join >
- 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다.
- 둘 이상의 데이터가 필요한 경우 테이블 조인이 필요하다.
- 즉, 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법이다.
- 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어낸다.
- 연결하려면 테이블들이 적어도 하나의 컬럼을 공유하고 있어야 한다.
- 공유하고 있는 컬럼을 PK 또는 FK 값으로 사용한다.
< Join의 종류 >
A 테이블
ID | NAME |
1 | AAA |
2 | BBB |
3 | CCC |
B 테이블
ID | AGE |
1 | 10 |
2 | 20 |
3 | 30 |
4 | 40 |
> INNER JOIN
- 내부 조인 -> 교집합
- 공통적인 부분만 SELECT
- on을 이용한 join 조건 지정 (join 조건: on, 일반 조건: where)
- using을 이용한 join 조건 지정: using 절에서는 table 이름이나 alias를 명시하면 error
ID | NAME | AGE |
1 | AAA | 10 |
2 | BBB | 20 |
SELECT A.ID, A.NAME, A.AGE
FROM A INNER JOIN B
ON A.ID = B.ID;
> LEFT JOIN
- 부분집합
- 조인 기준 왼쪽에 있는 거 모두 SELECT
(공통적인 부분 + LEFT에 있는 것만)
ID | NAME | AGE |
1 | AAA | 10 |
2 | BBB | 20 |
3 | CCC | NULL |
SELECT A.ID, A.NAME, A.AGE
FROM A LEFT OUTER JOIN B
ON A.ID = B.ID;
> 조인 기준 왼쪽에 있는 것'만' SELECT
(LEFT에 있는 것만: A-B)
- LEFT가 가지고 있는 것 중, 공통적인 부분을 제외한 값
- LEFT JOIN 값 중에서 WHERE 조건으로 NULL인 값을 조회
- B가 NULL 값을 가지고 있는 것은 A만 가지고 있는 값
ID | NAME | AGE |
3 | CCC | NULL |
SELECT A.ID, A.NAME, A.AGE
FROM A LEFT OUTER JOIN B
ON A.ID = B.ID;
WHERE B.ID IS NULL
> RIGHT JOIN
- 부분 집합
- 조인 기준 오른쪽에 있는 것 모두 SELECT
(공통적인 부분 + RIGHT에 있는 것만)
ID | NAME | AGE |
1 | AAA | 10 |
2 | BBB | 20 |
4 | NULL | 30 |
5 | NULL | 40 |
SELECT A.ID, A.NAME, A.AGE
FROM A RIGHT OUTER JOIN B
ON A.ID = B.ID;
> 조인 기준 오른쪽에 있는 것만 SELECT
(RIGHT에 있는 것만: B-A)
- RIGHT가 가지고 있는 것 중, 공통적인 부분을 제외한 값
- RIGHT JOIN 값 중에서 WHERE 조건으로 NULL인 값을 조회
ID | NAME | AGE |
4 | NULL | 30 |
5 | NULL | 40 |
SELECT A.ID, A.NAME, A.AGE
FROM A RIGHT OUTER JOIN B
ON A.ID = B.ID;
WHERE A.ID IS NULL
> OUTER JOIN
- 외부 조인 -> 합집합
- A 테이블, B 테이블 모두 SELECT
ID | NAME | AGE |
1 | AAA | 10 |
2 | BBB | 20 |
3 | CCC | NULL |
4 | NULL | 30 |
5 | NULL | 40 |
SELECT A.ID, A.NAME, A.AGE
FROM A FULL OUTER JOIN B
ON A.ID = B.ID;
> 오른쪽에 있는 것만 + 왼쪽에 있는 것만 SELECT
- FULL OUTER가 가지고 있는 것 중, 공통적인 부분을 제외한 값
ID | NAME | AGE |
3 | CCC | NULL |
4 | NULL | 30 |
5 | NULL | 40 |
SELECT A.ID, A.NAME, A.AGE
FROM A FULL OUTER JOIN B
ON A.ID = B.ID;
WHERE A.ID IS NULL OR B.ID IS NULL
< DB에서 Join의 필요성 >
- 관계형 데이터베이스의 구조적 특징으로 정규화를 수행하면 의미 있는 데이터의 집합으로 테이블이 구성되고, 각 테이블끼리는 관계(Relationship)를 가진다.
- 이와 같은 특징으로 관계형 데이터베이스는 저장 공간의 효율성과 확장성이 향상된다.
- 서로 관계 있는 데이터가 여러 테이블로 나뉘어 저장되므로, 각 테이블에 저장된 데이터를 효과적으로 검색이 가능하다.
< Join 사용 시 주의 사항 >
- SQL 문장의 의미를 제대로 파악할 필요가 있다.
- SQL을 작성하는 방법에 따라 성능이 크게 좌우된다.
- 어떤 질의를 수행할 것인지를 명확하게 정의한 후, 비효율을 제거하여 최적의 SQL을 작성한다.
- 명확한 Join 조건을 제공해야 한다.
- Join 조건을 명확하게 제공하지 않을 경우, 의도치 않게 CROSS JOIN(Cartesian Product)이 수행될 수 있다.
< Join 사용시 고려 사항 >
- Join 할 대상의 집합을 최소화한다.
- 집합을 최소화할 방법이 있으면, 조건을 먼저 적용하여 관계를 맺을 집합을 최소화한 후 Join을 맺는 것이 효율적이다.
- 효과적인 인덱스 활용
- 인덱스를 활용하면, Join 연산의 비용을 극적으로 낮출 수 있다.
https://pearlluck.tistory.com/46
DB JOIN 정리(INNER/LEFT/RIGHT/OUTER)
join(조인) 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법 연결하려면 테이블들이 적어도 하나의 컬럼을 공유하고 있어야함 이 공유하고 있는 컬럼을 PK 또는 FK값으로 사용 종류 1. INNER
pearlluck.tistory.com
https://dev-jwblog.tistory.com/94?category=1004261
[DB] Join(조인) 정리하기
1. Join(조인) 이란? - 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것 - 즉, 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법 - 테이블로서 저장되거나, 그 자
dev-jwblog.tistory.com
'백엔드' 카테고리의 다른 글
[DB] 샤딩(Sharding) (0) | 2024.12.17 |
---|---|
[DB] Redis vs MySQL (2) | 2024.12.17 |
CORS (0) | 2023.04.13 |
[JavaScript] 프로토타입과 클래스 (3) | 2023.04.10 |
[JavaScript] 싱글톤 패턴과 정적 클래스 (0) | 2023.04.07 |