본문 바로가기
SQL

SQL - JOIN

by hyeon1016 2024. 11. 7.

JOIN

두 개의 테이블을 서로 묶어 하나의 결과로 만드는 것을 의미한다.

 

내부 조인

두 테이블을 연결할 때 가장 많이 사용하는 것으로 일반적으로 조인이라고 하면 내부 조인을 의미한다. 내부 조인은 연결되는 컬럼(열)의 값이 두 테이블에 모두 존재해야 결과가 출력된다.(PK-FK)

조인은 3개 이상의 테이블로도 할 수 있지만 속도가 느려진다는 단점이 있기 때문에 대부분은 2개의 테이블로 조인한다.

 

일대다 관계(PK - FK)

두 테이블의 조인을 위해서는 일대다 관계로 연결되어야 한다. 

 

일대다 관계란  한 테이블의 기본키(PK)가 다른 테이블의 외래키(FK)로 사용될 때 형성된다. 즉, 하나의 행이 여러 행과 연결될 수 있는 관계를 의미한다.

 

예를 들어 회원 테이블의 ID가 기본키(PK)로 설정되고, 구매 테이블의 ID가 외래키(FK)로 설정되면, 한 명의 회원은 여러 번 구매할 수 있다. 여기서 회원 테이블의 ID는 유일한 값이어야 하고, 구매 테이블의 ID는 중복될 수 있다.

 

*기본키(PK)와 외래키(FK) 관계로 맺어져 있으며 이를 PK-FK 관계라고 부르기도 한다.

 

내부 조인의 기본 형식

SELECT 열
    FROM 첫 번째 테이블
        INNER JOIN 두 번째 테이블
        ON 조인될 조건
    WHERE 검색될 조건

 

SELECT *
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id
    WHERE buy.mem_id IN('GRL', 'MMU');

 

- buy.mem_id의 값이 member.mem_id의 값과 같으면 buy 테이블에 member 테이블을 조인한다.

- buy.mem_id의 값이 'GRL', 'MMU'인 행만 출력한다.

 

내부 조인의 간결 표현

SELECT buy.mem_id, member.mem_name, member.addr, CONCAT(member.phone1, member.phone2) AS '연락처'
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id

 

위와 같이 작성하면 컬럼(열)이 너무 많아 코드가 복잡해 보인다.

테이블의 이름 뒤에 별칭을 지정해주면 코드를 간결하게 표현할 수 있다.

*별칭을 통해 각 테이블의 컬럼에 접근할 수 있다.

 

SELECT B.mem_id, M.mem_name, M.addr, CONCAT(M.phone1, M.phone2) AS '연락처'
    FROM buy AS B
        INNER JOIN member AS M
        ON B.mem_id = M.mem_id

 

- 각 테이블에 별칭을 지정해주고 '테이블.컬럼(열)'으로 작성된 것을 간결하게 표현했다.

 

중복된 결과 1개만 출력하기

DISTINCT문을 활용해 중복된 값을 가진 행을 제거하고 출력할 수 있다.

SELECT DISTINCT B.mem_id, M.mem_name, M.addr
    FROM buy AS B
        INNER JOIN member AS M
        ON B.mem_id = M.mem_id

 

외부 조인

외부 조인은 조인에 필요한 값이 한쪽 테이블에만 있어도 결과가 출력된다. (NULL 출력)

 

기본 형식

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

 

테이블

 

buy

mem_id name1
1 a
2 b
3 c

 

member

number mem_id name2
100 1 ab
200 1 cd
300 2 ef

 

LEFT OUTER JOIN문

왼쪽 테이블의 내용은 모두 출력되어야 한다.

SELECT *	
    FROM buy B
        LEFT OUTER JOIN member M
        ON M.mem_id = B.mem_id;

 

- buy 테이블에 member 테이블을 조인하고, member 테이블에서 일치하는 값이 있다면 그 값을 출력하고, 일치하는 값이 없다면 NULL을 출력한다.

mem_id name1 number mem_id name2
1 a 100 1 ab
1 a 200 1 cd
2 b 300 2 ef
3 c NULL NULL NULL

 

RIGHT OUTER JOIN문

오른쪽 테이블의 내용은 모두 출력되어야 한다.

SELECT *	
    FROM buy B
        RIGHT OUTER JOIN member M
        ON M.mem_id = B.mem_id;

 

- member 테이블에 buy 테이블을 조인하고, buy 테이블에서 일치하는 값이 있다면 그 값을 출력하고, 일치하는 값이 없다면 NULL을 출력한다.

mem_id name1 number mem_id name2
1 a 100 1 ab
1 a 200 1 cd
2 b 300 2 ef

 

FULL OUTER JOIN

FULL OUTER JOIN은 MySQL에서는 지원하지 않지만 LEFT OUTER JOIN과 RIGHT OUTER JOIN이 합쳐진 것이라 생각하면 된다. 어느 한쪽에 들어있는 내용이면 출력한다.

 

기타 조인

가끔 유용하게 사용되는 조인

 

상호 조인

한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능이다.

SELECT *
    FROM buy
        CROSS JOIN member;

 

특징

  • ON 구문을 사용할 수 없다.
  • 결과 내용은 의미가 없다. 랜덤으로 조인하기 때문
  • 상호 조인의 주 용도는 테스트를 위한 대용량 데이터 생성이다.

 

자체 조인

자신이 자신과 조인한다는 의미이며, 하나의 테이블만 사용한다.

SELECT 열
    FROM 테이블 별칭A
        INNER JOIN 테이블 별칭B
        ON 조인될 조건
    WHERE 검색 조건

 

SELECT A.emp, B.emp, B.phone
    FROM emp_table AS A
        INNER JOIN emp_table AS B
        ON A.manager = B.emp
    WHERE A.emp = '경리부장';

 

- 경리 부장의 상사의 이름과 전화번호를 출력하는 코드다.

'SQL' 카테고리의 다른 글

SQL - 제약조건  (1) 2024.11.07
SQL - 뷰(VIEW)  (0) 2024.11.07
SQL - 데이터의 형식  (0) 2024.11.06
SQL - 기본 문법(데이터 변경)  (0) 2024.11.06
SQL - 기본 문법(SELECT)  (4) 2024.11.06