- [ MySQL ] - JOIN

민짜이·2025년 2월 5일

데이터베이스

목록 보기
9/11

JOIN 은 두 개 이상의 테이블을 묶어서 하나의 데이터로 만들어내는 기능입니다. 즉 테이블을 연결해 데이터를 조회하는 것이 JOIN 입니다. JOIN 의 종류를 하나씩 보겠습니다.

외래키

JOIN 을 하기 위해서는 각 테이블이 관계를 가져야 합니다. 그 관계의 종류는 다음과 같습니다.

  • 1 대 1 관계: 하나의 데이터가 다른 테이블의 하나의 데이터와 관계를 맺는 것을 말합니다. 예를 들면 어느 회사에서 직급 마다 월급이 결정되어 있다면 직급과 월급은 1 대 1 관계입니다.
  • 1 대 다 관계: 가장 많이 사용되는 관계로 하나의 데이터가 다른 테이블의 여러 데이터와 관계를 맺는 것을 말합니다. 예를 들어 A 부서에 속한 사람은 여러 명이지만, 한 직원이 속한 부서는 1개이므로 1 대 다 관계입니다.
  • 다 대 다 관계: 여러 데이터가 다른 테이블의 여러 데이터와 관계를 맺는 것을 말합니다. 하나의 책을 여러 명의 작가가 쓰며 한 작가가 여러 개의 책을 쓸 수 있으므로 이 두 데이터는 다 대 다 관계입니다.

이러한 관계에서 테이블끼리 JOIN 을 하기 위해선 서로의 테이블을 참조할 수 있는 키가 필요합니다. 이러한 키를 외래키 라고 합니다.

외래키를 설정하기 위해 다음과 같이 테이블을 생성합니다.

CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(50)
);

이후 customers 를 참조할 테이블을 생성합니다.

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_date DATE,
    amount DECIMAL(8,2),
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

마지막 줄에 orderscustomer_idcustomersid 를 참조한 것을 확인할 수 있습니다. 이제 다음과 같은 데이터들을 삽입합니다.

INSERT INTO customers (first_name, last_name, email) 
VALUES ('Boy', 'George', 'george@gmail.com'),
       ('George', 'Michael', 'gm@gmail.com'),
       ('David', 'Bowie', 'david@gmail.com'),
       ('Blue', 'Steele', 'blue@gmail.com'),
       ('Bette', 'Davis', 'bette@aol.com');
       
       
INSERT INTO orders (order_date, amount, customer_id)
VALUES ('2016-02-10', 99.99, 1),
       ('2017-11-11', 35.50, 1),
       ('2014-12-12', 800.67, 2),
       ('2015-01-03', 12.50, 2),
       ('1999-04-11', 450.25, 5);

JOIN 종류

CROSS JOIN

Cartesian Join라고도 하는 CROSS JOIN 은 모든 행에대해 조인을 수행하는 연산입니다. 즉 N개의 행을 가진 테이블과 M 개의 행을 가진 테이블이 있으면, 이 행들에 대해 모두 조인을 합니다.

SELECT * FROM customers, orders;

위 결과는 다음과 같습니다.

결과를 보면 id 가 같지 않아도 모든 행들에 대해 Join 연산이 수행된 것을 확인할 수 있습니다.

INNER JOIN

INNER JOIN 은 양쪽 모두의 테이블의 키와 매칭되는 데이터를 출력합니다. 즉 두 테이블에서 교집합인 부분이 출력된다고 생각하면 됩니다.

SELECT *
FROM customers c
JOIN orders o ON c.id = o.customer_id;

위 코드의 결과는 다음과 같습니다.

위 사진을 보시면 id가 같은 데이터들끼리 Join 이 된 것을 확인할 수 있습니다.

LEFT JOIN

LEFT JOIN 은 기준이 되는 테이블을 왼쪽을 중심으로 오른쪽 테이블을 매치시킵니다.

SELECT c.first_name, c.last_name, o.order_date, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

여기서 FROM 절에 위치한 테이블이 LEFT 테이블이 됩니다.
위 코드의 결과는 다음과 같습니다.

RIGHT JOIN

RIGHT JOINLEFT JOIN과 반대로 JOIN 절에 위치한 테이블이 기준이 되는 연산입니다.

SELECT c.first_name, c.last_name, o.order_date, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;

위 코드의 결과는 다음과 같습니다.

profile
꼬박꼬박

0개의 댓글