# Join
데이터베이스는 하나의 테이블로 끝나는 것이 아니라 여러가지 테이블을 추가하여 저장하고 관리하는 것이 일반적이다. 데이터의 규모가 거대해지면 하나의 테이블로서 정보를 수용하고 관리하는 것이 어려워지기 때문이다. 따라서 테이블을 분할하고 테이블간의 관계성을 부여하기 위하여 사용되는 것이 바로 join이다.
테이블을 분할하고 join을 이용하여 분할된 데이터를 하나의 데이터처럼 연동하여 이용할 수 있는 방법은 다음과 같다.
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`distance` INT NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', 10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', 350, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', 190, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '제주', 400, '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', 400, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', 310, '1981-2-3 00:00:00');
상기의 예제는 각각의 지역과 거리가 중복되어 나타나는 등 효율성이 떨어지는 면모를 지니고 있는 데이터 테이블이다. 따라서 다음 예제에서는 보다 지명과 거리 그리고 명단을 조금 더 효율적으로 관리할 수 있도록 테이블을 두개로 분할하였다.
### 테이블 1, 2 추가
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`location_id` tinyint(4) NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `location`;
CREATE TABLE `location` (
`id` tinyint UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` varchar(20) NOT NULL ,
`distance` tinyint UNSIGNED NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;;
### 테이블 1, 2 값 추가
INSERT INTO `location` VALUES (1, '서울', 10);
INSERT INTO `location` VALUES (2, '청주', 200);
INSERT INTO `location` VALUES (3, '경주', 255);
INSERT INTO `location` VALUES (4, '제천', 190);
INSERT INTO `location` VALUES (5, '대전', 200);
INSERT INTO `location` VALUES (6, '제주', 255);
INSERT INTO `location` VALUES (7, '영동', 255);
INSERT INTO `location` VALUES (8, '광주', 255);
INSERT INTO `student` VALUES (1, '이숙경', '여자', 1, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (2, '박재숙', '남자', 2, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', 3, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', 4, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', 5, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', 6, '1981-2-3 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', 5, '1990-10-1 00:00:00');
상기와 같이 명단 테이블의 지역-거리 열(Column)을 지역-거리 테이블로서 분할하고, 해당되는 id값을 명단 테이블에 지정하고 같이 조회하는 식으로 운용한다면, 하나로 운용하는 것 보다 훨씬 효율적으로 데이터를 운용하고 관리할 수 있게 되는 것이다.
그러나 이렇게 테이블을 분할하여 관리한다면 테이블간의 연결성 혹은 연관성을 한눈에 알아차리기는 어렵게 된다. 그것을 보다 쉽고 정갈하게 관리할 수 있게 해주는 것이 join이다.
join은 테이블간의 관계성에따라서 복수의 테이블을 결합, 하나의 테이블 인 것처럼 결과를 출력하는 것을 의미한다. join의 종류는 다음과 같다.
- outter join 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 null로 표시한다. left join 과 right 조인이 있다.
inner join 조인하는 두개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져온다.
SELECT s.name, s.location_id, l.name AS address, l.distance
# SELECT 뒤에 명기된 COLUMN들을 가져옴
FROM student AS s
# students 에 s라는 별명을 붙임
LEFT JOIN location AS l
# locaion 에 l이라는 별명을 붙임
# left join => location 왼쪽에 있는 테이블, students를 기준으로 해서 오른쪽인 location을
# 가져온다는 뜻
ON s.location_id = l.id;
# 결합할때 조건을 붙이기 위한 구문
# 이렇게 되면 기준으로 한 student 테이블의 select한 데이터를 모두 가져온다,
# 그후, student 테이블의 location_id라는 열(column)의 숫자에 해당되는 (숫자와같은)
# location 테이블의 행들을 결과에 붙여서 출력한다.
# l.name AS address
# locaion 테이블의 name column을 가져와서 ADDRESS라는 이름으로 바꿔 보여준다.
# Outter Join 과 Inner Join
Outter은 null이어도 합쳐서 보여주고, inner는 null이면 합치지 않고 보여주지 않는다.
'Language > mySQL' 카테고리의 다른 글
공부 내용 정리 mySQL :: 초급 I (0) | 2021.05.22 |
---|---|
공부 내용 정리 mySQL :: 예제 정리 4 (0) | 2021.05.20 |
공부 내용 정리 mySQL :: 기초 V (0) | 2021.05.19 |
공부 내용 정리 mySQL :: 예제 정리 3 (0) | 2021.05.18 |
공부 내용 정리 mySQL :: 예제 정리 2 (0) | 2021.05.18 |