6주차 부터는 1~3주차까지 배웠던 C++에 4주차~6주차까지 배운 Mysql을 활용해 팀프로젝트를 진행하는 과정으로 진행됐다. 이번 회고록에서는 본격적인 팀프로젝트 진행에 앞서 배운 Mysql의 JOIN에 대한 내용을 정리하고자 한다. 그럼 JOIN에 대해 알아보자.
JOIN문은 두 개의 테이블을 엮어서 하나의 테이블을 생성하는 구문이다. 굳이 두 테이블을 묶는 것은 때때로 2개의 테이블을 모두 활용해야만 원하는 테이블을 얻을 수 있을 때가 있기 때문이다. 예를 들어, 대중교통 이용자가 몰리는 시간대에 대한 테이블을 얻고 싶다면 하루 동안 버스를 이용한 고객 테이블과 지하철을 이용한 고객 테이블을 묶어야 사람들이 대중교통을 많이 이용하는 시간에 대한 테이블을 얻을 수 있을 것이다. 이럴 때, 사용하는 구문이 JOIN문이다.
JOIN문의 종류는 다음과 같다.
Inner Join은 두 테이블 사이의 공통된 부분에 대한 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문에 대한 포스팅을 마치도록하겠다.
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 9 주차 회고 | PLC - 펑션블록, 타이머 (0) | 2023.05.17 |
---|---|
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 7, 8주차 회고 | C++과 Mysql 연동을 활용한 채팅 프로그램 제작 팀프로젝트 (0) | 2023.05.11 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 4주차 1~2일차 회고 | 데이터베이스 (2) | 2023.04.15 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 3주차 회고 | 클래스 복습(사칙연산 계산기) (0) | 2023.04.09 |
[포스코x코딩온] 스마트 팩토리 SW 개발자 과정 3주차 회고 | 31게임, 마방진 만들기 (0) | 2023.04.09 |