상세 컨텐츠

본문 제목

[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 6주차 회고 | MYSQL - JOIN

본문

 6주차 부터는 1~3주차까지 배웠던 C++에 4주차~6주차까지 배운 Mysql을 활용해 팀프로젝트를 진행하는 과정으로 진행됐다. 이번 회고록에서는 본격적인 팀프로젝트 진행에 앞서 배운 Mysql의 JOIN에 대한 내용을 정리하고자 한다. 그럼 JOIN에 대해 알아보자.

 

 JOIN문은 두 개의 테이블을 엮어서 하나의 테이블을 생성하는 구문이다. 굳이 두 테이블을 묶는 것은 때때로 2개의 테이블을 모두 활용해야만 원하는 테이블을 얻을 수 있을 때가 있기 때문이다. 예를 들어, 대중교통 이용자가 몰리는 시간대에 대한 테이블을 얻고 싶다면 하루 동안 버스를 이용한 고객 테이블과 지하철을 이용한 고객 테이블을 묶어야 사람들이 대중교통을 많이 이용하는 시간에 대한 테이블을 얻을 수 있을 것이다. 이럴 때, 사용하는 구문이 JOIN문이다. 

 

 JOIN문의 종류는 다음과 같다. 

  1. Inner Join
  2. Natural Join
  3. Left Outer Join
  4. Right Outer Join
  5. Full Outer Join

 Inner Join은 두 테이블 사이의 공통된 부분에 대한 Join문이다. 

Inner Join에 대한 이해를 돕기 위한 이미지

Inner Join문의 작성법은 2가지가 있고 다음과 같다.

SELECT 속성이름, ...
    FROM 테이블A, 테이블B
    WHERE 조인조건 AND 검색조건;
    
SELECT 속성이름, ...
    FROM 테이블A, INNER JOIN 테이블B ON 조인조건
    WHERE 검색조건;

 2가지 방법 모두 같은 결과 값을 출력하므로 원하는 방식으로 사용하면 될 듯하다.

 

 Natural Join은 Inner Join의 일종으로 두 테이블 간 동일한 타입을 가진 동일한 속성을 기준으로 자동으로 조인된다. 따라서, 조인 조건을 추가적으로 명시해주지 않아도 된다. 그러나 동일한 타입을 가진 속성이 없거나, 여러 개 있을 경우에는 원하는 결과를 얻지 못한다는 단점이 있다. Natural Join문의 작성법은 아래와 같다.

SELECT 속성이름, ... FROM 테이블A NATURAL JOIN 테이블B;

 

 Left Outer Join문은 기준이 되는 테이블의 오른쪽에 두 테이블의 교집합이 되는 데이터를 Join해주는 구문이다.

즉, 좌측의 그림과 같은 형태로 테이블이 생성되는 것이다.

 

 

 

 

 

 

 

 Left Outer Join문의 작성법은 아래와 같다.

SELECT 속성이름, ... FROM 테이블A LEFT [OUTER] JOIN 테이블B ON 조인조건;

 이때, OUTER는 빼고 작성해도 된다.

 

 Right Outer Join문은 기준이 되는 테이블의 왼쪽에 두 테이블의 교집합이 되는 데이터를 Join해주는 구문이다.

좌측 그림과 같은 형태를 보인다.

 

 

 

 

 

 

 

 Right Outer Join문의 작성법은 아래와 같다.

SELECT 속성이름, ... FROM 테이블A RIGHT [OUTER] JOIN 테이블B ON 조인조건;

 

 Full Outer Join을 Mysql에서 구현하기 위해서는 Union문을 사용해준다. Union문은 두 개 이상의 SELECT문의 결과를 하나의 결과로 결합하느 데 사용된다. 이 때, SELECT문의 열 이름과 열의 수가 동일해야 한다. UNION을 사용하면 중복된 행이 제거되므로 UNION ALL을 사용해서 중복을 허용할 수 있다. 작성법은 아래와 같다.

SELECT 속성이름, ... FROM 테이블A UNION SELECT 속성이름, ... FROM 테이블B

 

 Full Outer Join을 구현하는 실습

UNION문을 사용해서 아래와 같은 테이블을 만들어라.

 

 

 

 

 

 

 

 

 

 

DROP TABLE IF EXISTS authors;
CREATE TABLE authors (
	author_id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(50)
    );
    
DROP TABLE IF EXISTS books;
CREATE TABLE books (
	book_id INT PRIMARY KEY  AUTO_INCREMENT,
    author_id INT NOT NULL,
    title VARCHAR(100) NOT NULL,
    publication_date DATE NOT NULL,
    FOREIGN KEY (author_id) REFERENCES authors(author_id) ON UPDATE CASCADE ON DELETE CASCADE /* 외래키 사용법 */
);

INSERT INTO authors (author_id, first_name, last_name, email)
VALUES (1, 'J.K.', 'Rowling', 'jkrowling@gmail.com'),
       (2, 'George R.R.', 'Martin', 'grmartin@yahoo.com'),
       (3, 'Stephen', 'King', 'sking@hotmail.com'),
       (5, '아가사', '크리스티', 'agatha.christie@example.com');
SELECT * FROM authors;

INSERT INTO books (title, author_id, publication_date)
VALUES ('Harry Potter and the Philosopher''s Stone', 1, '1997-06-26'),
       ('A Game of Thrones', 2, '1996-08-06'),
       ('The Shining', 3, '1977-01-28'),
       ('스탠드', 3, '1978-01-01');

SELECT * FROM books;

UPDATE authors SET author_id = 4 WHERE last_name = 'king';

SELECT * FROM authors INNER JOIN books ON authors.author_id = books.author_id;
SELECT * FROM authors NATURAL JOIN books;
SELECT * FROM authors LEFT JOIN books ON authors.author_id = books.author_id;
SELECT * FROM authors RIGHT OUTER JOIN books ON authors.author_id = books.author_id;
SELECT author_id FROM authors UNION ALL SELECT author_id FROM books;
/* UNION 좌측에서 SELECT한 속성과 우측에서 SELECT한 속성이 동일해야 한다. */

/* 실습 결과 출력부*/
SELECT authors.author_id, books.title FROM authors LEFT JOIN books ON authors.author_id = books.author_id UNION SELECT authors.author_id, books.title FROM authors RIGHT OUTER JOIN books ON authors.author_id = books.author_id;

위와 같은 코드를 통해 원하는 결과 테이블을 생성할 수 있다.

 

 지난 주는 애플 아카데미에서 교육을 받느라 오랜만에 Mysql을 사용했다. 그래서 가물가물하기도 하고 중간중간 막힐뻔 한 순간도 많았는데 그때마다 강사님이 친절하게 알려주셔서 진도를 잘 따라갈 수 있었다. 이렇게 또 한번 복습의 중요성을 느낄 수 있었다. 그럼 이상으로 Join문에 대한 포스팅을 마치도록하겠다.

관련글 더보기