본문 바로가기
컴터/Database (MYSQL)

6) [Database_MYSQL] JOIN

by 나 진짜 못차마 2023. 6. 16.
728x90

데이터의 규모가 커지면서 하나의 테이블로 정보를 수용하기가 어려워지면

테이블을 분할하고 테이블 간의 관계성을 부여한다.

JOIN

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

종류

ㆍOUTTER JOIN : 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시한다.

'LEFT JOIN' 과 'RIGHT JOIN' 이 있다.

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


예제 : 두 개의 분할 된 테이블

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;;
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');

 

위의 예제들을 다 입력합니다.


 

LEFT JOIN

가장 많이 사용되는 조인의 형태

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;

AS 는 별명,

student AS s => student 테이블을 s 로 간결하게 대체.

location AS l => location 테이블을 l 로 간결하게 대체.

l.name AS address => 실제로 l.name 은 location 테이블의 name 칼럼의 내용을 가지고 오는데

그 칼럼에게 address라는 이름을 부여(대체)한다는 뜻.

그래서 s.name , s.location_id , l.name , l.distance 값을 가져오지만

칼럼은 name , location_id, address, distance 로 출력.

LEFT JOIN 은 OUTTER JOIN 의 한 형태.

왼쪽에 있는 테이블(현재 student) 을 기준으로해서 오른쪽에 있는 테이블(loacation)의 데이터를 가져온다는 뜻

ON

테이블 간 결합에서 조건을 기술.

ex) ON s.location_id = l.id;

기본적으로 student 테이블의 데이터를 가져오는데 location_id 칼럼에 해당되는 값과 같은

location 테이블의 id 칼럼의 값에 해당하는 행들의 데이터를 결과를 붙여서 출력


 

OUTTER JOIN 과 INNER JOIN의 차이

Location 에서 제주를 삭제 후 OUTTER JOIN(LEFT JOIN)과 INNER JOIN의 차이를 비교

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;

 

첫번째, 두번째 명령문을 실행

location_id 가 6인 제주의 데이터가 없으니 NULL 로 표시.

세번째 명령문 실행

LEFT JOIN -> INNER JOIN으로 변경

location_id 가 6인 제주의 데이터가 없으니 결과로 그 데이터를 아예 가져오지 않음.

즉,

OUTTER JOIN

테이블 간에 결합을 했을 때 한쪽 테이블에 데이터가 없다고 하더라도 그것을 가져와서 NULL 로 표시

INNER JOIN

한쪽 테이블에 데이터가 없다면 그 행 자체를 결과에서 빼버림

오늘은 JOIN 에 대해서 공부했습니닷

728x90