자료는 가공되지 않은 원시목과 같다. 사용자가 원하는 형태로 자료를 다듬는 작업은 원목으로부터 고급가구를 만드는 것에 비견된다.
전화를 들고 114를 누른 다음 "○○실업의 전화번호를 부탁합니다"하거나 "신사동의 김철수 전화번호를 알 수 없을까요?"라고 말하면 몇초 안에 원하는 숫자를 얻게 된다. 물론 우리도 친구들 전화번호 몇 개 정도는 외울 수 있다. 그러나 데이타가 많아지면 사람의 기억능력으로는 그것을 관리하기가 매우 어려워진다. 114의 신속한 대답은 데이타베이스의 덕분인 것이다. PC에서도 디베이스를 이용하면 이와 같은 데이타 관리의 효과를 거둘 수 있다.
지난호에서는 데이타베이스 파일을 작성하는 방법에 대해서 소개하였는데, 이번호에서는 데이타베이스 파일을 변경하는 방법을 소개한 다음 데이타베이스 파일을 활용하는 방법중의 하나인 검색에 대하여 살펴 보고자 한다.
■데이타의 변경/EDIT와 BROWSE
당연한 일이겠지만 데이타베이스 파일에 입력된 데이타는 쉽게 변경될 수 있어야 한다. 그리고 디베이스는 데이타베이스 파일에 저장된 데이타를 변경하는 여러가지 명령어들을 가지고 있다. 지난호의 마지막에 설명한 EDIT명령은 그중 일부일 뿐이다.
우선 지난호에서 정리한 대로 디베이스를 실행시켜서 실습을 할 준비를 하자. 그리고 지난호에서 만들었던 데이타베이스 파일 PHONE.DBF를 USE 명령을 사용하여 오픈해 보자.
● use phone(↲)
이제 PHONE.DBF의 데이타들을 보려면 LIST 명령을 사용하고, 수정하기 위해서는 EDIT명령을 사용한다. EDIT 명령이 실행된 상태에서는 다음과 같은 키를 이용하여 데이타를 수정하고 싶은 곳으로 커서를 움직일 수 있다.
→ : 커서를 오른쪽으로 한 칸 이동시킨다.
← : 커서를 왼쪽으로 한 칸 이동시킨다.
↑ : 커서를 한 필드 앞으로 이동시킨다.
↓ : 커서를 한 필드 뒤로 이동시킨다.
Home : 커서를 한 단어 앞으로 이동시킨다.
End : 커서를 한 단어 뒤로 이동시킨다.
PgUp : 커서를 한 레코드 앞으로 이동시킨다.
PgPn : 커서를 한 레코드 뒤로 이동시킨다.
${F}_{1}$ : 도움말을 화면에 표시하거나 표시하지 않게 한다.
만약 한 레코드의 첫번째 필드에서 ↑키를 누르거나 마지막 필드에서 ↓키를 누르면 커서가 앞레코드나 뒤 레코드로 이동된다. 또한 데이타베이스 파일의 첫번째 레코드에서 PgUp 키를 누르거나 마지막 레코드에서 PgDn키를 누르면 도트프롬프트 상태로 빠져 나가게 된다(첫번째 레코드의 첫번째 필드에서 ↑나 Home 키를 누르거나, 마지막 레코드의 마지막 필드에서 ↓나 End키를 눌러도 마찬가지 결과를 얻는다). Home과 End 키는 직접 눌러서 실습을 해 보라. 앞의 설명과는 약간 다르게 동작하는 경우를 발견할 수 있을 것이다.
테이타를 수정한 다음에는 END키를 눌러(^END는 Ctrl 키를 누른 상태에서 END 키를 누르는 것을 말한다) 변경한 내용을 저장하거나, ESC 키를 눌러 변경한 내용을 취소하면서 도트 프롬프트로 나갈 수 있다.
EDIT 명령은 한 번에 레코드 하나만을 볼 수 있지만, 여러 레코드들을 같이 보면서 데이타를 수정할 수 있는 명령이 있다. 그것이 바로 BROWSE 명령이다 (명령의 이름이 길므로 BROW까지만 입력하는 것이 편하다). 도트 프롬프트에서
● go top (↲)
● brow (↲) 과 같이 입력하면 (그림1)과 같은 화면이 나타난다. BROWSE 명령이 실행된 상태에서는 다음과 같은 키를 이용하여 커서를 움직일 수 있다.
→ : 커서를 오른쪽으로 한 칸 이동시킨다.
← : 커서를 왼쪽으로 한 칸 이동시킨다.
Home : 커서를 한 필드 앞으로 이동시킨다.
End : 커서를 한 필드 뒤로 이동시킨다.
↑ : 커서를 한 레코드 앞으로 이동시킨다.
↓ : 커서를 한 레코드 뒤로 이동시킨다.
PgUp : 커서를 한 화면 앞으로 이동시킨다.
PgDn : 커서를 한 화면 뒤로 이동시킨다.
${F}_{1}$ : 도움말을 화면에 표시하거나 표시하지 않게 한다.
BROWSE 명령에서도 Home과 End 키는 앞의 설명과는 약간 다르게 동작한다. 그것은 레코드의 첫번째 필드에서는 Home 키가 ↑키와 같은 효과를 낸다는 것이다. 마찬가지로 End 키도 레코드의 마지막 필드에서는 ↓키와 같은 효과를 낸다.
커서가 마지막 레코드에 있을때 아래로 더 이동하려는 키를 누르면, 화면의 하단에 새로운 레코드를 입력할 것인가를 묻는 다음과 같은 메시지가 나타난다.
Add new records? (Y/N)
여기에서 Y를 누르고 데이타를 더 입력할 수 있다.
BROWSE 명령에서도 데이타를 수정한 다음에는 END 키를 눌러 변경한 내용을 저장하거나, ESC 키를 눌러 변경한 내용을 취소하면서 도트 프롬프트로 나갈 수 있다.
(그림1)에서는 PHONE. DBF의 필드 수가 적기 때문에 모든 필드를 볼 수 있지만, 필드의 수가 화면에 표시할 수 있는 것보다 더 많은 경우에는 ^←키와 ^→키를 사용하여 화면에 표시되는 필드를 변경해야 모든 필드를 볼 수 있다. 이렇게 화면을 움직이는 것을 팬(Pan)이라고 한다.
데이타를 변경할 때 BROWSE 명령은 EDIT 명령보다 더 강력한 기능을 제공하지만 필드의 수가 많은 경우 모든 필드를 화면에서 볼 수 없다는 약점을 가지고 있다. 그러나 이런 단점을 보강해주는 여러가지 옵션들이 제공된다.
프롬프트모드에서
● brow fields name, address(↲) 라고 입력하면 FIELDS 옵션 뒤에 지정된 필드인 NAME과 ADDRESS 필드만 화면에 표시된다. 이렇게 되면 NAME과 ADDRESS 필드만을 보고 수정할 수 있다. FIELDS 옵션의 사용법은 그뒤에 필드의 이름들을 콤마로 분리하여 나열하는 것이다.
다른 옵션으로 LOCK과 FREEZE 옵션이 있다. LOCK 옵션은 ^←나 ^→키를 눌러 패닝(panning)을 해도 필드중 몇개는 화면에 고정되게 할 때 사용한다. 우리가 사용하고 있는 PHONE.DBF에서는 확인할 수 없지만 필드가 많은 데이타베이스 파일을 오픈한 상태에서
● brow lock 2(↲)
를 하면 패닝 키를 눌러도 첫번째와 두번째 필드는 항상 화면에 표시된다. LOCK 옵션 뒤에는 숫자를 사용하는데 고정될 필드의 수를 의미한다. 고정될 필드를 임의로 지정할 수는 없다.
FREEZE 옵션을 사용하면 지정한 필드의 내용만 변경할 수 있고 나머지 필드들의 내용은 변경할 수 없게 된다. 예를 들면
● brow freeze name(↲)
명령을 사용하면 모든 필드가 나타나는 BROWSE 화면이 되는데 커서는 NAME 필드를 벗어나지 못한다. 즉 NAME 필드의 내용만을 수정할 수 있다. 불행하게도 FREEZE 옵션에 하나 이상의 필드를 지정할 수는 없다.
BROWSE 명령에서는 지금까지 설명한 여러 옵션을 함께 사용할 수 있다. 다음이 그 예이다. 필드가 많은 데이타베이스 파일을 하나 만들어 여러가지 방식으로 실험해 보기 바란다.
● brow fields name, address lock 1 freeze name(↲)
■데이타의 삭제/DELETE와 RECALL과 PACK
데이타중에는 변경할 것도 있겠지만 삭제해서 버릴 것도 있을것이다. 데이타를 삭제하는 기능을 위해서 마련된 디베이스 명령어는 DELETE, RECALL, PACK의 세가지이다.
DELETE 명령은 현재 레코드포인터(record pointer)가 가리키고 있는 레코드에 삭제 표시를 하는 것이다. 실제로 삭제되는 것은 아니다. 이렇게 삭제 표시를 해두었던 데이타는 RECALL 명령으로 삭제 표시를 떼어낼 수 있다. PACK 명령은 현재 삭제 표시가 붙어 있는 레코드들을 진짜 지우는 일을 한다.
PHONE.DBF에서 3번 레코드를 지우고 싶다고 하자. 그러기위해서는
● go 3(↲)
● delete(↲)
과 같이 하면 된다. 이것을
● delete record 3(↲)
처럼 한 번에 할 수도 있다. 이제 LIST 명령으로 보면 3번 레코드의 첫번째 필드앞에 *가 있을 것이다. 이것이 디베이스의 삭제 표시이다. 삭제 표시를 떼어내려면
● go 3(↲)
● recall(↲)
혹은
● recall record 3(↲)
명령을 입력하면 된다. 다시 LIST명령을 해 보면 3번 레코드의 *표시가 없어졌을 것이다. 지워진 레코드가 표시되지 않도록 하려면
● set deleted on(↲)
명령을 사용한다. 이의 반대 명령은 물론 SET DELETED OFF이다.
RECALL 명령이 있는 이유는 삭제했던 데이타를 다시 살리고 싶은 경우를 위한 것이다. 그러나 삭제 표시된 데이타가 많아지면 이들을 진짜로 지워야 할 시기가 도래한다. 이럴 때는 PACK 명령을 내린다. 이 명령을 사용하여 지워진 데이타는 다시 입력하기 전에는 살릴 수 없으므로 주의를 해야 한다.
■데이타베이스 파일의 변경/MODIFY STRUCTURE
데이타베이스 파일을 만들어 사용하다 보면 그 내용뿐 아니라 파일의 구조도 변경해야 할 경우가 발생한다. 가장 일반적인 것은 데이타베이스 파일을 만들 때 미처 생각하지 못한 항목의 데이타를 발견한 상황이다.
디베이스는 이미 만들어진 파일의 구조도 변경할 수 있도록 허용하고 있다. 그 명령은 MODIFY STRUCTURE이다. 구조를 변경하고 싶은 데이타베이스 파일을 오픈한 상태에서
● modi stru(↲)
명령을 입력하면 (그림2)와 같은 화면이 나타난다. 새로운 필드를 삽입하려면 상하화살표 키를 사용하여 삽입하고 싶은 위치로 이동한 다음 N키를 눌러 빈 칸을 만들고 입력하면 된다. 반대로 삭제하고 싶은 필드는 그 위치로 가서 ^U 키를 눌러 제거한다.
여기서는 PHONE.DBF에 FEE라는 이름의 필드를 추가해 보자. 필드의 타입은 Numeric, 길이는 6, 소숫점 이하는 0으로 하자. 원하는 대로 데이타베이스 파일의 구조를 변경하였으면 ^END키를 누른다. 화면 하단에
Press ENTER to confirm.
Any other key to resume.
이라는 메시지가 나타난다. 이것은 엔터 키를 누르면 데이타베이스 파일의 구조가 변경되고, 다른 키를 누르면 변경 화면으로 돌아간다는 의미이다. 엔터 키를 누른다. 메시지 "Please wait"가 잠깐 나타났다가 도트 프롬프트 화면으로 돌아온다. 이때 LIST명령을 내려 보면 FEE 필드가 추가되어 있는 것을 알 수 있을 것이다. 확인이 되었으면 (그림 3)과 같은 결과가 나오도록 EDIT명령으로 FEE 필드에 숫자들을 채워 넣는다.
■데이타의 검색/FOR
지금까지 우리가 배운 디베이스 명령어들은 데이타베이스 파일을 만들고 그 안에 데이타를 입력하고, 확인하고, 변경하고, 삭제하는 일을 처리하는 것들이었다. 즉 데이타베이스를 구축하는데 관련이 되는 명령들을 배워왔다. 그렇다면 이제부터는 구축이 된 데이타베이스를 활용하는 방법에 대해서 다루어 보기로 하자.
(그림 3)의 PHONE.DBF는 레코드가 6개뿐이지만, 만약 이 주소록이 1천개의 레코드를 가지고 있다고 생각해보자. 그렇다면 LIST 명령으로 어떤 사람의 전화번호를 찾는다는 것은 무리이다. 이런 경우에는 어떻게 해야 하는가? 다음의 명령은 이름이 박시우인 레코드를 찾아 화면에 그 내용을 표시하게 한다.
● locate for name= "박시우"(↲)
● display (↲)
LOCATE 명령은 현재 레코드 포인터가 가리키고 있는 레코드 이후에서 그 뒤에 지정된 조건에 맞는 레코드를 찾아 레코드 포인터를 그 레코드 번호로 맞추는 명령이다. 조건을 줄 수 있는 GO 명령이라고 생각하면 이해하기가 쉬울 것이다.
컴퓨터에 익숙하지 않는 사람들에게는 FOR 옵션 뒤에 오는 "조건"을 이해하거나 만드는 일이 그리 간단한 것이 아니다. 그러나 중학교 정도의 수학을 이해하는 사람이라면 곧 이를 사용할수 있으리라 믿는다.
앞의 예에서 NAME은 현재 오픈되어 있는 PHONE.DBF 파일의 필드 이름이다. 따라서 FOR NAME="박시우"는 NAME 필드의 내용이 "박시우" (문자열은 이렇게 따옴표로 둘러싸서 표현하는 경우가 많다)인 레코드를 찾으라는 의미이다. 이렇게 원칙을 이해하고 나면 다음의 조건들도 그렇게 어려운 것은 아니다.
FOR PHONE="588-2129"
FOR FEE>;350
FOR FEE>;300 .AND.
FEE<; =400
FOR "김" NAME
FOR "컴퓨터" ADDRESS .OR.
FEE>;1000
첫번째 조건은 PHONE 필드의 내용이 588-2129인 레코드, 두번째 조건은 FEE 필드의 숫자가 350보다 큰 레코드, 세번째 조건은 FEE 필드의 숫자가 300보다 크고 400보다 작거나 같은 레코드, 네번째 조건은 NAME 필드에 김이라는 글자가 포함된 레코드, 마지막 조건은 ADDRESS필드에 컴퓨터란 글자가 포함되어 있거나 FEE 필드의 숫자가 1000이 넘는 레코드를 의미한다. 여기에서 숫자를 담고 있는 필드를 이용하는 조건을 만드는 방법, 문자열 필드에 어떤 글자가 포함되어 있는가를 조사하는 방법( 디베이스의 특수한 연산자로서 그 뒤에 있는 문자열이 앞에 있는 문자열을 포함하고 있는지를 검사한다), 그리고 여러 조건을 연결하는 .AND.와 .OR. 옵션의 사용방법(.AND.는 앞뒤의 조건을 모두 만족시키는 조건을 찾으며, .OR.은 앞뒤의 조건중 하나만 만족시켜도 포함시킨다.) 등은 매우 중요한 것이다.
이런 조건을 사용할 수 있는 것은 LOCATE 명령 하나뿐이 아니다. DISPLAY, LIST, EDIT, REPLACE 등 많은 명령들의 뒤에 FOR 옵션을 사용할 수 있다. 다음은 그 예이다.
DISPLAY FOR FEE>;300
LIST FOR "윤" NAME .OR.
FEE>;350
EDIT FOR FEE>;300
EDIT FIELD NAME FOR FEE>;200
REPLACE ALL FEE WITH 0 FOR FEE<;300
앞의 예에서 EDIT FIELD는 지정된 필드만을 수정하는 명령이며, REPLACE ALL 명령은 FOR 뒤의 조건을 만족하는 모든 레코드에서 FEE 필드의 내용을 WITH 뒤의 내용으로 바꿔주는 것이다.
이상으로 이번호의 디베이스 실습을 마치도록 하자. 이번호에서는 데이타베이스 파일의 데이타와 구조의 변경방법과 원하는 데이타를 찾는 검색방법을 살펴 보았다. 그 과정에서 EDIT, BROWSE, DELETE, RECALL, PACK, MODIFY STRUCTURE, REPLACE, FOR 명령들의 사용법을 설명하였다. 이 명령들의 정확한 용법에 대해서는 디베이스 매뉴얼을 참고하기 바란다. 이들에 대한 이해를 확실하게 하기 위해서는 자신에게 필요한 데이타 베이스 파일을 하나 만들어 하나하나 시험해 보아야 한다.
다음 달에는 데이타베이스 파일을 우리가 원하는 상태로 배열하는(소트하는) 방법을 설명할것이다. 특히 디베이스의 특징인 인덱스의 개념과 그 활용법에 대해서 알아 보고자 한다.