김경호/자유기고가 zesus@edunet.nmc.nm.kr
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0. 시작하면서... 지난 시간까지는 mini SQL 2.0.0을 어디에서, 어떻게, 무엇을 해야 얻을 수 있고 설치를 할 수 있는지 간단하게 알아 보았다. 우리는 데이터 베이스 관리 시스템이 왜 필요로 하게 되었고, mSQL의 장점과 개발에 도움이 되는 다른 개발 솔루션들이 많다는 것도 쉽게 알 수 있었을 것이다. 이번 시간에는 좀더 깊은 이야기를 하려고 한다. DBMS라는 것이 많은 양의 데이터를 처리한다는 것은 누구나 잘 알고 있을 것이다. 그러나 그 뜻하는 바가 무엇인지에 대하여 정확한 개념을 알지 못하고 시작하는 것보다는 데이터 베이스 시스템에 대하여 간단히 살펴 보기로 하는 것이 좋을 같다.
1. 데이터 베이스란 무엇인가? 일반적으로 우리가 부르는 DB라는 것은 너무 형용사적인 것 같아 필자는 즐겨 표현하지 않는다. 우리는 일상적으로 DB라는 말을 아주 즐겨서 사용하는 것을 볼 수 있다. 특히 통신에서는 더욱 그렇다. 우리가 말하는 DB 라는 단어 자체는 상당히 광범위 한 것을 말한다. DB는 데이터 베이스(Database)의 약자로 일반적으로 데이터들의 모임으로 정의한다. 그러나 일반적으로 사람들은 DB와 DBMS사이의 개념을 잘 모르고 같은 의미로 사용할 때가 많다는 것을 알 수 있다. 데이터 베이스 관리 시스템(Database Management System)은 여러 가지 상호 연관이 있는 데이터나 데이터 베이스들을 모아서 관리해 주는 하나의 관리 시스템이다. 대부분의 데이터 베이스 관리 시스템에는 이러한 데이터 베이스들과 각각의 데이터 베이스를 관리할 수 있는 응용 프로그램들이 있기 마련이다. 다음 < 그림 1 > 은 데이터 베이스 시스템의 구성 및 사용자간의 관계를 설명하고 있다. 사용자는 초보자일 수 있고, 응용 프로그래머, 일반 사용자, 데이터 베이스 관리자 일 수도 있다. 여기서 초보자는 응용 프로그램으로 데이터 베이스 시스템에 접근하는 것을 말하는 것으로 비 프로그래머들이 많고, 회계나 기타 회사의 직원일 가능성이 높다. 응용 프로그래머는 필자와 같은 사람을 말하는 것으로 데이터 베이스의 API를 이용하거나 시스템 호출(System Call)을 사용하여 적절하게 구성된 데이터 베이스에 접근하는 사람을 말한다. 데이터 베이스 관리자는 여러분들을 말하는 것으로 데이터 베이스의 스키마를 관리하는 사람을 말한다. 너무 어려운 말들이 많이 나오고 생소한 개념이 많아서 어리둥절한 독자도 있을 것이다. 여기서는 대충 데이터 베이스와 우리들의 관계가 이런 정도에 있구나 하는 것만 알고 넘어 가는 것이 좋을 듯하다. <그림 1>에서 여러분들의 위치를 한번 생각해 보자.
< 그림 1 > 데이터 베이스 시스템의 구성 및 사용자와의 관계 우리가 집중적으로 시작해 볼 Mini SQL 2.0.0에서는 msql2d라는 데이터 베이스를 관리할 수 있는 초경량 데이터 베이스 엔진 데몬(데이터 베이스 관리 프로그램)이 있고, mSQL 1.x.x 버젼대에서는 찾아 볼 수 없는 여러 가지 데이터 베이스 유틸리티 프로그램들이 몇 가지 추가 되었다. 하지만, 안타깝게 이러한 응용프로그램들의 성능 확장이 이루어지지 않아 사용하는데 불편을 느낄 수 있다. 곧 이러한 응용 프로그램들을 분석하는 기회가 주어지게 될 것이다. 혹시 이러한 프로그램을 직접 만들어 보고 싶다면, 반드시 API 연재를 읽어 본다면, 얼마간의 개발을 통해서 인터넷에 본인이 만든 msqltool을 msql Contrib 폴더에 들어 가게 만들 수도 있을 것이다. 잘 만든 툴이라면 다음 번 msql 배포판에 포함이 될지 누가 알겠는가?
<그림 2> 데이터와 데이터 베이스와의 관계 <그림 2>은 데이터와 데이터 베이스와의 관계를 말해 주고 있다. 데이터베이스 시스템은 대량의 정보를 관리하고, 그밖에 정보를 조작하여 필요한 정보를 얻을 수 있는 방법을 제공하고 있다. 또한 데이터베이스에는 데이터의 접근 및 수정에 대한 안정성을 제공해야 한다. 대부분의 데이터 베이스들은 이러한 조건들을 모두 갖추고 있을 것이다.
2. RDBMS(Relational Database Management System) Mini SQL은 관계형 데이터베이스의 특징을 가지기는 하지만, 완전한 기능을 지원하고 있지는 않다고 했었다. 그럼, 과연 관계형 데이터 베이스라는 것은 무엇인지 살짝 알아 보기로 하자. RDBMS(Relational Database Management System)는 관계형 데이터 베이스 관리 시스템의 약자이며, 자기 기억 장치(Disk)에 관계형 모델(E-R Model)의 개념을 합한 것으로 데이터를 관리하기 위한 시스템을 말한다. 여기서 E-R Model(Entity-Relation Model)이라는 개념은 기본적으로 객체(Object)들과 이 객체들 사이의 관계들의 집합으로 구성된 실세계를 표현하는 것이다. 즉, Entity(엔티티)는 실제로 우리 생활 속에 존재라는 객체가 되고, 이러한 엔티티는 유일하게 존재하는 객체이어야 한다. 그리고 Relation(관계)은 이러한 객체 사이들의 관계를 말한다.
< 그림 3 > 도서 대여점과 사용자간의 E-R Diagram 예를 든다면, 일반적으로 우리 주위에서 볼 수 있는 도서 대여점이 있을 것이다. 이 도서 대여점에 가서 책을 고른 후에 자신의 이름이나 신분증 또는 카드를 제시하면, 본인의 이름과 함께 지금까지 빌려 간 책이나 반납하지 않는 책들의 리스트가 나타날 것이다. 물론 반납하지 않은 책들이 없다면, 원하는 책을 빌려서 대여 일과 요금을 부과할 것이다. 우리는 이러한 실세계에 있는 일들을 쉽게 <그림3>과 같이 나타낼 수 있을 것이다. 이렇게 일상 생활에서도 쉽게 E-R Model의 예를 찾을 수 있다. 큰 타원은 실세계의 엔티티를 표현하고 있고, 마름모는 두 엔티티 간의 관계를 표현한다. 작은 타원은 연결되어 있는 엔티티의 속성들을 나타낸다. 각각의 엔티티에 노드들이 있는데 이것은 각각의 엔티티를 구분하거나 필요로 하는 정보들을 나타낸다. 예를 든 내용은 완전한 내용의 E-R Diagram이 아니며, 개념을 간단하게 알아 보기 위한 것이다. 독자 여러분들의 이해가 있기를 바란다. 그림을 좀 더 설명을 하면, 엔티티는 독자(사용자)와 도서가 엔티티가 되고 가운데에 있는 것은 단순이 관계를 나타낸다고 보면 된다. 이것은 회원 번호를 가지고 이러한 사용자의 데이터 베이스를 접근하는 것이다. 이렇게 만든 E-R Diageam은 쉽게 우리가 원하는 테이블로 변환이 용이해 진다. < 표 1 > 사용자 테이블 < 표 1 >에서 각각의 튜플(레코드)들은 반드시 레코드들끼리 구분되는 데이터를 가지고 있어야 한다. 이것은 주로 유일한 특징들을 말하는데 여기서는 주민등록 번호가 각각의 레코드를 구분해 주는 유일한 데이터가 될 수 있을 것이다. 이것을 데이터 베이스에서는 바로 키라고 한다. 일상에서도 문의 열쇠도 주키가 있고 보조 키가 있듯이 데이터 베이스에서도 주키(Primary Key)와 보조키(Candidate Key), 그밖에 대체키(alternate Key), 외래키(foreign Key)등이 존재한다.
<표 2>에서는 도서와의 구분을 위하여 도서 고유 번호를 붙여서 각각의 도서에 관한 정보를 관리하고 있다. 표에 있는 필드이외에도 대형 도서관일 경우에는 검색어, 주제명, 작가명, 출판사, 출판일, 출판인, 소주제, 간단한 도서 내용 소개 등등을 함께 관리하도록 만든다 이렇게 만드는 이유는 간단하다 보관하고 있는 도서를 관리하기 위하여서 인데 해당 되는 도서가 얼마나 많이 대여가 되었고, 보충할 도서인지 폐기할 도서인지를 구분하는데 필요하기도 하다. 현재 도서간에 구분을 해주는 키는 도서에 부여된 고유번호로 이것을 주키로 할 수 있다. 아마도 도서 관리를 위하여 계발자는 도서 테이블을 이용하여 도서 관리 프로그램도 만들어 관리의 편의를 도울 수 있을 것 같다. 여기서 참고로 알아야 될 것은 도서 번호를 부여할 때에는 아래와 같이 일률적으로 부여하지 말고, 분야별 코드와 도서 출반 번호(ISBN)등으로 분리하여 코드를 체계적으로 할당하여야 효율적으로 관리할 수 있다.
회원 번호 테이블은 약간 다른 것을 알 수 있다. 회원 테이블은 각각의 양쪽의 엔티티 사이에 있는 관계 엔티티로 두 엔티티 사이를 연결해 주는 역할을 한다. 따라서 양쪽의 사용자 엔티티와 도서 엔티티 각각의 주키를 필요로 한다. "이렇게 우리가 어려운 개념까지 꼭 알아야 하는가?" 라는 질문을 할 수 있을 것이다. 그러나 그 필요성은 바로 여기에 있다. 관계형 데이터 베이스가 바로 테이블들의 모임으로 구성이 되기 때문에 이러한 과정은 반드시 데이터 베이스 설계에 있어서 필요로 한다. 관계형 데이터 베이스는 E-R 데이터베이스와 비슷한 구조를 가진다. 관계형 데이터 베이스를 잘 구성하기 위하여서는 여러 가지 체계적인 설계 단계를 거쳐서 만들어야 된다. 이러한 설계 단계에 관하여 보다 자세하고 확실히 알고 싶다면, 참고 문헌을 통하여 관계형 데이터 베이스 설계 실무를 익힐 수 있으며 학원가에서 고가의 자금을 투자하여 배울 수도 있을 것이다.
3. SQL(Structured Query Language)은 무엇인가? SQL이 무엇일까? 궁금해 하는 독자가 혹시 있을지 모르겠다. SQL에 대하여 들어 보기는 했는데 도무지 그것이 무엇을 하는 것인지 무엇을 위하여 이 피곤한 세상에 태어 났는지 모르는 독자도 있을 것이고, SQL이라면 듣기만 해도 지긋지긋한 독자도 있겠지만, 우리는 이것에 대하여 자세하게 하려고 하는 만큼 간단하게 살펴 보기로 하자. 적어도 필자가 보는 SQL은 피곤한 세상을 보다 편안하게 하기 위하여 태어난 것은 확실하다. SQL는 관계형 데이터 베이스의 표준 언어(ANSI, ISO)로 데이터에 대하여 연산을 하는 구조화된 비절차형 언어이다. 데이터베이스 시스템에서는 데이터 베이스 스킴이라고 하는 것을 표현하기 위하여 데이터 베이스만의 언어를 정의해야 했다. 여기서 데이터 베이스 스킴은 쉽게 데이터베이스 전체의 설계를 의미한다. 즉 데이터베이스의 구조라고 할 수 있는데, 데이터 베이스에 어떤 데이터를 넣을 것인가를 결정해야 하고 그 길이는 얼마로 할 것인가 등등을 스스로 결정해야 한다. 이때 SQL이라는 것을 이용하면 데이터베이스를 생성과 수정 그리고 파괴도 할 수 있다. 또한 데이터를 저장하도록 데이터베이스 시스템에 명령을 내리기도 하고, 데이터베이스에서 특정한 조건을 가지는 데이터들을 순서적 혹은 무작위적 혹은 특정 함수에 의하여 필터링 되어져 출력을 얻을 수 있도록 한다. 데이터베이스 시스템에서 이렇게 중요한 역할을 하는 것이 바로 SQL로서, SQL의 중요성을 잘 모르는 독자들이 있을 것 같아 다음과 같이 그 특징들을 간단하게 요약 정리해 보았다. * SQL 의 특징 언어라고 하니 언뜻 C 언어나 Java가 생각나는 독자도 있을 듯하다. 또 하나의 언어를 배워야 하는 걸까? 그렇지 만은 않다 이러한 언어들은 여러 고급 언어들과 같이 배우기 어려운 언어가 아니기 때문에 쉽게 초보자도 데이터베이스에 접근할 수 있다.
<그림 4> 사용자와 DBMS간의 통신 SQL은 데이터베이스에 질의(Query)라고 하는
명령문으로 데이터 구조를 정의하고, 데이터를 수정 및 보안상의
제약 조건을 정의할 수 있는 다재 다능한 언어로 초기에는 IBM의
San Jose Research Lab.에서 개발되었고, System R프로젝트의 일부분으로
구현된 적이 있다. 당시에는 Sequel이라고 불려 졌지만, 후에 점차
SQL(Structured Query Language)로 바뀌었다.
4. Mini SQL에서 SQL의 특징들 Mini SQL에서는 대부분의 ANSI SQL을 지원하고 있기 때문에 SQL을 사용하는데 많은 불편한 점을 느끼지 못할 것이다. 그러나 역시 Postgres라든가 상용 데이터 베이스보다는 약한 면을 보이고 있는 부분이 바로 이 SQL문의 제약이다. SQL 의 제약은 다음과 같은 것이 대표적으로 지원이 되고 있지 않다. * 복합적으로 사용된 쿼리 구문 그 밖에도 관계형 데이터베이스에서 사용되는 SQL명령도 지원되고 있지 않지만, 이러한 제약들은 최소한 소형에서 중형의 데이터 베이스 시스템을 구축하는 것을 목적으로 사용한다면 문제가 되지는 않을 것이다. 조금은 귀찮고 약간은 복잡하기도 하겠지만, 여러 가지 지혜로운 방법으로 이러한 SQL을 극복해 낼 수 있다. 곧 이러한 지원이 되지 않는 SQL 구문이 지원될 예정이다. Mini SQL 2.0.0 버전에서 주목할 사항은 Create 구문이나, Select 구문에서의 영문 발음에 대한 것과 날짜, 시간, 텍스트에 대한 데이터를 다룰 수 있으며, 기존에는 같은 테이블 정의 문에서 Primary로 정의했던 것을 인덱스로 지정해야 한다는 것이다. 인덱스로 저장하는 이유는 잠시 후에 알아 볼 것이다. 인덱스 말고도 시퀀스 등을 지원하고 있다. 천천히 SQL에 대하여 재미있는 예제와 함께 살펴 보게 될 것이다.
5. Mini SQL을 시작하기 전에... Mini SQL 을 시작하기 전에 우리는 반드시 해야 할 일이 있다. 바로 데이터 베이스 관리 시스템을 메모리에 상주 시키는 것이다. 메모리에 잘 살고 있는지 아닌지를 알고 싶다면 다음과 같이 입력을 해서 확인을 해 보면 된다.
지난 번 호를 읽은 독자라면 아마도 유닉스가 부팅이 되면서 바로 Mini SQL 데몬이 서버의 환경 정보를 보여 주면서 메모리에 잘 상주하고 있을 것이다. 혹시 모르니 다시 한번 확인해 보기 바란다. 만약 지금 Mini SQL이 메모리에 살고 있지 않다면, Mini SQL 홈 디렉토리의 bin 디렉토리에서 다음의 명령을 입력하여 메모리에 상주시켜야 한다.
대부분의 데이터베이스 관리 시스템은 운영체계가 시작되면서, 함께 메모리에 상주되어 특정 포트를 점유하여 다른 호스트나 클라이언트의 요청에 귀를 기울일 수 있게 되어 있다. 따라서 이렇게 상주시킨 데이터 베이스 관리 시스템은 하나의 서버에서만 실행을 하여도 여러 사람들이 서로 같은 데이터베이스나 각자의 사용 용도에 따라서 정의되어 구축되어 있는 다른 데이터베이스를 사용할 수 있는 것이다. 만약 여러분들이 학교 연구실이나 네트워크에 항상 연결이 되어 있다면, Mini SQL을 특정 컴퓨터에 설치하여 그 컴퓨터를 Server로 사용하여 실습해 볼 수 있을 것이다. 데이터베이스를 만들려면, 먼저 데이터베이스를 만들어야 하고 다음에 SQL문을 입력하여 데이터 구조를 정의한 다음에 SQL 문을 이용하여 데이터를 입력하게 된다. * msqladmin으로 먼저 데이터베이스를 만든다. 이 명령어는 로컬 호스트에 있는 mSQL DBMS에 empdb라는 데이터 베이스를 생성하도록 한다. -h 옵션은 나중에 데이터베이스 유틸리티를 설명할때, 자세하게 하겠지만, 호스트 이름이나 IP을 요구한다.
* mSQL Monitor 프로그램을 이용하여 데이터베이스
구조를 정의한다.
이 명령어는 로컬 호스트에서 empdb 데이터베이스에 SQL 문을 입력하겠음을 의미하고 <그림8>과 같은 상태가 되는데 이 상태는 SQL문을 입력하도록 요구하는 프롬프트로 사용자는 SQL문을 이용하여 데이터베이스 구조를 정의하고 데이터를 입력할 수도 있으며, 데이터베이스에서 특정 필드를 검색하거나 삭제할 수 있다.
6. Mini SQL에서 SQL 사용하기 자 본격적으로 데이터베이스 관리 시스템에 접근하는 방법을 하도록 하자. 지금 msql이라는 Monitor 프로그램이 실행 중일 것이다. 이제는 데이터베이스 관리 시스템에 SQL명령을 내려서 데이터베이스를 만들고, 데이터들에 대한 연산들을 연습해 보도록 하자. * Create 문
다음은 mSQL에서 지원되고 있는 데이터 타입이다. 최근에 들면서 date, money, uint 그리고 주목할 만한 것이 바로 text 형이 추가되었다는 것이다.
mSQL에서는 8가지의 데이터 타입을 지원하고 있으나, 우리에게 적합하지 않은 데이터 형은 date 형으로 영문으로 달을 출력하도록 되어 있어서 불편한 점이 있다. 필자는 날자 데이터를 입력 받을 때 date형을 사용하지 않고, char형으로 정의하여 사용하고 있다. 이 부분은 나중에 서버의 소스를 직접 보면서 이해하게 될 것이다. 예제를 통하여 보다 확실하게 생각해 보자. 다음의 명령문은 empdb에 empdetail이라는 테이블을 만드는 것을 보여 주고 있다.
이렇게 입력이 되면, empdb내에 다음과 같은 형식의 테이블이 생성된다. 그리고 데이터 형 뒤에 "not null" 이라는 것은 first_name과 lasr_name의 필드는 반드시 입력이 되어야 된다는 말이다. 즉, 널(Null) 값을 받아 들일 수 없다는 것을 말한다. 이런 키워드가 없는 필드는, 입력하지 않아도 되는 Null 값 될 수 있다는 것이 된다.
다음은 하나의 테이블 내에 유일하게 구분되는 주키(Primary Key)를 설정해야 한다. 테이블 내에서 유일하게 구분되는 데이터 필드는 emp_id이므로 이 컬럼을 UNIQUE INDEX로 만든다. CREATE UNIQUE INDEX idx1 ON emp_details (emp_id) /g
<그림9>에서 인덱스를 생성하는 것을 보여 주고 있는데 약간의 형태를 달리하고 있음을 양해하기 바란다. 이렇게 해서 인덱스 하나가 만들어 지고, 다음에는 또 다른 인덱스를 만들 수 있는데 같은 데이터 형과 길이를 가지고 있을 때에는 함께 사용되어져 다중 인덱스를 만들 수 있다. 인덱스를 만드는 이유는 주키인 경우에 UNIQUE 키워드와 함께 사용하여 만들게 되고, 자주 사용되리라 예상되는 다른 데이터 형도 보다 빠르게 검색할 필요성이 있을 경우에 INDEX를 만들게 된다. CREATE INDEX idx2 ON emp_details (first_name, last_name) /g first_name과 last_name을 가지는 인덱스를 하나의 테이블에 정의한다. 다음은 test 라는 데이터 베이스에 순서 번호를 만드는 것이다. CREATE SEQUENCE ON test STEP 1 VALUE 5 /g 순서 번호(sequence)는 1씩 증가하며, 기본 값이 5로 정의한다. 순서 번호는 다음과 같이 _seq라는 데이터베이스 시스템 변수를 검색 명령(SELECT)으로 쿼리를 줄때 5부터 시작하여 1씩 증가하게 된다. SELECT _seq FROM test /g 이 명령어를 입력하게 되면, 5라는 값을 반환하고, 다음에 test라는 테이블을 접근하게 되면, 6으로 1이 증가된 값을 반환한다. * Drop 문
DROP INDEX idx1 FROM emp_details /g DROP SEQUENCE FROM emp_details /g
DROP TABLE emp_details /g * Insert 문
INTO 이하의 절에는 테이블 이름이 올 수 있고, 특정 필드에만 값을 저장하기 위하여서는 해당 필드의 필드 명을 따로 정의해 주고 VALUE이하의 절에서는 각각의 필드의 데이터 형에 맞는 데이터 값을 입력해야 한다. 만약에 테이블 명만 지정할 경우에는 테이블의 데이터 구조를 정의해 준 순서로 VALUE 이하의 절에 값들을 정의해 주어야 한다. 예제를 통하여 한번 알아 보도록 하자.
INSERT INTO emp_details ( first_name, last_name,
dept, salary) 다음은 emp_details 테이블에 first_name과 last_name, depr, salary 필드를 지정하고 이들의 필드에 대한 값들만 삽입하게 된다. INSERT INTO emp_details 같은 기능을 수행하고, 특정한 필드를 지정해 주지 않으면, 정의된 순서대로 입력이 된다. * Select 문
Select 구문에서는 From 이하의 절에서 여러 개의 테이블 이름을 갖을 수 있고, where 구문에서는 값을 비교할 수 있는 연산자를 쓸 수 있으며, AND 나 OR로 조건들을 논리적으로 연산할 수 있다. ORDER BY는 테이블의 필드에 대하여 오름차순 혹은 내림차순으로 정렬이 가능한데 기본적으로 오름차순으로 정렬을 하지만, 내림차순으로 정렬을 하고 싶다면, select구문의 맨 뒤에 DESC 예약어를 써 주어야 한다. OPERATOR에는 < , >, =, <=, >=, <>, LIKE, RLIKE, CLIKE, SLIKE 등이 있는데, LIKE 예약어는 일반적인 예약어로 한글로 구지 표현하자면, 정규식 연산자라고 할 수 있는데 검색시에 아주 필요한 것으로 mSQL에는 4가지를 지원한다.
정규식 표현 연산자는 각각의 연산자에 대하여 지원하는 문법이 있다. 문자열 매칭을 위하여 mSQL에서 약간은 자랑스러운 면을 보여 주고 있다. LIKE와 CLIKE는 ANSI SQL에 명시되어 있는 대로 지원이 되고 있고, 특정 문자열이나 문자들을 매칭할 수 있는 연산자이다. 다음은 LIKE와 CLIKE에서 사용될 수 있는 문자열 매칭 연산자들이다.
필자는 위의 모든 것을 모두 테스트 해보았으며, mSQL에는 약간의 언어 지원에 대한 문제가 있다는 것을 알 수 있었다. mSQL은 역시 외국에서 만들어 졌다는 것을 감안해야만 한다. _(밑줄 연산자)는 하나의 영문자와 숫자만을 검색의 대상으로 한다는 것이다. 즉 우리나라 한글의 한글자는 검색이 되어 질 수 없다. 따라서 우리의 2bytes 한글을 검색하기 위하여서는 반드시 '%' 연산자를 LIKE나 CLIKE와 함께 사용해야 된다. 이것은 RLIKE나 SLIKE에도 마찬가지이다. RLIKE는 보다 더 정교한 검색을 지원한다. LIKE나 CLIKE로 쿼리를 입력을 했을때 원하는 데이터를 얻지 못할 경우에 RLIKE를 사용하면 원하는 검색 결과를 얻을 수 있을 것이다. 대신 그만큼의 속도가 느려진다는 사실을 알아야 한다. RLIKE의 정교한 검색을 지원하기 위하여 따로 연산자를 필요로 하게 되었다. 다음의 표는 RLIKE에서 사용이 가능한 연산자 들이다. 이러한 연산자들을 연습하기 위해서는 여러 가지 다양한 데이터가 데이터베이스 테이블에 입력되어져 있어야 된다. RLIKE에 대하여서는 다음 시간에 좀 더 다루기로 한다. SLIKE는 Phonetic은 "음성의" 라는 뜻을 가진다. 이것은 말 그대로 영문이나 한글이나 모두 발음과 쓰는 표기법과의 차이를 없애기 위하여 만들어진 문자열 검색 예약어로 역시 우리나라 한글에 대한 발음과 표기법은 지원하지 않지만, 영문에 대해서 지원하고 있다. 만약에 'Hughes' 라는 사람을 찾고 싶을 때 스펠링을 확실히 모를 경우 SLIKE를 이용하여 'Hues' 라는 사람을 찾으라는 쿼리를 입력하여도 비슷한 발음을 갖는 모든 사람을 찾을 수 있다. 다음은 여러 가지 Select구문으로 예제를 통하여 select구문을 익혀 보자. 간단하게 쿼리를 보고 어떤 의미로 사용이 될 것인지를 알아 낼 수 있는 능력이 된다면, SQL은 거의 모든 것을 이해했다고 할 수 있다. SELECT first_name, last_name FROM emp_details 이 문장은 emp_details 테이블에서 first_name과 last_name 필드를 모두 출력하는 문장으로 where 절이 없으므로 전체 데이터를 출력한다. SELECT first_name, last_name FROM emp_details
emp_details 테이블에서 dept가 finance인 노동자를 last_name과 first_name 순으로 first_name 그리고 last_name 을 출력한다. SELECT DISTINCT first_name, last_name
FROM emp_details emp_details 테이블에서 dept가 finance인 노동자를 last_name과 first_name 순으로 first_name 그리고 last_name을 중복이 없이 출력한다. 여기서 중복이 없다는 말은 한 직장에 김경호라는 간부가 우연히 같은 부서에서 일을 하고 있다면, DISTINCT 예약어를 쓰지 않는다면, 김경호라는 이름은 두번 출력이 되겠지만, 이 예약어를 사용하면, 오직 중복을 없앤 김경호라는 이름이 하나만 출력이 된다. SELECT first_name, last_name FROM emp_details
emp_details 테이블에서 dept가 finance인 노동자중 last_name이 ?ughes라는 사람의 first_name last_name 을 출력한다. 이때 Like에서 '_' 연산자가 사용 되었다. SELECT first_name, last_name FROM emp_details emp_details 테이블에서 dept가 finance인 노동자중 last_name이 Mc으로 시작하는 모든 사람의 first_name last_name 을 출력한다. 이때 Like에서 '%' 연산자가 사용 되었다. 다음은 관계형 쿼리 언어의 가장 강력한 기능중의 하나인 관계 조인에 대한 질의문이다. 여러 개의 데이터 베이스 테이블을 Merging을 하여 Merge된 데이터에서 특정한 레코드들을 축출하는 기능이다. SELECT emp_details.first_name, emp_details.last_name,
project_details.project project 테이블과 emp_details 테이블을 조인하여 emp_details 테이블의 emp_id가 project_details 테이블의 emp_id가 일치하는 사람들을 emp_details 테이블의 last_name와 first_name 순으로 정렬하여 근무자의 first_name, last_name, project을 출력한다. 여기서 테이블의 필드명을 C 언어에서 와 같이 dot 연산자로 묶어서 구조체처럼 사용되었다는 것에 주목해야 한다. 이렇게 사용하면, 다른 테이블의 필드를 참조하여 비교를 할 수 있다. * Delete 문
다음은 emp_details 테이블에서 '하늘' 이라는 이름이 중복되어 있어서 이를 제거하는 SQL 문이 실행되고 있는 것을 보여 준다.
DELETE FROM emp_details WHERE emp_id = 12345 : emp_details 테이블로부터 emp_id가 12345 사람을 제거한다. DELETE FROM emp_details WHERE salary > 20000 and salary < 30000 : emp_details 테이블로부터 salary가 20000이 넘고, salary가 30000보다 적은 봉급을 받는 사람들을 모두 제거한다. * Update 문
UPDATE emp_details SET salary=30000 WHERE emp_id = 1234 emp_details 테이블에 emp_id가 1234인 사람을 salary를 30000으로 봉급을 올려 주는 것이다. 관리자가 아무래도 봉급을 너무 적게 준다는 생각이 들었나 보다. UPDATE emp_details SET salary=35000, dept='Development' where emp_id = 1234 emp_details 테이블에 emp_id가 1234인 사람을 salary를 30000으로 봉급을 올려 주고 그 사람의 소속(dept)를 'Development'로 바꾸어 주는 것이다. 관리자가 아무래도 봉급을 너무 적게 준다는 생각이 들었나 보다.
7. Mini SQL Utilities 전에 모든 데이터 베이스 관리 시스템에는 대부분의 데이터 베이스 관리자나 개발자를 위한 유용한 툴이 존재한다. 이를 데이터베이스 유틸리티라고 하는데 Mini SQL에서도 마찬가지로 이러한 데이터 베이스 잘 관리하기 위한 유틸리티를 지원하고 있다. 그러나 여전히 텍스트 방식에 그치고 있어서 안타깝다. 보다 질 좋은 인터페이스가 개발되어져야 한다. 이 부분에 대하여서는 솔직히 mSQL 개발자에게 불만이 많다. 직접 제작하는 것이 훨씬 더 편리한 것이 사실이기 때문이다. 우리는 이미 시스템 유틸리티 중의 하나인 msql 이라는 Monitor 프로그램을 접해 보았다. 아마 여러분은 SQL을 연습하기 위하여 데이터 베이스를 한 개 이상을 만들었으며, 이때 msqladmin이라는 데이터베이스 유틸리티를 사용했다. 여기서는 좀 더 깊게 유틸리티를 어떻게 사용해야 하는지에 대하여 언급하기로 한다. * msqladmin msqladmin -h host -f configfile -q Command -h host 옵션은 다른 유틸리티 프로그램에서도 모두 같이 적용이 되는 옵션 중에 하나로 host는 mSQL 데이터베이스 서버가 실행 중에 있는 서버의 IP나 호스트 전체 이름이고, -h 옵션을 사용하지 않으면 null 값으로 인정하여 localhost 가 자동적으로 지정된다. -f configfile 옵션은 다른 유틸리티 프로그램에서도 모두 같이 적용이 되는 옵션 중에 하나로 mSQL의 다중 환경 설정 파일을 읽어서 작업을 할 수 있다. 즉 msql.conf 파일에 설정이 되어 있는 서버의 환경이 원하는 작업과 관련이 적다면, 다시 새로운 설정 파일을 만들어서 configfile에 지정해 주면 된다. -q 옵션은 msqladmin 프로그램 동작은 조용하게 만들어 주는 역할을 하는데 문제가 발생했을때 위험하므로 이 옵션은 사용하지 않는 것이 좋다. Command 옵션은 다음과 같은 것들이 존재한다. command는 관리자나 프로그래머가 다루어야 하는 성격의 명령어가 있다.
여러 가지 유용한 기능들이 추가된 것을 쉽게 알 수 있을 것이다. 유틸리티 사용하는 것은 여러분들의 몫으로 남겨 둔다. * msql msql
-h host -f configfile database 동일한 옵션은 msqladmin과 같고, msql은 반드시 database를 지정해서 지정된 데이터베이스의 존재 여부를 알아낸 후에 사용자로 하여금 데이터베이스내의 모든 테이블에 대하여 SQL 연산을 할 수 있도록 환경을 만들어 준다.
* relshow relshow -h host -f configfile database 그러나 데이터베이스 명을 지정해 주면 해당 데이터 베이스의 구조를 보여 준다. 여러분들도 본인이 만든 데이터 베이스의 구조를 보고 싶다면, relshow 유틸리티를 사용하여 쉽게 볼 수 있을 것이다. * msqldump msqldump -h host -f configfile -c -v database or table -c 옵션은 데이터
베이스나 테이블의 입력된 SQL을 보여 줄때 INSERT명령에 필드 명을
추가하여 보여 준다.
다음의 데이터베이스 유틸리티는 최근에 추가가 된 아주 유용한 유틸리티로, 데이터베이스에 입력이나 데이터베이스 구조를 얻고 백업을 하는데 유용한 유틸리티들이다. * msqlexport msqlexport -h host -f configfile -v database table 다음은 msqlexport를 실행한 것을 보여 주고 있다. 다음과 같은 명령을 입력하면, 아마도 쉽게 데이터들을 보관할 수 있을 것이다. msqlexport empdb emp_details > emp_details.export
* msqlimport msqlimport -h host -f configfile -v database table 다음은 msqlimport의 강력한 면을 보여 주고 있는데 많은 데이터라면, 다음과 같은 텍스트 파일로 만들어 주는 프로그램을 만들어서, msqlimport 프로그램을 이용하면 좋을 것 같다. SQL문을 입력하는 것에 지쳤다면, 해 볼만한 일이다. 다음은 emp_details 테이블에 데이터 입력을 위하여 vi 에디터로 편집하여 emp_details.import 파일로 저장하고 다음과 같은 명령으로 입력을 하도록 한 것이다. 아마도 이러한 방법이 쉽게 데이터 베이스에 데이터를 빨리 채울 수 있을 것이라고 생각한다.
imformix나 다른 관계형 데이터 베이스는 이러한 대량의 입력을 위하여 사용자에게 쉽게 입력을 할 수 있는 방법을 제공하고 있지만, 아직 mSQL은 그런 것은 지원되고 있지 않다. 에러가 발생한 레코드는 입력되지 않고 계속 다음 데이터 레코드로 진행한다.
7. 맺음말 Mini SQL의 말 그대로 '작은' (Mini) SQL 문들과 Mini SQL 데이터 베이스 관리 시스템에서 지원하고 있는 유틸리티들을 살펴 보고 기본적인 데이터 베이스도 함께 만들어 보았다. 이번 시간에는 원고 마감 시간을 지키지 못해, 좀 더 자세한 것들을 하지 못해 아쉽기만 하다. 하지만 다음 번 시간까지 여러분들은 필자 보다도 더 많이 SQL문을 사용해서 익숙해 졌으면 하는 바램이다. 학교에서 DBMS 수업이 있는 학교가 있을 것으로 생각이 든다. SQL은 대부분 비슷하므로 많은 도움이 되었으면 좋겠다. 다음 호에서는 보다 더 실제적으로 웹에 접근하는 것으로 해보도록 할 것이다. 점점 더 흥미가 있는 주제를 가지고 다시 만날 것을 약속하면서 여기서 글을 마친다. 참고문헌 및 추천 도서 김경호(zesus@edunet.nmc.nm.kr) |