Programming - cpueblo.com

MYSQL 프로그램 설명,강좌, C, SQL


글쓴이 : 유광희 날짜 : 2006-12-05 (화) 14:28 조회 : 19457
 제  목:[강좌]mysql강좌[1] 기본개념과 설치              관련자료:없음  [120]
 보낸이:박순행  (soonhg  )  1998-04-05 13:52  조회:2581

          -----------------------------
          -----------------------------
          ------  MySQL 강좌 #1 -------
          -----------------------------
          -----------------------------

-- 작성자 : 박순행
-- 작성일 : 1998.4.2
-- hitel  : soonhg
-- 천리안 : soonhg
-- 유니텔 : soonhg
-- E-mail : soonhg@chollian.net

<< 서론 >>
 한글로 번역되어 있는 MySQL에 대한 문서가 없더군요.
그래서 저처럼 고생하지 말고 쉽게 MySQL을 접할수 있도록
제가 간단하게나마 사용법을 설명서를 만들었습니다.
 계속해서 MySQL에 대한 내용을 정리해 나갈 생각이며 많은
사람들이 사용을 해 보았으면 합니다. Msql, PostgreSQL은 자료가
많으나 이 MySQL 은 한글 자료가 없어 고생하신 분들은 제가 사용해
분 경험이 도움이 되기를 기원합니다. 계속적으로 이 DB를 사용해보고
사용담을 올리도록 하겠습니다....
많은 사람들에게 도움이 되었으면 합니다.....



        #######################################
        #                                     #
        #     MySQL 기본 설명 및 설치하기     #
        #                                     #
        #######################################

  ■ MySQL 은 무엇인가
 MySQL은 관계형 데이타베이스이다. 이것은 공개용 데이타베이스로서
일반 상용 데이타 베이스와 비교하여 크게 뒤질것이 없는 매우 뛰어
난 관계형 데이타베이스이다. 물론 안정성 및 무결설의 측면에서 다
른 상용 데이타베이스에 비하여 떨어진다는 것은 인정한다. 하지만
매우 안정적이라고 할수 있다. 관리만 잘 한다면 매우 잘 사용할수
있으며 다른 데이타베이스에 비하여 보안이나, 각종 함수도 많아서
프로그램에 용이하다.
 공개용 데이타 베이스로는 mSQL,PostgreSQL,MySQL 등이 있는데 그중
전세계적으로 볼때 MySQL이 많이 애용되고 있다고 할수 있다. 그리나
우리나라에서는 아직 이용도가 미미하다.
 PHP와도 연결이 용이하고 각종 공개용 웹서버와 연결도 간편하다.
C, C++, Java, Python, TCK/TK, 그리고 ODBC 도 제공이 된다. ODBC는
windows3.1, win95, NT 용 모두 제공이 되고 있다.
 Access 와 자료를 연동할수 있으며 Excel 은 물론 Delphi(델파이)와
는 DBE 3.2를 사용하여 데이타 연동이 가능하며 C++ Builder 와는 
DBE 3.0을 통하여 사용 가능하다.
 이 MySQL을 상업적으로 사용할 경우 DB 개발자 들에게 약간의 개발
후원금을 제공하면 제품에 포함하여 개발된 프로그램과 함께 판매도
할 수 있으며 개인적인 용도로만 사용한다면 무료로 사용할 수 있다.

  ■ MySQL 의 공식사이트
http://www.tcx.se/                : Mysql 공식 홈페이지
http://www.kreonet.re.kr/mysql/        : 한국의 공식 미러링사이트
ftp://korenet.re.kr/pub/packages/db/mysql/ : ftp 사이트(한국)


  ■ MySQL 의 현재 최신 버전
MySQL은 현재 계속적으로 업그레이드가 이루어 지고 있다. 1998년
4월 현재로서 가장 높은 버전은 MySQL 3.21.27-gamma 이고, 
3.21.28-gamma 가 개발되어 있으나 아직 배포되지는 않고 있다.
곧 배포가 이루어지리라고 생각이 되어진다.


  ■ MySQL 설치 가능 OS
 MySQL의 설치는 매우 간단하다. 공식 사이트로 가서 소스를 가지고
온후 컴파일을 하여 설치하여도 되고, 또는 컴파일된 실행 파일을
가지고 와서 실행하여도 무방하다.
 현재 MySQL은 각종 OS에서 설치되고 실행될수 있다. 실행 가능한
OS와 패키지는 다음과 같다.

     Solaris 2.5 & 2.6 with native threads. 
     SunOS 4.x with the included MIT threads package. 
     BSDI 2.x with the included MIT threads package. 
     BSDI 3.0 and 3.1 native threads. 
     SGI IRIX 6.x with native threads. 
     AIX 4.x whith native threads. 
     DEC UNIX 4.x with native threads. 
     Linux 2.0+ with LinuxThreads 0.5, 0.6 and 0.7. 
     FreeBSD 2.x with the included MIT threads package. 
     FreeBSD 3.x with native threads. 
     SCO OpenServer with a recent port of the FSU-threads package. 
     NetBSD 1.3 Intel and NetBSD 1.3 Alpha. 
     Openbsd 2.1 
     HPUX 10.20 with the included MIT threads package. 
     Win95 and NT. This version is currently only available for
          users with a MySQL license or MySQL email support. 


  ■ MySQL 을 설치할 경우 필요한 것
MySQL 을 설치할 경우 필요한 것이 있다. 그것은 다음과 같다.

 - 압축되어진 배포판을 풀기위한 GNU gzip 프로그램
 - tar 프로그램
 - ANSI C++ 컴파일러. 
 - gcc 컴파일러 : 버전은 2.7 이상인것


  ■ MySQL 의 설치방법
다음과 같은 술서로 MySQL을 설치한다.

1. 공식 홈페이지에서 MySQL을 받는다.
2. root 아이디로 아래의 모든 작업을 한다.
3. 다음의 명령으로 압축을 푼다.
        gzip mysql-VERSION.tar.gz
  여기서 mysql-VERSION.tar.gz 은 방금 받은 압축파일의 이름이다.
4. tar 명령을 이용하여 묶여있는 소스를 다시 풀어야 한다.
  이경우 mysql-VERSION 이라는 디렉토리가 생성되면서 그 안에 모든
  소스와 파일이 풀리게 된다.
        tar -xvf mysql-VERSION.tar
5. 생성된 디렉토리로 이동한다.
        cd mysql-VERSION
6. 환경을 설정한다. 만일 어떤 옵션을 추가하기를 원한다면 다음과 같아 한다.
        ./Configure --help
   이 경우 각종 옵션이 나오므로 이 내용을 보고 변경하기 바란다. 더 자세한
   사항은 영문 메뉴얼을 읽어 보기 바란다.
   일반적으로 그냥 아래의 명령을 실행하면 된다.
        ./Configure
7. 6항의 실행이 끝나면 다음의 명령을 실행한다.
        make
   이 명령에서는 모든 내용이 컴파일 된다. 486-66에서 메모리 8메가인 
   장비에서 컴파일을 하였더니, 15시간이 걸렸다. 장비가 좋고 메모리가 
   더욱 많다면 2~3시간 이내에 컴파일 되리라고 생각이 된다.
8. 7항의 작업이 끝나면 이제 컴파일된 실행파일을 인스톨 하여야 한다.
        make install
   컴파일된 모든 실행 가능한 파일이 설치가 되고 환경이 설정된다.
9. 설치가 끝난후 아래의 명령을 실행하여 기초 테이블과 admin 유저를 설치
   한다. 이 명령은 단한번한 하는 것으로서 두번 실행하면 않된다. 현재 8항에서
   작업한후 디렉토리를 변경하지 않고 아래의 명령을 입력한다.
        ./scripts/mysql_install_db
   이 것은 스크립트로서 실행하여 기초작업을 한후 MySQL을 실행시켜 준다.
10. 설치 디렉토리를 디폴트로 하였다면 /usr/local/bin/ 디렉토리에 실행파일이
    모두 설치되었을 것이다. 디폴트로 설치하였다고 가정하고 다음의 명령을 수행
    하여 본다.
        /usr/local/bin/mysqladmin version
    MySQL 버전 정보가 아래와 비슷하게 출력될 것이다.

mysqladmin  Ver 6.8 Distrib 3.21.27-gamma, for unknown-freebsd2.2.1 on i386
TCX Datakonsult AB, by Monty

Server version          3.21.27-gamma-log
Protocol version        10
Connection              localhost via TCP/IP
TCP port                3306
Uptime:                 22 hours 20 min 9 sec

Running threads:1 Questions: 20  Opened_tables: 8  Reloads: 2  Open tables: 4
  
11. 이제 mysql 프로그램을 아래와 같이 실행하여 기본적인 동작을 테스트하자.
        mysql mysql
   혹은 mysql -u root mysql (실행시키는 유저가 root가 아닐경우)
12. 아래의 sql문장을 mysql 상에서 수행시켜보자
        select * from user
    mysql 의 사용방법은 mysql이 실행된 상태에서 다음의 명령을 주면 알수 있다.
        \\h
    각종 명령을 잘 읽어 보고 사용하면 된다. SQL문도 표준 SQL을 모두 지원하며
    MySQL만의 확장 SQL문을 알고 싶다면 영문 메뉴얼을 참조하라.(나중에 다시 강
    의할 예정)

  ■ MySQL Server의 실행과 종료
MySQL Server을 실행 시키거나 종료시키려면 다음의 명령을 root 가 사용하면 된다.
        mysql.server start        --> mysql Server의 시작
        mysql.server stop        --> mysql Server의 종료
MySQL Server가 실행시 두개의 프로세서가 실행되므로 확인해 보기 바란다.
        < 실행중인 두개의 프로세서 >
        /usr/local/bin/safe_mysqld
        /usr/local/libexec/mysqld

<< 결론 >>
 다음 강좌에서는 MySQL에 관련된 실행 파일과 기본적인 sql문에 대하여 강의
하도록 하겠습니다. 많은 사람들에게 도움이 되었으면 합니다. 제  목:[강좌]mysql강좌[2]mysql프로그램설명             관련자료:없음  [122]
 보낸이:박순행  (soonhg  )  1998-04-11 23:40  조회:1703

          -----------------------------
          -----------------------------
          ------  MySQL 강좌 #2 -------
          -----------------------------
          -----------------------------

-- 작성자 : 박순행
-- 작성일 : 1998.4.11
-- hitel  : soonhg
-- 천리안 : soonhg
-- 유니텔 : soonhg
-- E-mail : soonhg@chollian.net

<< 서론 >>
 이번에는 MySQL 에 관련된 프로그램과 기본 설치시 함께 설치되는
유틸리티에 대하여 알아보도록 하겠습니다. 기본 동작에 대한 예제도
약간 포함하고 나중에 좀더 자세한 사항을 담아서 다시 올리지요.
많은 사람들에게 도움이 되었으면 합니다.....


        #######################################
        #                                     #
        #     MySQL 에 관련된 프로그램 및     #
        #             유틸리티                #
        #                                     #
        #######################################

■ mysql 
  sql 문장을 수행하는 터미날이다.  대화식 사용과 비대화식 질문을 지원한다.
  sql문을 라인 에디터 상태에서 바로작성하여 실행하면 된다.
  사용법은 mysql mysql 하면 바로 사용할수 있다.(root 계정일 경우)
  일반 계정 사용자는 mysql -u root mysql 하면된다. (암호가 없을경우)
  mysql 에 대한 사용법은 mysql 실행상태에서 help 라고 치면 출력된다.

■ mysqlaccess 
  호스트와 사용자 데이타베이스의 연결에 대한 특권을 체크하는 스크립트이다.

■ mysqladmin 
  MySQL 의 관리용 유틸리티이다. 데이타베이스의 생성,제거, reload, 그리고
  refresh 등을 한다. 또한 MySQL서버로 부터 상태정보와 진행상태, 정보등을 준다.

■ mysqld 
  MySQL 의 서버 데몬이다. 이것이 항상 실행되고 있어야만 MySQL 데이타베이스를
  사용할수 있다.

■ mysqldump 
  MySQL 데이타비에스를 읽어서 파일로 저장한다. 
  SQL 문장 또는 탭으로 분리된 텍스트 파일로 저장한다.

■ mysqlimport 
  하나 또는 더많은 텍스트 파일을 개별적인 테이블로 입력(저장)한다.
  LOAD DATA INFILE 에 의해 지원되는 모든 형시을 사용할수 있다.

■ mysqlshow 
  데이타베이스와, 테이블, column, 그리고 Index 에 대한 정보를 보여 준다.

■ mysqlbug 
  이것은 스크립트로서 MySQL버그 보고서를 사용할때 항상 사용되어지는 것이다.

■ mysql_install_db 
  디폴트 특권을 사용하여 테이블의 허가를 생성시키는 스크립트이다.
  MySQL을 시스템에 처음 설치하였을 경우 MySQL을 실행하기 이전에 실행시키는
  것으로서 이것은 설치후 딱 한번만 실행하는 스크립트이다.

■ isamchk 
  MySQL 테이블을 체크하거나, optimise, 또는 이상상태를 수정할때 사용한다.

■ make_binary_release 
  컴파일된 MySQL의 binary 릴리즈 버전을 만든다.
  다른 MySQL 사용자의 편이를 위하여 컴파일된 실행버전을 만들때 사용된다.

■ msql2mysql 
  shell 스크립트로서 mSQL 프로그램을 MySQL로 변환한다.
  모든것을 변환하지는 않지만 변환하기에 좋은 상태로 만들어준다.

■ replace 
  msql2mysql 에 사용되는 실행파일이다.
  문자열을 파일, 표준입력, 또는 어떤 특정 상태로 변환하는 프로그램이다.
  문자열을 교환할때도 사용할수 있다.
  예를들면 a b b a (파일상의 a 와 b 를 교환)

■ safe_mysqld 
  어떠한 안정된 형태로 MySQL 데몬을 시작시킨다.
  오류시 재시작 시키고, 실행정보 log 를 log 파일에 기록한다.


-----------------------------------------------------------------------
-----------------------  MySQL 강좌 #2 END ----------------------------
-----------------------------------------------------------------------
 제  목:[강좌]mysql강좌[3]SQL 문 정리                   관련자료:없음  [123]
 보낸이:박순행  (soonhg  )  1998-04-11 23:41  조회:1669

          -----------------------------
          -----------------------------
          ------  MySQL 강좌 #3 -------
          -----------------------------
          -----------------------------

-- 작성자 : 박순행
-- 작성일 : 1998.4.11
-- hitel  : soonhg
-- 천리안 : soonhg
-- 유니텔 : soonhg
-- E-mail : soonhg@chollian.net

<< 서론 >>
sql 문은 데이타베이스 질의에 사용되는 대화형 언어입니다.
MySQL도 역시 이 표준 대화형 언어를 지원하고 있으며,
더욱 확장된 각종 sql문을 내포하고 있습니다.. 간단하게 나마
제가 MySQL에 대하여 MySQL문상의 내용을 번역하였습니다.

많은 사람들에게 도움이 되었으면 합니다.....



        #######################################
        #                                     #
        #     MySQL 에서 사용되는 sql문 정리  #
        #                                     #
        #######################################



■ CREATE DATABASE database_name (데이타베이스이름)
  데이타 베이스 이름은 문자와 숫자, '_'  를 포함하는 32 byte 이내로 
  작성한다. 이 명령은 새로운 데이타베이스 공간을 생성시킨다. Oracle로 
  말하자면 tablespace와 같은 테이블이 들어가는 저장 공간을 말한다.

■ DROP DATABASE database_name
  존재하는 데이타베이스를 제거한다. 데이타베이스 상에 존재하는 테이블도
  모두 삭제 되므로 매우 조심하여 작업하여야 한다. 한번 삭제되면 복구는 
  불가능 하므로 데이타 베이스 상의 테이블과 데이타가 모두 백업이 되었는
  지 확인하고 작업한다.

■ CREATE TABLE table_name ( create_definition,... )
  데이타베이스 상에 테이블을 생성시키는 명령이다. 자세한 옵션은 다음과 
  같다. Oracle 의 table 생성 명령과 거의 유사하며 부가적인 type 이 존재한다.

create_definition:
  column_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
                   [ PRIMARY KEY ] [reference_definition]
  or  PRIMARY KEY ( index_column_name,... )
  or  KEY [index_name] KEY( index_column_name,...)
  or  INDEX [index_name] ( index_column_name,...)
  or  UNIQUE [index_name] ( index_column_name,...)
  or  FOREIGN KEY index_name ( index_column_name,...) [reference_definition]
  or  CHECK (expr)

type:
        TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  or    INT[(length)] [UNSIGNED] [ZEROFILL]
  or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    DECIMAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    NUMERIC[(length,decimals)] [UNSIGNED] [ZEROFILL]
  or    CHAR(length) [BINARY],
  or    VARCHAR(length) [BINARY],
  or    DATE
  or    TIME
  or    TIMESTAMP
  or    DATETIME
  or    TINYBLOB
  or    BLOB
  or    MEDIUMBLOB
  or    LONGBLOB
  or    TINYTEXT
  or    TEXT
  or    MEDIUMTEXT
  or    ENUM(value1,value2,value3...)
  or    SET(value1,value2,value3...)

index_column_name:
        column_name [ (length) ]

reference_definition:
        REFERENCES table_name [( index_column_name,...)]
                   [ MATCH FULL | MATCH PARTIAL]
                   [ ON DELETE reference_option]
                   [ ON UPDATE reference_option]

reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
  


■ ALTER [IGNORE] TABLE table_name alter_spec [, alter_spec ...]
  존재하는 테이블을 변경 및 columnd의 추가 작업시 사용된다.

alter_specification:
        ADD [COLUMN] create_definition
or      CHANGE [COLUMN] old_column_name create_definition
or      ALTER [COLUMN] column_name { SET DEFAULT literal | DROP DEFAULT }
or      ADD INDEX [index_name] ( index_column_name,...)
or      ADD UNIQUE [index_name] ( index_column_name,...)
or      DROP [COLUMN] column_name
or      DROP PRIMARY KEY
or      DROP INDEX key_name
or      RENAME AS new_table_name

■ DROP TABLE table_name [, table_name...]
  존재하는 테이블을 제거할 경우 사용되는 명령이다.

■ DELETE FROM table_name WHERE where_definition
  존재하는 테이블 상의 데이타를 삭제할때 사용하는 명령이다.


■ SELECT 문
  존재하는 테이블 상의 데이타를 조회할때 사용하는 명령이다.
  기본적인 사용법은 다음과 같다.

  SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... 
      [INTO OUTFILE 'file_name' ...]
  [ FROM table_references 
    [WHERE where_definition ] 
    [GROUP BY column,...]
    [HAVING where_definition]
    [ ORDER BY column [ASC | DESC] ,..] [LIMIT [offset,] rows]
    [PROCEDURE procedure_name]] 


■  JOIN 문
  Oracle 에서 사용하는 join 문보다 좀더 확장된 join 문을 지원한다.

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional-expr
table_reference LEFT [OUTER] JOIN table_reference USING (column-commalist)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional-expr }

■ INSERT 문
  존재하는 테이블에 데이타를 입력할때 사용한다.

        INSERT INTO table [ (column_name,...) ] VALUES (expression,...)
or      INSERT INTO table [ (column_name,...) ] SELECT ...



■ REPLACE 문
  이 문장은 INSERT문장과 거의 유사하게 동작한다. 같은 레코드가 있을경우
  이 레코드를 삭제한후 INSERT 작업을 한다. 같은 레코드가 없을 경우는 INSERT
  와 같이 동작한다.

        REPLACE INTO table [ (column_name,...) ] VALUES (expression,...)
or      REPLACE INTO table [ (column_name,...) ] SELECT ...

■ LOAD DATA INFILE 문
  Server 상에 위치하는 text 파일로 부터 데이타를 읽어서 테이블에 입력작업을
  할 경우 사용한다. 매우 속도가 빠르다.

  LOAD DATA INFILE 'text_file_name.text' [REPLACE | IGNORE]
      INTO TABLE table_name 
  [FIELDS [TERMINATED BY ',' [OPTIONALLY] ENCLOSED BY '"' ESCAPED BY '\\\\' ]]
  [LINES TERMINATED BY '\\n']
  [(Field1, Field2...)] 

  테이블로 부터 데이타를 읽어서 text 파일에 데이타를 저장할경우 다음과 같이
  사용한다.

  SELECT ... 
   INTO OUTFILE 'interval.txt' fields terminated by ','
   enclosed by '"' 
   escaped by '\\\\' lines terminated by '\\n'
  FROM ...

■ UPDATE 문
  테이블 상에 존재하는 데이타를 변경할 경우 사용한다.
  

UPDATE table SET column=expression,... WHERE where_definition

■ SHOW syntax. Get information about tables, columns...
  MySQL 상의 각종 정보를 보여준다. 데이타 베이스, 테이블, column등을
  확인할수 있다.
  
        SHOW DATABASES [LIKE wild]
or      SHOW TABLES [FROM database] [LIKE wild]
or      SHOW COLUMNS FROM table [FROM database] [LIKE wild]
or      SHOW INDEX FROM table [FROM database]
or      SHOW STATUS
or      SHOW VARIABLES [LIKE wild]

■ EXPLAIN syntax. Get information about a SELECT.
  select 문과 이때 요구되는 테이블에 대한 정보를 준다. 일반 select 문의
  처음에 EXPLAIN 을 추가하면 동작한다.

EXPLAIN SELECT select_options  

■ DESCRIBE syntax
   존재하는 테이블에서 column 정보를 가지고 온다.

(DESCRIBE | DESC) table [column] 

■ LOCK TABLES syntax
  테이블에 lock 을 설정하여 타인이 읽지 못하게 할때 사용한다.
  주의할 점은 한사람이 lock 을 실행하면 이 사람이 사용하는 모든 테이블이
  lock되므로 사용후 꼭 unlock를 사용하여 lock를 풀도록 한다.

LOCK TABLES table_name [AS alias] READ|WRITE [, table_name READ|WRITE]
...
UNLOCK TABLES

■  SET OPTION syntax.
  현재 사용중인 세션이 사용되는 동안 지속적으로 영향을 준다. 여러 옵션이
  있으므로 원본 메뉴얼을 참조하기 바란다.

SET [OPTION] SQL_VALUE_OPTION=value, ...

■  GRANT 문 ( 호환명령)
 이 명령을 사용하지는 않고 단지 호환성문제 때문에 MySQL 존재한다.
  이 명령은 다른 SQL 서버로 부터 MySQL로 쉽게 변환하기 위하여 만들졌다.
  MySQL 에서의 특권은 MySQL 허가 테이블을 이용하여 다루어 진다.
  섹션 6.2 의 특권 시스템 업무를 하는 방법을 참고 하라.

GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE,
REFERENCES (column list), USAGE))
ON table TO user,... [WITH GRANT OPTION]

■ CREATE INDEX 문 (호환명령)

 이 명령을 사용하지는 않고 단지 호환성문제 때문에 MySQL 존재한다.
  ALTER TABLE 을 사용하여 새로운 index 를 생성할수 있다.
  섹션 7.7 의 ALTER TABLE 의 문법을 보아라.
CREATE [UNIQUE] INDEX index_name ON table_name ( column_name,... ) 

■ DROP INDEX 문 (호환명령)
 이 명령은 항성 성공할 것이다. ALTER TABLE 을 사용하여 index 를 제거할수있다.
  섹션 7.7 의 ALTER TABLE 의 문법을 보아라.

DROP INDEX index_name

■ Comment 문법
  한줄의 주석은 # 로 하고 주석의 내용이 여러줄일 경우는   를 이용하여
  주석을 처리할수 있다.


■ CREATE FUNCTION 문법
  MySQL 의 기본 함수인 ABS(), constr() 처럼 새로운 사용자 정의 함수를 생성
  하는 함수이다. 사용자정의함수의 소스는 C, C++로 작성되어야 하고 동적으로
  읽혀지는것이 요구되어 진다. 예제로서 배포판에 보면 udf_example.cc 가 있
  고 5개의 새로운 사용자정의함수가 작성되어 있다.

CREATE FUNCTION  RETURNS [string|real|integer]
       SONAME 

DROP FUNCTION 



-----------------------------------------------------------------------
-----------------------  MySQL 강좌 #3 END ----------------------------
-----------------------------------------------------------------------
 제  목:[강좌]mysql강좌[4]C API 함수설명                관련자료:없음  [124]
 보낸이:박순행  (soonhg  )  1998-04-11 23:41  조회:1318

          -----------------------------
          -----------------------------
          ------  MySQL 강좌 #4 -------
          -----------------------------
          -----------------------------

-- 작성자 : 박순행
-- 작성일 : 1998.4.11
-- hitel  : soonhg
-- 천리안 : soonhg
-- 유니텔 : soonhg
-- E-mail : soonhg@chollian.net

<< 서론 >>
MySQL은 PHP와 함께 사용되는 경우가 매우 많습니다.
또 Perl 언어와 많이 사용되더군요. 하지만 저는 C 언어를 이용하여 
연결하려고 합니다. 그래서 C와 연결되는 API 쪽의 함수들을 정리해
보았습니다. 다음에는 MySQL 과 C API 를 이용한 프로그램 예제를 
간단히 정리해서 올리겠습니다.

많은 사람들에게 도움이 되었으면 합니다.....



        #######################################
        #                                     #
        #     MySQL 데이타 베이스와 C 와의    #
        #        연결을 위한 API설명          #
        #                                     #
        #######################################



<읽기전에 참고할 사항>
아래 내용에서 '데이타베이스(테이블스페이스)' 라고 한 것은 테이블들이
저장되는 공간을 말한다. 즉 테이블들이 저장되어지는 공간은 여러개로
나누어져 있는데, 그 공간을 MySQL에서는 데이타베이스 라고 하고 Oracle
에서는 테이블스페이스라고 한다. 이해를 돕기 위하여 두가지 표현을 모두
두었음.


int mysql_affected_rows(MYSQL *mysql) 
가장 최근의 UPDATE, DELETE, INSERT 되어진 row의 번호를 검색한다.

void mysql_close(MYSQL *mysql) 
MySQL 서버와의 연결을 종료한다.

MYSQL *mysql_connect(MYSQL *mysql, const char *host, 
                     const char *user, const char *passwd)
MySQL 서버로 연결시킨다.

int mysql_create_db(MYSQL *mysql, const char *db) 
데이타베이스(테이블스페이스)를 생성시킨다.

void mysql_data_seek(MYSQL_RES *res, uint offset) 
SQL 쿼리 결과 set 안에서 임의의 행을 찾는다.

int mysql_drop_db(MYSQL *mysql, const char *db) 
데이타베이스(테이블스페이스)를 제거한다.

int mysql_eof(MYSQL_RES *) 
마지막 row를 읽었는지를 체크하여 준다.

char *mysql_error(MYSQL *mysql)
마지막 MySQL 동작으로부터의 에러 메시지를 가져온다.

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *handle) 
테이블 필드에 존재하는  type 을 찾아낸다.
겸색결과없이 BLOB 의 길이를 쿼리할때 MySQL 은 디폴트 BLOB 길이를 되돌려준다.
이 길이는 테이블 상에서 select  동작시 8192 byte 이다.
한번 결과를 검색할때, column_object->max_length 는 특정한 쿼리에 대한 실제 
max_length 를 포함한다. 8192 byte 라는 크기가 선택되는 이유는 MySQL이 BLOB에
대한 최대 길이를 알지 못하기 때문이다. 이것은 언젠가는 가능하게 될것이다.

unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql) 
쿼리 결과 값 상의 모든 column 의 길이를 되돌려 준다.

MYSQL_ROW mysql_fetch_row(MYSQL_RES *mysql) 
쿼리 결과에서 다음 row를 fetch 한다.

void mysql_field_seek(MYSQL_RES *result, int field) 
특정한 column 위치로 이동한다.(쿼리 결과에 대하여)


void mysql_free_result(MYSQL_RES *result) 
쿼리결과가 저장되어 있던 메모리를 해제한다.

char *mysql_get_client_info(void) 
현재 client 라이브러리에 대한 버전 정보를 리턴한다.

char *mysql_get_host_info(MYSQL *mysql) 
호스트의 이름을 돌려준다.

int mysql_get_proto_info(MYSQL *mysql) 
연결에 사용된 프로토콜 버전을 리턴한다.

char *mysql_get_server_info(MYSQL *mysql) 
MySQL 서버의 버전 번호를 리턴한다.


int mysql_insert_id(MYSQL *mysql) 
AUTO_INCREMENT 필드에 의해 발생된 ID를 리턴한다.

MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) 
부합되는 데이타베이스 이름을 리턴한다.

MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table,
                             const char *wild)
부합되는 필드이름을 리턴한다.

MYSQL_RES *mysql_list_processes(MYSQL *mysql) 
현재 서버 프로세서의 목록을 가져온다.

MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) 
부합되는 테이블 이름을 리턴한다.

int mysql_num_fields(MYSQL_RES *result) 
조회결과 set 에서 column 의 수를 리턴한다.

int mysql_num_rows(MYSQL_RES *result) 
조회결과 set 에서 row의 수를 리턴한다.

int mysql_query(MYSQL *mysql, const char *query) 
SQL 쿼리를 실행한다.

int mysql_real_query(MYSQL *mysql, const char *query, uint length)
SQL 쿼리를 길이 정보와 함께 실행한다.

int mysql_reload(MYSQL *mysql) 
MySQL서버상에 사용자 특권 테이블을 다시 적재 시킨다.

int mysql_select_db(MYSQL *mysql, const char *db) 
특정 데이타베이스(테이블스페이스)와 연결한다.

int mysql_shutdown(MYSQL *mysql) 
MySQL 데이타 베이스 서버를 shutdown 한다.

char *mysql_stat(MYSQL *mysql) 
MySQL서버의 상태를 문자열로 리턴한다.

MYSQL_RES *mysql_store_result(MYSQL *mysql) 
결과 set 을 client 로 보내어 저장한다.

MYSQL_RES *mysql_use_result(MYSQL *mysql) 
각각의 row 에 대하여 동적 결과 set을 초기화한다.


-----------------------------------------------------------------------
-----------------------  MySQL 강좌 #4 END ----------------------------
-----------------------------------------------------------------------
 제  목:[강좌]mysql강좌[5]사용자등록,기본사용법         관련자료:없음  [125]
 보낸이:박순행  (soonhg  )  1998-04-22 02:57  조회:1563

          -----------------------------
          -----------------------------
          ------  MySQL 강좌 #5 -------
          -----------------------------
          -----------------------------

-- 작성자 : 박순행
-- 작성일 : 1998.4.23
-- hitel  : soonhg
-- 천리안 : soonhg
-- 유니텔 : soonhg
-- E-mail : soonhg@niceday.co.kr

<< 서론 >>
MySQL 설치를 한후 사용방법을 몰라 한참 자료를 찾았지요..
자료가 없어 고민하다가 MySQL 메일링 리스트에 올라오는
글들을 참고로 사용법을 알아내었지요.. 물론 영문 메뉴얼도 무척
도움이 되었답니다. 내용은 초기 인스톨후 root 사용자 암호 
설정방법과 DB사용자 등록및 권한설정, 데이타베이스 생성 방법,
기본 사용법 입니다.
많은 사람들에게 도움이 되었으면 합니다.....

        #######################################
        #                                     #
        #     MySQL 설치후 기본적인 사용법과  #
        #          root의 암호설정            #
        #                                     #
        #######################################


        1. MySQL 사용하기

    1.1 MySQL 서버 시작하기

 MySQL이 정상적으로 설치 되었다면 그리고 디폴트 옵션으로 설치
하였다면 /usr/local/bin/ 디렉토리에 관련 실행 파일이 설치 되었
을 것이다. 먼저 MySQL 서버를 실행하는 명령은 다음과 같다.
물론 root 아이디로 실행해야 한다.(다른방법이 있으면 알려주세요)

    mysql.server start

 위와 같이 입력하면 서버가 실행된다.  두개의 프로세서가 데몬상태로
실행되는데, safe_mysqld, mysqld 이렇게 두개이다.
이 두개의 프로세서가 실행되고 있다면 이제 MySQL을 사용할수 있다.
MySQL 두번째 강좌에서 보면 위의 두 프로그램에 대한 설명이 나와 있다.
이 상태에서 아래와 같이 MySQL을 사용할수 있는 가상 터미날을 실행시킨다.

    mysql -u root mysql

 MySQL이 처음 설치되면  DB admin user 는 root 이다. 몰론 이것은 변경
할수도 있다. 디폴트로 설치한 경우 암호가 처음에는 생성되어 있지 않으
므로 위와 같이 하면 실행이 된다. 위의 명령에 대한 설명은 다음과 같다.

  mysql       -u          root               mysql
 실행파일  유저선택     root db 유저     사용할데이타베이스

 그외 몇가지 간단한 옵션이 있으나 필요하면 mysql -h 하여 내용을 참고
하기 바란다. 그리고, root 유저에 암호를 설정한 후 부터는 -p 옵션을
하나더 추가하여 실행하기 바란다. 이 옵션은 패스워드를 입력받는 옵션이다.


    1.2 mysql 프로그램의 사용

  mysql을 실행하여 간단한 동작을 하여보자.
mysql은 일반 유저로 실행하여도 되는 프로그램이다. 

$ mysql -u root mysql                        ---> DB 사용을 위한 실행
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 3 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql> 

위와 같이 연결된다. 여기서 몇가지 간단한 테스트용 명령을 적는다.

mysql> show databases                  --> 데이타베이스 종류보기
    -> \\g
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)

mysql> show tables from mysql          --> mysql상의 테이블 정보 보기
    -> \\g
+-----------------+
| Tables in mysql |
+-----------------+
| db              |
| func            |
| host            |
| user            |
+-----------------+
4 rows in set (0.00 sec)

mysql> show columns from db            --> db table 칼럼정보 보기
    -> \\g
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| Host        | char(60)      |      | PRI |         |       |
| Db          | char(32)      |      | PRI |         |       |
| User        | char(16)      |      | PRI |         |       |
| Select_priv | enum('N','Y') |      |     | N       |       |
| Insert_priv | enum('N','Y') |      |     | N       |       |
| Update_priv | enum('N','Y') |      |     | N       |       |
| Delete_priv | enum('N','Y') |      |     | N       |       |
| Create_priv | enum('N','Y') |      |     | N       |       |
| Drop_priv   | enum('N','Y') |      |     | N       |       |
+-------------+---------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

mysql> show index from db              --> db table의 인덱스정보기
    -> \\g
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
 Collation | Cardinality | Sub_part |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| db    |          0 | Host     |            1 | Host        |
 A         |     4 |     NULL |
| db    |          0 | Host     |            2 | Db          |
 A         |     4 |     NULL |
| db    |          0 | Host     |            3 | User        |
 A         |     4 |     NULL |
| db    |          1 | User     |            1 | User        |
 A         |  NULL |     NULL |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
4 rows in set (0.00 sec)

mysql> show status                     --> MySQL의 상태정보 보기
    -> \\g
+--------+-----------------+-----------+---------------+---------
+-------------+
| Uptime | Running_threads | Questions | Opened_tables | Reloads 
| Open_tables |
+--------+-----------------+-----------+---------------+---------
+-------------+
|   1493 |               1 |        26 |             4 |       1 
|           4 |
+--------+-----------------+-----------+---------------+---------
+-------------+
1 row in set (0.00 sec)

mysql> show variables                  --> MySQL 환경변수보기
    -> \\g
+--------------------+---------------------------------+
| Variable_name      | Value                           |
+--------------------+---------------------------------+
| back_log           | 5                               |
| basedir            | /usr/local/                     |
| datadir            | .                               |
| join_buffer        | 131072                          |
| key_buffer         | 1048568                         |
| language           | /usr/local/share/mysql/english/ |
| max_allowed_packet | 65536                           |
| max_connections    | 90                              |
| max_join_size      | 4294967295                      |
| max_sort_length    | 1024                            |
| net_buffer_length  | 8192                            |
| port               | 3306                            |
| record_buffer      | 131072                          |
| skip_locking       | 1                               |
| socket             | /tmp/mysql.sock                 |
| sort_buffer        | 2097144                         |
| table_cache        | 64                              |
| thread_stack       | 65536                           |
| tmp_table_size     | 1048576                         |
+--------------------+---------------------------------+
19 rows in set (0.00 sec)

mysql> select * from db                  --> db 테이블의 데이타 가져오기
    -> \\g
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| Host      | Db       | User       | Select_priv | Insert_priv |
 Update_priv |Delete_priv | Create_priv | Drop_priv |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| %         | test     |            | Y           | Y           |
 Y           |Y           | Y           | Y         |
| %         | test\\_%  |            | Y           | Y           |
 Y           |Y           | Y           | Y         |
| localhost | binggo   | binggo     | Y           | Y           |
 Y           |Y           | Y           | Y         |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
3 rows in set (0.00 sec)

mysql>


 위의 명령은 기본적인 명령으로서 실제 mysql 을 사용할때
자주 사용될 명령이라고 생각된다. 기타 sql문은 강좌 3에서
정리하였으므로 생략하기로 한다.


        2. MySQL DB admin user 암호걸기

  MySQL 을 설치후 가장 먼저 해야 할 일은 MySQL의 admin 인
root (DB user 임)의 암호를 설정하는 일이다. 이것은 서버가
인터넷상에 접속되어 있을경우 보안을 위하여 가장 먼저해야
하는 일이라고 생각된다. 암호를 설정하는 방법은 다음과 같다.
먼저 admin 유저인 root 아이디의 암호를 설정하기로 한다.

mysql> update user
    -> set password = password('testpass')
    -> where user = 'root'
    -> \\g
Query OK, 2 row affected (0.00 sec)

mysql>

위를 실행하면 일반적으로 user 테이블상에 root 아이디가 두개가 root
아이디가 등록 되어 있으므로 2 row 의 비밀번호가 변경이 된다.
여기시 확인을 위하여 아래의 명령을 실행해 본다. 

mysql> select * from user
    -> \\g
  . . . . 
  . . . .

테이블상에 저장된 내용이 출력될 것이다.

자 이제부터는 admin 유저인 root로 mysql에 접속할 경우 꼭 password를
입력해야 한다. 즉 아래와 같이 실행하여야 한다.

$ mysql -u root -p mysql
Enter password: 

암호를 물을때 암호를 입력하면 mysql을 사용할수 있다.


        3. 새로운 데이타 베이스 생성과 사용자 연결

    3.1 데이타 베이스의 생성

 데이타베이스 생성의 방법은 두가지가 있다. mysqladmin 프로그램을
이용하여 root 아이디로 shell 상에서 생성하는 방법과 또하나 mysql
프로그램 상에서 생성하는 방법이다. 

 먼저 mysqladmin 프로그램을 이용하는 방법이다.

mysqladmin create soonhg     --> 이경우 soonhg 라는 데이타베이스 생성

admin 인 root 에 암호를 설정한 경우 다음과 같이 실행한다.

mysqladmin -u root -p create soonhg

이 경우 디폴트로 설치한 경우 /usr/local/var/soonhg 라는 디렉토리가 생성
된다. 이 디렉토리가 데이타 베이스 공간으로 이용될 곳이다. 즉 soonhg 라는
데이타 베이스 공간에 테이블을 생성할 경우 soonhg 라는 디렉토리로 관련된
파일이 생성되며 데이타가 저장된다.

*******************************************************************
중요한 tip......
*******************************************************************
 MySQL과 주고 받는 각종 내용은 /usr/local/var 상의 full도메인명.log 
파일상에 모두 저장된다. 만일 동작 상태를 알고 싶다면 터미날을 하나 더
열어서 tail -f full도메인명.log 하여 MySQL과의 주고받는 내용을 
모니터링 할 수 있다.
*******************************************************************

 두번째 방법으로 mysql을 이용하는 법이다. mysql 실행상태에서 아래와 같이
한다. (admin 인 root 아이디로 mysql 에 접속)

mysql> create database soonhg
    -> \\g
Query OK, 1 row affected (0.00 sec)

mysql> 

 위의 두가지 방법중 어느 방법을 사용하여도 무관하다. 개인적으로는 mysql
상에서 데이타베이스를 생성하는것을 권장한다. 왜냐하면 계속하여 작업을
해야할것들이 있기 때문이다.


    3.2 데이타베이스와 mysql 관리 테이블과의 연결 및 사용자등록 및 특권정의

 자 이제 생성된 데이타베이스와 데이타베이스 관리및 엑세스 권한등을 정의
하고 있는 mysql 상의 db, user 테이블에 방금 생성된 soonhg 테이블의 내
용을 정의 하자.

먼저 이 soonhg 데이타베이스는 모든 호스트 상에서 접근이 가능하도록 만들
기로 한다. 그리고 사용자는 id 로 park 라는 DB user 를 생성한다고 하자.
sql 문은 다음과 같다.

mysql> insert into db
    -> (host,db,user,select_priv,insert_priv,update_priv,delete_priv,
    -> create_priv,drop_priv)
    -> values ('%','soonhg','park','Y','Y','Y','Y','Y','Y')
    -> \\g
Query OK, 1 row affected (0.00 sec)

mysql>

 위의 sql문에서 보면 park 이라는 사용자는 soonhg 데이타베이스에 대하여
select,insert,update,delete,create,drop 권한이 모두 주어졌다. 이것은
하나의 soonhg 데이타 베이스에 대하여 각 sql 명령에 대한 권한을 개별적
으로 줄수 있다는 것을 의미한다.
select * from db 라는 sql 문을 이용하여 정상적으로 insert 되었는지
확인해 보기 바란다.

 자 이제 park 라는 db 사용자에 대한 등록을 할 차례이다.
다음과 같은  sql 문을 만들어 실행한다.


mysql> insert into user
    -> (host,user,password,select_priv,insert_priv,
    -> update_priv,delete_priv,create_priv,drop_priv,
    -> reload_priv,shutdown_priv,process_priv,file_priv)
    -> values ('localhost','park',password('park'),'N',
    -> 'N','N','N','N','N','N','N','N','N')
    -> \\g
Query OK, 1 row affected (0.00 sec)

mysql>

 위와 같이 하여도 되고 간단히 아래와 같이 하여도 무방하다.

mysql> insert into user
    -> (host,user,password)
    -> values ('localhost','park',password('park'))
    -> \\g
Query OK, 1 row affected (0.00 sec)

mysql> 

 host,user,password  이외의 칼럼들은 모두 디폴트로 'N' 으로 설정
되어 있으므로 위와 같이 하면된다. 여기서 db 테이블과 user 테이블은
특권상에서 약간의 차이점이 있다.  db 테이블 상에서 설정되지 않고
user 테이블 상에만 설정되어진 DB 사용자는 user 테이블 상에서 설정
된 권한을 존재하는 모든 데이타베이스에 대하여 인정받는다.
 이러한 이유로 일반 사용자인 경우는 user 테이블 상에는 모든 권한을
'N' 로 설정하여야 하고 각 DB user 가 사용할 데이타베이스에 대한
권한을 DB 테이블에 다시 정해주는 것이다.
 즉, 데이타베이스가 여러개 존재한다고 가정하자.  aaa, bbb, ccc 라는 
세개의 데이타베이스가 존재할때, park 이라는 DB 사용자는 aaa 라는
데이타베이스만 이용하게 하려고 설정하려고 한다고 하자.

 이경우는  user 테이블에는 모든 권한을 'N' 상태로 설정하고 db 테이블
에는 aaa 라는 테이블에 대하여 모든 권한을 'Y' 라고 설정하면 이 park
라는 db 사용자는 aaa 라는 데이타베이스에 대하여 사용권한이 주어질
것이다. 잘 이해가 가지 않는다면 몇번 더 자세히 읽어보고 test 해본다면
쉽게 이해할 수 있을것이다.

*******************************************************************
중요한 tip......
*******************************************************************
 user 테이블에 사용자를 insert, update  한 경우 MySQL을 꼭 재기동
시켜 주어야만 한다. 명령은 다음과 같다.
     myaqladmin -u root -p reload
이 명령은 user 테이블에서 사용자 정보를 다시 읽어서 MySQL 을 다시
실행시켜준다.
*******************************************************************


        4. 테이블의 생성

 테이블의 생성은 일반적인 sql 문장이므로 간단히 테이블 하나 생성하는
예제를 적는것으로 대신하겠다.
위에서 생성한 사용자와 사용자를 위한 테이블을 이용하여 작업을 하여보자

먼저 mysql을 실행한다. 실행은 그냥 일반 계정 사용자로 한다.

$ mysql -u park -p soonhg
Enter password: ****          <-- 여기서 password 인 park을 입력한다.
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 17 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql>


자 MySQL에 접속되었다. 이제 table을 생성하여 보자. 아래는 individual
테이블 생성을 위한 SQL 문장이다.

create table individual(
empno  char(16)   primary key,
name   char(20)   not null,
sex    char(2),
addr   char(80),
tel    char(15)
)

위의 테이블은 개인정보 테이블로 간단히 만든것이다. empno 가 키가 되어
저장된다. 물론 index 테이블이 하나 생성되며 empno 가 인덱싱 되어진 테
이블이 생성될것이다. not null 은 말그대로 name 칼럼은 null 값은 받지
않겠다는 것이고..... 

자 그럼 insert 문장을 하나 작성해 보자

insert into individual
values ('1','박순행','1','서울시 중랑구 상봉동 LG apt.','02-777-7777')

위의 sql문을 실행하면 한 row의 데이타가 insert 된다. 그럼 이제
select 문을 이용하여 읽어보자.

mysql> select *
    -> from individual
    -> \\g
+-------+--------+------+------------------------------+-------------+
| empno | name   | sex  | addr                         | tel         |
+-------+--------+------+------------------------------+-------------+
| 1     | 박순행 | 1    | 서울시 중랑구 상봉동 LG apt. | 02-777-7777 |
+-------+--------+------+------------------------------+-------------+
1 row in set (0.00 sec)


위와 같이 출력 될 것이다. 여러가지 sql문장을 테스트 해보면 될것이다.


<< 결론 >>
 많이 알지도 못하면서 괜히 시작한 것은 아닌가 합니다. 하지만 msql보다 매우
뛰어난 기능을 가지고 있고 또 mysql을 사용하고자 하는 분이 저처럼 사용에 관
련된 자료가 없어서 고생하지 않도록 하기 위하여 짧은 지식으로나마 이렇게 
글을 올려 봅니다.
 다음 강좌에서는 MySQL 과 C 언어와의 연결법에 대하여 강의해 보도록 하겠습
니다. 저의 작은 강좌가 많은 사람들에게 도움이 되었으면 합니다.

-----------------------------------------------------------------------
-----------------------  MySQL 강좌 #5 END ----------------------------
-----------------------------------------------------------------------