데이터 베이스를 운영하다보면 테이블의 구조를 변형해야 할 때가 있습니다. 가령, 손님의 정보 요구사항에 나이가 추가 되었다면 customer 테이블의 어트리뷰트( 열 )에 나이를 표시하는 항목이 추가되어야 할 것입니다. 이럴 경우 지금까지 배운 지식으로는 전체 테이블을 지우고 다시 만드는 수 밖에 없습니다. 하지만 테이블 안에 많은 양의 정보가 들어있을 경우 백업하기도 힘들고, 속도도 느리기 때문에 비효율적입니다.


1. 어트리뷰트 추가

 이럴 경우 간단히 테이블의 구조를 바꿀 수 있는 sql 구문이 있습니다. 바로 alter 구문인데요. 테이블에 어트리뷰트를 삽입하는 sql 문은 다음과 같습니다.


 table_name 에는 구조를 바꿀 테이블의 이름을 쓰고 A 에는 어트리뷰트 이름을 씁니다. D 는 추가 할 어트리뷰트의 도메인을 넣습니다. 예를 들어 customer 테이블에 age 라는 어트리뷰트를 추가하는 sql 문은 다음과 같습니다.

alter table customer add age int;

 위 sql 문이 적용되기 이전의 테이블이 다음과 같은 모습이었다고 가정하겠습니다.



sql문을 적용하고 난다음 테이블의 모습은 다음과 같습니다.




보시다 시피 age라는 어트리뷰트가 추가 된 것을 볼 수 있습니다. 하지만 따로 값을 지정해 주지 않았기 때문에 Mysql 의 경우에는 NULL 값을 채워 넣습니다.


2. 어트리뷰트 제거

 이제 테이블에서 어트리뷰트를 제거하는 sql문을 배워 보도록 하겠습니다. 어트리뷰트를 제거하는 sql구문은 다음과 같은 형태를 갖습니다.


 table_name 부분에는 어트리뷰트를 삭제하고자 하는 테이블의 이름을 쓰고 A에는 제거 할 어트리뷰트의 이름을 써 넣습니다. 그럼 예를 들어 보도록 하겠습니다. customer 테이블에 추가한 age 라는 어트리뷰트를 다시 제거해 보도록 하겠습니다.

alter table customer drop age;

위 sql 문이 적용되기 전의 테이블의 상태는 다음과 같습니다.



이제 sql 문을 적용한 모습을 보겠습니다.




 삭제 되는 어트리뷰트가 지워진 모습입니다. 모두 NULL 일 필요는 없고 저장되었던 정보는 모두 삭제가 됩니다. 이제 테이블의 구조도 바꿀 수 있게 되었습니다.




 이전 단계에서 테이블에 데이터를 기록하는 ( 레코드를 삽입하는 ) 구문을 배웠습니다. 그러면 테이블에서 데이터를 지우는 ( 레코드를 지우는 ) 구문을 실습해 보겠습니다.

1. delete from 구문

 그러면 예제로 다음과 같은 테이블과 레코드들이 있다고 가정하겠습니다.


 예제를 위해서 여러 레코드들을 삽입했습니다. ( 여러분들도 예제를 위해서 insert into 구문을 이용해서 예제 레코드들을 삽입해 보세요. ) 기본적으로 레코드를 삭제하는 delete from 구문은 다음과 같은 구조를 갖고 있습니다.



 "테이블_이름"부분에 삭제하고 싶은 레코드가 있는 테이블의 이름을 넣어 줍니다. 예를 들면, customer 테이블에 어떤 레코드를 삭제하고 싶을 경우 delete from customer ... 이런 식이 되겠죠. where 뒤의 조건에는 삭제하고 싶은 테이블의 조건을 명시합니다. 즉, customer_num의 값이 2인 레코드를 삭제하고 싶다면, delete from customer where customer_num=2가 되겠죠. 이 때, where 절에 의해서 선택되는 레코드는 유일하지 않습니다. 즉, where 뒤에 customer_name='ais' 라고 하면 customer_name의 값이 'ais'인 모든 레코드가 삭제 됩니다.


그럼 예제를 통해서 알아보도록 하겠습니다. 먼저 다음의 SQL문을 실행해보겠습니다.

delete from customer where customer_name=4;

 의미상으로는 customer_name의 값이 4인 customer_name이 abc인 레코드가 삭제가 될 것입니다. 실행해 보도록 하겠습니다.


 예상대로 customer_num이 4인 레코드가 삭제 되었습니다.

 그럼 다음으로 customer_addr의 값이 seoul인 레코드를 지워보도록 하겠습니다. 다음의 sql 문을 실행하도록 하겠습니다.

delete from customer where customer_addr='seoul';


Mysql의 경우 위 sql문을 실행 시켰을 경우 "2 rows affected" 라는 메시지가 뜹니다. 즉, 2개의 레코드가 영향을 받아서 제거 되었다라는 뜻입니다. 실제로 테이블에서 customer_addr의 값이 'seoul'인 모든 레코드가 제거 되었습니다.

 마지막으로 테이블에 있는 모든 레코드를 지우는 방법입니다. 하나하나 지우다 보면 시간낭비이고 자원낭비가 되는데, sql에서는 테이블의 모든 레코드를 지우는 방법도 제공합니다.


  눈치가 빠르신 분은 아시겠지만 위에서 언급했던 delete from 구문에서 where 절만 뺀 형태입니다. 특별히 '어떤 레코드를 지워라'라고 명시를 하지 않으면 테이블에 있는 모든 레코드를 삭제하게 됩니다. 굉장히 편리하죠.

 그럼 실제로 customer 테이블에 있는 모든 레코드를 지워보도록 하겠습니다. 다음의 sql 문을 실행하도록 하겠습니다.

delete from custmer;


 위와 같이 테이블의 모든 레코드들이 삭제 된 것이 보이며 mysql DBMS로 부터 2 rows affected 라는 메시지가 도착한 것을 볼 수 있습니다.


이제 테이블의 스키마를 설계해서 테이블을 생성하고 테이터( 레코드 )를 삽입, 삭제 하고, 테이블을 삭제 할 수가 있습니다. 이제 우리는 DB로 많은 것들을 할 수 있게 되었습니다.




 
.





1. 릴레이션 스키마

 데이터 베이스에 다음과 같은 테이블이 존재한다고 가정합시다. R-DB에서는 테이블을 릴레이션이라고 합니다. ( 테이블 자체가 관계를 의미하는 릴레이션을 나타내기 때문이죠. )

 번호 이름
주소
나이
 1  김태연 서울시 강동구
 21
 2  김태현 서울시 관악구
 30
 3  김신영 서울시 서초구
 26

여기에서 맨 처음 열의 제목 부분을 보면 "번호", "이름", "주소", "나이" 가 있습니다. 이것들을 릴레이션 스키마라고 합니다. 이 릴레이션 스키마는테이블의 전반적인 디자인을 나타냅니다. 위의 예를 들면 릴레이션 스키마 항목 중에서 "나이"라는 항목은 직관적으로 해당 사람의 나이를 나타내며 숫자로 올 것임을 알 수 있습니다.

 이전 포스트에서 살펴본 create 구문에서 어트리뷰트와 도메인을 같이 쓴 부분이 바로 릴레이션 스키마를 정의한 부분입니다. 위와 같은 테이블에서 같은 열의 도메인은 같음을 알 수 있습니다. ( 예를 들어 나이 부분에 갑자기 글자가 나오지 않고, 번호부분에도 마찬가지 입니다. )


2. 테이블로 데이터 삽입1 - 전체 어트리뷰트를 삽입 (insert into 구문)

 전 포스트에서 만들었던 customer라는 테이블에 데이터를 삽입하는 실습을 해보도록 하겠습니다. 테이블에 데이터를 삽입하는 SQL 문은 다음과 같은 구조를 갖습니다.


 
 table_name 부분에 데이터를 삽입하고 싶은 테이블 이름을 집어 넣으시고, value 이후에 오는 값들은 삽입 될 데이터들이며 오는 순서대로 테이블에 들어가게 됩니다. 다음의 예제를 직접 실행해 보도록 하겠습니다.

insert into customer value( 1, 'KTY', 'seoul');

 위 SQL 문을 직접 실행해보면 다음과 같은 실행 결과가 나오게 됩니다.



 위 SQL 문을 실행한 결과 각각 1, kty, seoul 이라는 값이 테이블에 삽입 된 것을 볼 수 있습니다. 여기서 주의 하셔야 할 것은 value 이후에 오는 값들은 테이블에 순차적으로 삽입 된다는 것입니다. 즉, 앞에서 value( 1, 'kty', 'seoul' ) 이라고 적었으므로 각각 1은 customer_num에 'kty'는 customer_name에 'seoul'은 customer_addr에 들어가게 되었습니다. 만일 순서를 바꿔서 입력을 한다면 어떻게 될까요?? 그건 숙제로 남겨두겠습니다.



3. 테이블로 레코드를 삽입 2 - 일부 어트리뷰트를 삽입 (insert into)

 만일 고객의 이름은 아는데 주소를 모를 경우 난감한 상황이 발생합니다. 왜냐하면 앞에서 배운 구문으로는 레코드를 이루는 값들을 모두 알아야 입력을 할 수 있기 때문입니다. 하지만 insert into 구문에는 필요한 어트리뷰트만 삽입 할 수 있는 방법이 있습니다. 해당 방식은 다음과 같은 형식을 갖습니다.
 

  테이블 이름 뒤에 입력하고 싶은 어트리뷰트를 선택하는 항목이 있습니다. 즉, A1 ~ Ak 까지가 입력하고 싶은 어트리뷰트를 선택하는 부분이고, value1 ~ value k 가 선택 된 어트리뷰트에 집어 넣을 값들을 써 넣는 부분입니다. 이번에도 실습을 통해서 배워 보도록 하겠습니다. 다음 SQL 구문을 실행해 보도록 하겠습니다.

insert into customer ( customer_num, customer_name ) value ( 2,'kth' );


  선택 된 어트리뷰트인 customer_num과 customer_name에 해당 값인 2와 'kth'가 삽입 된 것을 볼 수 있습니다. 그러면 선택이 되지 않은 어트리뷰트에는 어떤 값이 들어갈 까요? 바로 "널"값이 들어가게 됩니다.

 널값이란 1)알 수 없는 값이거나 2)존재하지 않는 값을 의미합니다. 간단히 바람직하지 않은 값이라고 생각하시면 됩니다. 나중에 이 널값에 대해서 다시 자세하게 알아보도록 하겠습니다. 일반적으로 널 값은 바랍직하지 않으며, 여러 경우에서 문제를 일으키게 됩니다.





.




 SQL을 이용해서 간단한 테이블을 만들어 보도록 하겠습니다. 테이블을 생성하는 명령어는 기본적으로 다음과 같은 형식을 갖습니다.


 create table로 시작해서 table_name 에는 만들고자 하는 테이블의 이름이 들어갑니다. 즉, 고객의 명단을 만들고 싶다면 create table customer ( ... ) 같은 SQL 문을 만들면 됩니다. A와 D는 각각 어트리뷰트 이름과 도메인을 정합니다. 예를 들면 name char(30) 은 30바이트의 크기를 갖는 문자열을 도메인으로 하는 name이란 어트리뷰트를 의미합니다. 쉽게 말하면 표에서 열 이름이라 할 수 있습니다.

그럼 이해하기 쉽게 예제를 이용해서 보도록 하겠습니다.
( 예제의 실행 환경은 Mysql 입니다. Access를 이용하실 분들도 문제 없이 실행 하실 수 있습니다. ) 다음 SQL 문을 실행하도록 하겠습니다.




 쿼리가 제대로 입력이 되었다면 "Query OK, 0 rows affected ... "라는 메시지가 뜰겁니다. 그럼 테이블이 제대로 만들어 졌는지 확인을 해보도록 하겠습니다.




 "show tables;"라는 명령어를 입력하면 Mysql DBMS는 여러분에게 현재 데이터베이스에 있는 테이블을 보여줄 것입니다. 이전 쿼리에서 customer 라는 테이블을 생성하였기 때문에 테이블 확인 쿼리에서 위와 같이 확인 하실 수 있습니다.

 테이블 만드는 법을 배웠으니 이제 테이블을 삭제하는 법을 배워 보도록 하겠습니다. 테이블을 지우는 쿼리는 다음과 같은 구조를 갖습니다.



 drop table table_name 의 구조를 갖으며 table_name 부분에 삭제하고 싶은 테이블의 이름을 입력하고 실행하시면 됩니다. 직접 실행을 해보면서 배워 보겠습니다. 다음과 같은 쿼리를 입력합니다.

 

 
 쿼리의 문법적 오류가 없으면 Query OK 이라는 메시지가 뜰 것입니다. 그러면 show tables; 를 입력해서 쿼리가 정상적으로 적용이 되었는지 확인해보도록하겠습니다.




 하나 있었던 테이블이 없어졌기 때문에 Empty set 이라는 결과가 나왔습니다. 이제 데이터베이스를 설계하고 실제로 Mysql에 구현을 할 수 있게 되었습니다. 좀 더 자세한 제약조건들이나 DDL 들을 배우시겠지만 여기까지만 배워도 데이터베이스를 구현하는데에는 큰 문제가 없을 겁니다.



+ Recent posts