조회(SELECT) - 조인(JOIN)


  • 조인

테이블간의 관계성에 따라 복수의 테이블을 결합하여 하나의 테이블인 것처럼 결과를 출력


  • 종류

OUTTER JOIN : 매칭이 되는 행이 없어도 결과를 가져오고 매칭되는 행이 없으면 NULL로 표시

  LEFT JOIN과 RIGHT JOIN이 있음

INNER JOIN : 조인하는 두 개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져옴


  • 테이블 재설정

student 테이블과 location 테이블 두 개 생성


1
2
3
4
5
6
7
8
9
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4NOT NULL,
  `name` char(4NOT NULL,
  `sex` enum('남자','여자'NOT NULL,
  `location_id` tinyint(4NOT NULL,
  `birthday` datetime NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
cs


1
2
3
4
5
6
7
DROP TABLE IF EXISTS `location`;
CREATE TABLE `location` (
`id`  tinyint UNSIGNED NOT NULL AUTO_INCREMENT ,
`name`  varchar(20NOT NULL ,
`distance`  tinyint UNSIGNED NOT NULL ,
PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
cs



1
2
3
4
5
6
7
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');
cs


1
2
3
4
5
6
7
8
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);
cs


  • LEFT JOIN

가장 많이 사용


1
SELECT s.name, s.location_id, l.name AS address, l.distance  FROM student AS s LEFT JOIN location AS l ON s.location_id = l.id;
cs


  • OUTTER JOIN vs INNER JOIN

Location에서 제주를 삭제 후 OUTTER JOIN과 INNER JOIN 비교


1
2
3
4
5
DELETE FROM location WHERE name='제주'
 
SELECT s.name, s.location_id, l.name AS address, l.distance  FROM student AS s LEFT JOIN location AS l ON s.location_id = l.id; 
 
SELECT s.name, s.location_id, l.name AS address, l.distance  FROM student AS s INNER JOIN location AS l ON s.location_id = l.id;
cs






실습


두 개의 테이블 생성








SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s LEFT JOIN location AS l ON s.location_id=l.id

student AS s

 student 테이블을 s로 표시

location AS l

 location 테이블을 l로 표시

l.name AS address

 location 테이블의 name속성을 address로 표시

student AS s LEFT JOIN location AS l

 student 테이블을 기준으로 location 테이블 조인

ON s.location_id=l.id

 JOIN의 조건 = student 테이블의 location_id 속성값과 location 테이블의 id 속성값을 매치




'제주'속성 지우고 OUTTER(LEFT) JOIN 과 INNER JOIN 비교


OUTTER(LEFT) JOIN


INNER JOIN


'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(8)  (0) 2018.03.21
SQL - 테이블(7)  (0) 2018.03.21
SQL - 테이블(6)  (0) 2018.03.21
SQL - 테이블(5)  (0) 2018.03.21
SQL - 테이블(4)  (0) 2018.03.21

+ Recent posts