Overview

이전까지는 단일 테이블에서 INDEX를 적용하는 효과적인 방법들을 살펴봤습니다. 아직 못 본 개발자를 위해 친절히 링크도 준비했습니다. 이 글을 보기 전에 아래의 글들을 먼저 보는 것이 좋습니다.

단일 TABLE을 SELECT하자!: 올바른 SELECT문 작성하기
순서대로 척척, ORDER BY: ORDER BY 조건 처리 알아보기
원하는 대로 뭉치는 GROUP BY: GROUP BY 조건 처리 알아보기

이번 글에서는 테이블에서 컬럼을 추가 또는 삭제하고, 테이블을 분리하는 방법까지 알아보겠습니다.


Let’s do it

먼저 아래의 컬럼을 추가해봅시다.

ALTER TABLE test.TB_MBR_BAS ADD COLUMN AREA_NM	VARCHAR(10)	COMMENT '지역 명';



그리고 테스트 자료를 넣습니다.

UPDATE test.TB_MBR_BAS
SET
	AREA_NM =
		CASE FLOOR(RAND()*15)
			WHEN 0	THEN '서울특별시'
			WHEN 1	THEN '부산광역시'
			WHEN 2	THEN '인천광역시'
			WHEN 3	THEN '대전광역시'
			WHEN 4	THEN '대구광역시'
			WHEN 5	THEN '광주광역시'
			WHEN 6	THEN '울산광역시'
			WHEN 7	THEN '경기도'
			WHEN 8	THEN '강원도'
			WHEN 9	THEN '충청남도'
			WHEN 10	THEN '충청북도'
			WHEN 11	THEN '전라남도'
			WHEN 12	THEN '전라북도'
			WHEN 13	THEN '경상남도'
			WHEN 14	THEN '경상북도'
			WHEN 15	THEN '제주도'
		END
WHERE AREA_NM IS NULL
;



자료를 확인하면 아래와 같이 나옵니다.

SELECT
	*
FROM test.TB_MBR_BAS
;



01


AREA_NM 컬럼을 추가해 지역이 나오도록 했습니다. AREA_NM을 보면 중복되는 지역명이 있습니다. 이럴 때 보통 AREA_NM을 별도의 테이블을 만들어 ID OR 코드를 부여해 처리합니다. 위의 UPDATE 문을 참조하여 ID를 만들면 아래와 같이 만들 수 있습니다.

0 : ‘서울특별시’
1 : ‘부산광역시’
2 : ‘인천광역시’
3 : ‘대전광역시’
4 : ‘대구광역시’
5 : ‘광주광역시’
6 : ‘울산광역시’
7 : ‘경기도’
8 : ‘강원도’
9 : ‘충청남도’
10 : ‘충청북도’
11 : ‘전라남도’
12 : ‘전라북도’
13 : ‘경상남도’
14 : ‘경상북도’
15 : ‘제주도’

먼저 AREA_NM과 ID를 다룰 테이블을 만들겠습니다.

CREATE TABLE test.TB_AREA_BAS
(
	AREA_ID		TINYINT UNSIGNED	NOT NULL	COMMENT '지역 아이디 '
	,AREA_NM	VARCHAR(10)			NOT NULL	COMMENT '지역 명'
	,PRIMARY KEY (AREA_ID)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='TB 지역 기본'
;

테이블을 만들었으면 자료를 넣어줍니다.
INSERT INTO test.TB_AREA_BAS
(
	AREA_ID
	,AREA_NM
)
VALUES
(0,'서울특별시')
,(1,'부산광역시')
,(2,'인천광역시')
,(3,'대전광역시')
,(4,'대구광역시')
,(5,'광주광역시')
,(6,'울산광역시')
,(7,'경기도')
,(8,'강원도')
,(9,'충청남도')
,(10,'충청북도')
,(11,'전라남도')
,(12,'전라북도')
,(13,'경상남도')
,(14,'경상북도')
,(15,'제주도')
;



자료를 확인하면 아래와 같이 나옵니다.

SELECT
	*
FROM test.TB_AREA_BAS
;



02


테이블을 만들었다면 test.TB_MBR_BAS 테이블에 AREA_ID 를 추가하여 자료를 넣은 후 AREA_NM 컬럼을 삭제하면 됩니다.

이제 AREA_ID를 추가합니다.

ALTER TABLE test.TB_MBR_BAS ADD COLUMN AREA_ID TINYINT UNSIGNED NOT NULL COMMENT '지역 아이디';



AREA_NM을 참조하여 AREA_ID를 넣습니다.

UPDATE test.TB_MBR_BAS
SET
	AREA_ID =
		CASE AREA_NM
			WHEN '서울특별시'	THEN 0
			WHEN '부산광역시'	THEN 1
			WHEN '인천광역시'	THEN 2
			WHEN '대전광역시'	THEN 3
			WHEN '대구광역시'	THEN 4
			WHEN '광주광역시'	THEN 5
			WHEN '울산광역시'	THEN 6
			WHEN '경기도'	THEN 7
			WHEN '강원도'	THEN 8
			WHEN '충청남도'	THEN 9
			WHEN '충청북도'	THEN 10
			WHEN '전라남도'	THEN 11
			WHEN '전라북도'	THEN 12
			WHEN '경상남도'	THEN 13
			WHEN '경상북도'	THEN 14
			WHEN '제주도'	THEN 15
		END
;


자료를 확인하면 아래와 같이 나오는데요.

SELECT
	*
FROM test.TB_MBR_BAS
;



03


최종적으로 AREA_NM 컬럼을 삭제합시다.

ALTER TABLE test.TB_MBR_BAS DROP COLUMN AREA_NM;



삭제했다면 자료를 확인해봅시다.

SELECT
	*
FROM test.TB_MBR_BAS
;


04


이제 두 개의 테이블을 연결해서 조회해보겠습니다. JOIN을 사용하면 되고, Quey 문은 아래와 같습니다.

SELECT
	T101.MBR_ID
	,T101.MBR_INDFY_NO
	,T101.MBR_NM
	,T101.AGE
	,T101.AREA_ID
	,T102.AREA_NM
FROM test.TB_MBR_BAS T101
	INNER JOIN test.TB_AREA_BAS T102
		ON T102.AREA_ID = T101.AREA_ID
;



05


06



정리하며

위에서 보여드린 예시는 두 가지 다른 점이 있습니다. 첫째는 TABLE 뒤에 T101, T101 과 같은 얼라이스를 준 것, 둘째는 INNER JOIN 문장이 들어간 것입니다.

만약 테이블이 2개 이상이라면 사용할 테이블 컬럼을 써야 하는데 테이블명을 그대로 쓴다면 너무 길어집니다. 그래서 얼라이스로 테이블을 간단하게 표시하는 것이죠.

INNER JOIN은 JOIN 중 가장 기본이 되는 문장입니다. 플랜을 보면 T101 즉 test.TB_MBR_BAS를 차례대로 전부 읽는데, 그때마다 T102인 test.TB_AREA_BAS 를 AREA_ID 를 기준으로 값을 읽습니다. T101에 해당하는 내용과 T102에 해당하는 내용을 보여주는 것이죠. 저는 Database를 쓰는 이유가 바로 JOIN 때문이라고 생각하는데요. 여러분의 생각은 어떤가요. 조금 헷갈린다면 다음에는 JOIN에 대해서 알아보도록 하겠습니다. (자연스러운 결말..!)


한석종 부장 | R&D 데이터팀
hansj@brandi.co.kr
브랜디, 오직 예쁜 옷만