상세 컨텐츠

본문 제목

MySQL 기초

프로그래밍/DB

by 라제폰 2008. 12. 23. 12:56

본문

MySQL


1. MySQL의 개요

2. MySQL의 설치

3. MySQL의 사용법

4. C API

5. Perl DBI

5. PHP3와 MySQL을 이용한 Web과 DB의 연동


1. MySQL의 개요

1.1 특징

  • 커널 thread를 이용한 multi thread를 지원하므로, 다중 CPU가 지원되는 경우 CPU 활용도가 좋음
  • 다양한 플랫폼(HW+OS)을 지원(Window NT 버전도 있음)
  • 다규모 데이터베이스를 지원
  • 에러 메시지를 다국적 언어로 지원
  • 최적화 라이브러리를 사용
  • 빠른 속도 : http://www.tcx.se/benchmark.html

1.2 지원되지 않는 SQL 기능

  • Sub-select
    - "SELECT * FROM table WHERE id IN(SELECT id FROM table2);"와 같은 SQL을 지원하지 않는다.
    - "INSERT..SELECT..."와 "REPLACE..SELECT..."형태의 SQL은 지원한다.
    - 향후 지원 예정
  • SELECT INTO TABLE
    - "SELECT... INTO OUTFILE" 은 지원
  • Transaction
    - Transaction은 시스템 자원을 많이 소모하므로 전체 속도를 떨어뜨림
    - MySQL은 이러한 문제를 해결하기위하여 Transaction을 구현하지 않고 LOCK TABLES/UNLOCK TABLES를 이용하여 transaction과 같은 일을 할수 있도록 구현
  • Stored Procedure와 Trigger
    - Stored Procedure는 향후 지원 예정
    - Trigger는 시스템 속도를 떨어뜨리므로 지원할 계획이 없음
  • Foreign Key
  • View

2. MySQL의 설치

  • MySQL은 라이센스 방식이므로 RedHat과 같은 배포판에는 포함되어 있지 않음
  • 비상업용인 경우 무료
  • 상업용인 경우는 라이센스를 구입하여야 함
  • Win95/98/NT인 경우는 무조건 라이센스를 구입하여야 함
  • 다운로드 사이트 : http://www.tcx.se/download.html , http://linux.kornet.re.kr/mysql/download.html
  • 99년 최신판 : 3.22.22-1

2.1 소스 코드로 설치하기

  • 압축 해제
    % gzip -d mysql-Version.tar.gz
    % tar xvf msql-Version.tar
    % cd mysql-Version
  • 설치
    % configure => 각 시스템 환경에 적합한 Makefile을 생성
    % make => 컴파일
    % make check => 컴파일 결과를 검사
    % make install => 실행 파일을 적당한 디렉토리에 설치
    % cd scripts
    % mysgl_install_db => MySQL의 권한에 대한 테이블을 생성
  • 업그래이드
    % mysql_fix_private_tables
  • 설치 디렉토리
    - 디폴트 디렉토리 : /usr/local/
    - 설치디렉토리 지정 방법
    % configure --prefix=설치디렉토리명

    - 설치 후 디렉토리 구조

    bin/ : 실행 파일
    include/mysql : 헤드 파일
    lib/mysql : 라이브러리
    libexec : MySQL 데몬인 mysqld
    var : 실제 데이타

2.2 바이너리 배포판으로 설치하기

  • 압축 해제
    % gzip -d mysql-Version-OS.tar.gz
    % tar xvf msql-Version-OS.tar
    % ln -s mysql-Version-Os mysql
    % cd mysql
  • 설치
    % mysgl_install_db => MySQL의 권한에 대한 테이블을 생성

2.3 rpm으로 설치하기

  • 설치
    % rpm -i MySQL-Version.src.rpm
    % cd /usr/src/readhat/SOURCE
    % configure => 각 시스템 환경에 적합한 Makefile을 생성
    % make => 컴파일
    % make check => 컴파일 결과를 검사
    % make install => 실행 파일을 적당한 디렉토리에 설치
    % cd scripts
    % mysgl_install_db => MySQL의 권한에 대한 테이블을 생성
  • 바이너리 rpm 파일 설치시 필요한 파일
    MySQL-Version.i386.rpm
    MySQL-cilent-Version.i386.rpm
    MySQL-bench-Version.i386.rpm
    MySQL-devel-Version.i386.rpm
  • 실제 데이터가 저장되는 디렉토리 : /var/lib/mysql
  • 부팅시 자동으로 데몬을 실행하는 파일을 생성

3. MySQL의 사용 방법

3.1 중요 실행 파일과 데몬

  • 중요 실행 파일
    mysql
    • SQL 쉘
    • client 프로그램
    • mySQL 에 접속하여 쿼리를 수행하는 프로그램
    mysqladmin
    • MySQL을 관리하는 프로그램
    • 데이터베이스의 생성, 삭제, 권한 설정 테이블을 읽어들이는 일을 수행
    mysqld
    • MySQL 데몬
    mysqlshow
    • MySQL 안에 있는 데이터베이스와 테이블과 컬럼을 표시해주는 프로그램
    safe_mysqld
    • MySQL을 안전하게 실행시키는 스크립트 프로그램 파일
    isamchk
    • 테이블에 문제가 발생할 경우 수정하고, 테이블을 최적화 하는 프로그램
  • 데몬을 수행 시키는 방법
    % safe_mysqld 데몬을 안전하게 수행
    % mysqld 데몬을 수행, 디폴트 포드 : 3306
    % mysqld -P 333 포트 번호를 지정하여 데몬을 수행
  • 부팅시 데몬을 자동수행시키는 방법
    - /etc/rc.d/rc.local 파일에 등록
    - rpm으로 설치한 경우 자동 등록

3.2 권한 설정

  • MySQL을 처음 설치하면 root 만이 MYSQL을 사용가능하도록 권한이 설정됨
  • 현재 상태에서 설정된 데이타베이스를 확인 :mysqlshow 명령 사용
    % mysqlshow -u root
    +-----------+
    | Databases |
    +-----------+
    | mysql     |
    | test      |
    +-----------+

    - " -u root " : root 가 사용한다는 옵션
    - 최초 설치시 : mtsql과 test 두개의 데이블이 존재

  • mysql 데이타베이스의 테이블 확인 : mysqlshow 명령 사용
    % mysqlshow -u root mysql
    Database: mysql
    +--------------+
    | columns_priv |
    | db           |
    | func         |
    | host         |
    | tables_priv  |
    | user         |
    +--------------+

    - user 테이블이 사용자 권한에 관한 테이블임

  • user 테이블의 레코드 확인
    % mysql -u root
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4 to server version: 3.22.22
    
    Type 'help' for help.
    
    mysql> use mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    
    mysql> select * from user;
    +-----------+------+----------+-------------+-------------+-------------+------+
    | Host      | User | Password | Select_priv | Insert_priv | Update_priv | Delet|
    +-----------+------+----------+-------------+-------------+-------------+------+
    | localhost | root |          | Y           | Y           | Y           | Y    |
    | orange    | root |          | Y           | Y           | Y           | Y    |
    | localhost |      |          | N           | N           | N           | N    |
    | orange    |      |          | N           | N           | N           | N    |
    +-----------+------+----------+-------------+-------------+-------------+------+
    4 rows in set (0.01 sec)
    
    mysql>

    - "*.priv" 컴럼: 사용 권한에 대한 설정, Y 이면 권한을 가짐을, N이면 권한이 없음을 의미
    - "Password" 컬럼 : 암호의 설정 상태를 의미, 현제 root는 암호가 없음

  • root 사용자에 대하여 암호를 설정
    mysql> update user set password = password('apple1234')   => 암호 설정
        -> where user='root' ;
    Query OK, 2 rows affected (0.13 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> quit => 종료
    Bye
    % mysqladmin -u root reload => 권한이 변경된 경우 변경된 권한을 다시 읽어 들임
    % mysql -u root -p          => 암호가 있는 경우 -p 옵션을 붙여서 mysql을 수행
    Enter password: XXXXXXXXXX
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8 to server version: 3.22.22
    
    Type 'help' for help.
    
    mysql> select * from user;
    +-----------+------+------------------+-------------+-------------+------------+
    | Host      | User | Password         | Select_priv | Insert_priv | Update_priv|
    +-----------+------+------------------+-------------+-------------+------------+
    | localhost | root | 32b157395f7543c0 | Y           | Y           | Y          |
    | orange    | root | 32b157395f7543c0 | Y           | Y           | Y          |
    | localhost |      |                  | N           | N           | N          |
    | orange    |      |                  | N           | N           | N          |
    +-----------+------+------------------+-------------+-------------+------------+
    4 rows in set (0.01 sec)
    
    mysql>

3.3 사용자 추가

  • "INSERT .. INTO" 명령을 이용해서 mysql 데이타베이스의 user 테이블에 추가
    % mysql -u root -p mysql
    Enter password:XXXXXXXXXX
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 11 to server version: 3.22.22
    
    Type 'help' for help.
    
    mysql> insert into user values('localhost', 'wiseo', ==> 사용자 wiseo에게 모든 권한 
        -> password('apple2000'), 'Y', 'Y', 'Y', 'Y',
        -> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',
        -> 'Y', 'Y');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from user;
    +-----------+-------+------------------+-------------+-------------+-----------+
    | Host      | User  | Password         | Select_priv | Insert_priv | Update_pri|
    +-----------+-------+------------------+-------------+-------------+-----------+
    | localhost | root  | 32b157395f7543c0 | Y           | Y           | Y         |
    | orange    | root  | 32b157395f7543c0 | Y           | Y           | Y         |
    | localhost |       |                  | N           | N           | N         |
    | orange    |       |                  | N           | N           | N         |
    | localhost | wiseo | 6da73b5d2ab9ea69 | Y           | Y           | Y         |
    +-----------+-------+------------------+-------------+-------------+-----------+
    5 rows in set (0.01 sec)
    
    mysql>

    - 권한을 부여 하고자 한다면 해당 컬럼의 값을 'Y'로 아니면 'N'으로 설정

  • SELECT, INSERT, DELETE에 대한 권한만 주고자 한다면
    mysql> insert into user values('localhost', 'wiseo', 
        -> password('apple2000'), 'Y', 'Y', 'Y');
    Query OK, 1 row affected (0.01 sec)
    
    mysql>
  • "GRANT" 명령을 이용해서 mysql 데이타베이스의 user 테이블에 추가
    mysql> grant all priviledges on *.* to wiseo@localhost ==> 사용자 wiseo에게 모든 권한 
        -> identified by 'apple2000' with grant option;
    Query OK, 0 rows affected (0.01 sec)
    mysql>
  • "GRANT" 명령을 이용해서 RELOAD와 PROCESS 권한 만을 설정
    mysql> grant reload,process on *.* to wiseo@localhost 
        -> identified by 'apple2000' with grant option;
    Query OK, 0 rows affected (0.01 sec)
    mysql>
  • 권한을 변경한 경우 반드시 권한을 적용하여야 함(2가지 방법)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>
    % mysqladmin -u root -p reload
    Enter password: XXXXXXXX

3.4 암호

  • root 암호를 잊어버린 경우
    - MySQL 데몬의 실행을 중지
    - 권한에 대한 검사를 하지 않고 데몬을 실행 : safe_mysql -Sg &
    - mysql을 사용하여 암호를 제거
    - mysqladmin reload를 이용해서 변경된 권한을 적용하고, 데몬을 다시 수행
  • 암호의 저장
    - 암호가 설정된 경우 모든 명령을 사용하기 위해서는 -p 옵션을 붙여야 하고, 암호를 입력하여야 함
    - 암호 입력을 생략하려면 홈디렉토리에 .my.cnf 파일을 다음과 같이 만들어야 함.
    % cat > .my.cnf
    [client]
    password=암호
    ^D
    % chmod 600 .my.cnf  => 다른 사람이 보지 못하도록 파일 접근 권한을 설정
    %

3.5 컬럼의 유형

  • 컬럼(Column)
    - 데이타베이스를 구성하는 최소 단위
    - 컬럼들이 모여서 테이블(Table)을 구성
  • 컬럼의 유형
    TYNYINT
    • 부호 있는 정수 -128 ~ 127
    • 부호 없는 정수 0 ~255
    • 1 Byte
    SMALLINT
    • 부호 있는 정수 -32768 ~ 32767
    • 부호 없는 정수 0 ~65535
    • 2 Byte
    MEDIUMINT
    • 부호 있는 정수 -8388608 ~ 8388607
    • 부호 없는 정수 0 ~16777215
    • 3 Byte
    INT 또는 INTEGER
    • 부호 있는 정수 -2147483648 ~ 2147483647
    • 부호 없는 정수 0 ~4294967295
    • 4 Byte
    BIGINT
    • 부호 있는 정수 -9223372036854775808 ~ 9223372036854775807
    • 부호 없는 정수 0 ~18446744073709551615
    • 8 Byte
    FLOAT
    • 단일 정밀도를 가진 부동 소수점
    • -3.402823466E+38 ~3.402823466E+38
    DOUBLE
    • 2 배 정밀도를 가진 부동 소수점
    • -1.79769313486231517E+308 ~ 1.79769313486231517E+308
    DATE
    • 날짜를 표현하는 유형
    • 1000-01-01 ~ 9999-12-31
    DATETIME
    • 날짜와 시간을 표현하는 유형
    • 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
    TIMESTAMP
    • 1970-01-01 00:00:00 부터 2037년 까지 표현
    • 4 Byte
    TIME
    • 시간을 표현하는 유형
    • -839:59:59 ~ 838:59:59
    YEAR
    • 년도를 표현하는 유형
    • 1901 년 ~ 2155년
    CHAR(M)
    • 고정길이 문자열을 표현하는 유형
    • M = 1 ~255
    VARCHAR(M)
    • 가변길이 문자열을 표현하는 유형
    • M = 1 ~ 255
    TINYBLOB
    TINYTEXT
    • 255개의 문자를 저장
    • BLOB : BINARY LARGE OBJECT의 약자
    BLOB
    TEXT
    • 63535개의 문자를 저장
    MEDIUMBLOB
    MEDIUMTEXT
    • 16777215개의 문자를 저장
    LONGBLOB
    LONGTEXT
    • 4294967295(4Giga)개의 문자를 저장

 

3.6 데이타베이스 생성

  • mysqladmin을 이용하는 방법
    % mysqladmin create super
    Database "guestbook" created.
    % mysqlshow
    +-----------+
    | Databases |
    +-----------+
    | mysql     |
    | guestbook |
    | test      |
    +-----------+
    %
  • mysql을 이용하는 방법
    % mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4 to server version: 3.22.22
    
    Type 'help' for help.
    
    mysql> create datatbase guestbook;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases;
    +-----------+
    | Databases |
    +-----------+
    | mysql     |
    | guestbook |
    | test      |
    +-----------+
    Query OK, 1 row affected (0.01 sec)
    
    mysql>

3.7 테이블 생성

  • 테이블의 예 : 고객 테이블
    테이블 명 : guest
    컬럼 명   : 일련번호(no) -> 자동으로 부여되는 일련 번호, 키
                이름(name) 
                나이(age)
                전화번호(phone)
                전자우편주소(email)
                주소(address)
  • 테이블 생성 방법 : mysql 명령 모드에서 CREATE 문을 사용
    CREATE TABLE 테이블명 (컬럼의 형식) ;
  • 테이블 생성 예제
    % mysql
    mysql> use guestbook;
    Database changed
    mysql> CREATE TABLE guest(no INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
        -> name CHAR(20), age TINYINT, phone VARCHAR(20),email VARCHAR(30),
        -> address VARCHAR(50));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> SHOW TABLES;   => 생성된 테이블을 확인
    +---------------------+
    | Tables in guestbook |
    +---------------------+
    | guest               |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
  • PRIMARY KEY : 주 키로 설정
  • NOT NULL : 반드시 값을 가져야 함을 의미
  • AUTO_INCREMENT : 레코드가 삽입될 때 마다 자동으로 값을 증가

3.8 레코드 삽입

  • 삽입할 레코드 정보
    no name age phone email address
    1 홍길동 20 510-0001 hong@jisan.ac.kr 부산
    2 김유신 22 510-1004 kim@jisan.ac.kr 경주
    3 강감찬 23 510-9000 gang@jisan.ac.kr 대구
    4 이순신 21 560-8000 lee@jisan.ac.kr 여수
    5 임꺽정 30 800-7000 lim@jisan.ac.kr 대전
    6 유관순 21 700-5555 you@jisan.ac.kr 서울
    7 윤봉길 28 288-5757 youn@jisan.ac.kr 인천
    8 안중근 33 566-4545 ann@jisan.ac.kr 수원
    9 박문수 25 767-9090 park@jisan.ac.kr 충주
    10 정철수 55 777-9999 jung@jisan.ac.kr 광주
  • 레코드 삽입 방법 : mysql 명령 모드에서 INSERT 문을 사용
    INSERT INTO 테이블명 VALUES(컬럼의 데이터 값...) ;
  • 레코드 삽입 예제:
    mysql> INSERT INTO guest VALUES(1,'홍길동',20,'510-0001',
        -> 'hong@jisan.ac.kr','부산');
    Query OK, 1 row affected (0.05 sec)
    mysql> INSERT INTO guest VALUES(NULL,'김유신',22,'510-1004',
        -> 'kim@jisan.ac.kr','경주');
    Query OK, 1 row affected (0.05 sec)
    (중략)
    mysql> select * from guest;
    +----+--------+------+----------+------------------+---------+
    | no | name   | age  | phone    | email            | address |
    +----+--------+------+----------+------------------+---------+
    |  1 | 홍길동 |   20 | 510-0001 | hong@jisan.ac.kr | 부산    |
    |  2 | 김유신 |   22 | 510-1004 | kim@jisan.ac.kr  | 경주    |
    |  3 | 강감찬 |   23 | 510-9000 | gang@jisan.ac.kr | 대구    |
    |  4 | 이순신 |   21 | 560-8000 | lee@jisan.ac.kr  | 여수    |
    |  5 | 임꺽정 |   30 | 800-7000 | lim@jisan.ac.kr  | 여수    |
    |  6 | 유관순 |   21 | 700-5555 | you@jisan.ac.kr  | 서울    |
    |  7 | 윤봉길 |   28 | 288-5757 | youn@jisan.ac.kr | 인천    |
    |  8 | 안중근 |   33 | 566-4545 | ann@jisan.ac.kr  | 수원    |
    |  9 | 박문수 |   25 | 767-4545 | park@jisan.ac.kr | 충주    |
    | 10 | 정철수 |   55 | 777-9999 | jung@jisan.ac.kr | 광주    |
    +----+--------+------+----------+------------------+---------+
    10 rows in set (0.00 sec)
    
    mysql>

 

3.9 레코드 수정

  • 레코드 수정 방법 : mysql 명령 모드에서 UPDATE 문을 사용
    UPDATE 테이블명 SET 컬럼명=식 ,... [ WHERE 조건 ];
  • 레코드 수정 예제:
    mysql> Update guest SET address='대전' where name='임꺽정';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0
    mysql> select * from guest where name='임꺽정';
    +----+--------+------+----------+-----------------+---------+
    | no | name   | age  | phone    | email           | address |
    +----+--------+------+----------+-----------------+---------+
    |  5 | 임꺽정 |   30 | 800-7000 | lim@jisan.ac.kr | 대전    |
    +----+--------+------+----------+-----------------+---------+
    1 row in set (0.00 sec)
    
    mysql>

 

3.10 레코드 검색

  • 검색 조건
    1. guest 테이블의 모든 레코드 검색하여 이름과 나이 필드만 출력
    2. guest 테이블의 모든 레코드 검색하여 25살 이하인 사람들의 이름만 출력
    3. guest 테이블의 모든 레코드를 나이가 큰 순서로 정렬하여 이름과 나이 필드만 출력
    4. 전체 나이의 평균 출력
  • 레코드 검색 방법 : mysql 명령 모드에서 SELECT 문을 사용
    SELECT 컬럼명 [AS 구문] ,.. FROM 테이블명 
    [WHERE 조건] 
    [ORDER BY 정렬기준 컬럼 ACS|DESC ] 
    [GROUP BY 구룹화 기준 컬럼 ];
  • 레코드 검색 예제:
    mysql> SELECT name,age from guest;
    +--------+------+
    | name   | age  |
    +--------+------+
    | 홍길동 |   20 |
    | 김유신 |   22 |
    | 강감찬 |   23 |
    | 이순신 |   21 |
    | 임꺽정 |   30 |
    | 유관순 |   21 |
    | 윤봉길 |   28 |
    | 안중근 |   33 |
    | 박문수 |   25 |
    | 정철수 |   55 |
    +--------+------+
    10 rows in set (0.00 sec)
    
    mysql> SELECT name,age from guest where age <= 25 ;
    +--------+------+
    | name   | age  |
    +--------+------+
    | 홍길동 |   20 |
    | 김유신 |   22 |
    | 강감찬 |   23 |
    | 이순신 |   21 |
    | 유관순 |   21 |
    | 박문수 |   25 |
    +--------+------+
    6 rows in set (0.00 sec)
    
    mysql> SELECT name,age from guest ORDER BY age DESC;
    +--------+------+
    | name   | age  |
    +--------+------+
    | 정철수 |   55 |
    | 안중근 |   33 |
    | 임꺽정 |   30 |
    | 윤봉길 |   28 |
    | 박문수 |   25 |
    | 강감찬 |   23 |
    | 김유신 |   22 |
    | 이순신 |   21 |
    | 유관순 |   21 |
    | 홍길동 |   20 |
    +--------+------+
    10 rows in set (0.01 sec)
    
    mysql> SELECT AVG(age) from guest ;
    +----------+
    | AVG(age) |
    +----------+
    |  27.8000 |
    +----------+
    1 row in set (0.07 sec)
    
    mysql> SELECT AVG(age) AS '평균 연령' from guest ;
    +-----------+
    | 평균 연령 |
    +-----------+
    |   27.8000 |
    +-----------+
    1 row in set (0.01 sec)
    
    mysql>

 

3.11 레코드의 삭제

 

 

 

3.12 파일로 부터 레코드 입력받기와 결과를 파일로 저장하기

3.12.1 파일에서 데이터를 테이블로 읽어 들이기

  • 방법 : mysql 명령 모드에서
    LOAD DATA INFILE '파일 경로명' INTO TABLE 테이블명 FIELDS TERMINATED BY '필드구분자';
  • 예제 :
    % cat > guest.txt
    NULL,서태지,22,666-9999,seo@jisan.ac.kr,진주
    NULL,신승훈,33,999-6666,shin@jisan.ac.kr,청주
    % mysql guestbook
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 15 to server version: 3.22.22
    
    Type 'help' for help.
    
    mysql> LOAD DATA INFILE '/home/prof/wiseo/guest.txt' INTO TABLE guest 
        -> FIELDS TERMINATED BY ',';=> 파일명은 반드시 절대경로명
    Query OK, 2 rows affected (0.03 sec)
    Records: 2  Deleted: 0  Skipped: 0  Warnings: 2
    mysql>

3.12.2 테이블에서 데이터를 검색하여 파일로 출력하기

  • 방법: mysql 명령 모드에서
    SELECT 문 INTO OUTFILE '출력파일의 경로명';
  • 예제 :
    mysql> SELECT * from guest where age <= 25
        -> INTO OUTFILE 'out.txt'
        -> FIELDS TERMINATED BY ',' ; => 상대경로명을 사용하면 기준은 DB가 존재하는 디렉토리
    mysql> 

 

3.13 테이블의 이름 변경과 컬럼 구조 변경(ALTER 문)

3.13.1 테이블 이름 변경

  • 방법: mysql 명령 모드에서
    ALTER TABLE 테이블명 RENAME 새테이블명 ;
  • 예제

3.13.2 테이블 컬럼 구조 변경

  • 방법: mysql 명령 모드에서
    ALTER TABLE 테이블명 ADD 컬럼명 컬럼 유형; => 새로운 컬럼을 추가
    ALTER TABLE 테이블명 DROP COLUMN 컬럼명; => 컬럼을 삭제 
  • 예제

 

3.13 테이블의 삭제

  • 방법: mysql 명령 모드에서
    DROP TABLE 테이블명 ;
  • 예제

3.14 테이블이나 컬럼의 정보 표시

 


4. C API

4.1 C API의 개요

  • 라이브러리 파일
    - 설치 디렉토리 : /usr/lib/mysql
    -
    기본적으로 mysqlclient 라이브러리와 암호화를 위해서 math 라이브러리를 링크하여야 함
  • 헤드 파일
    - 설치 디렉토리 :
    /usr/include/mysql
    - 기본적으로 mysql.h 헤더 파일을 include 하여야 함.
    #include "mysql.h" 
  • 컴파일
    % cc -I/usr/include/mysql -L/usr/lib/mysql myapp.c -o myapp -lm -lmysqlclient 
  • 프로그램의 기본 구조 : mysql001.c

4.2 주요 함수

  • MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
    - 데이터베이스 엔진과 연결을 설정하는 함수
    - 파라메터

    mysql 연결에 관한 정보, (MYSQL*) 0으로 지정하면 연결에 관한 정보를 위한 메모리를 할당하고, 해제(free)시킨다. , 옵션을 쓰면 mysql_connect로부터 오류 메시지를 얻을 없다
    host 호스트 이름, 또는 IP address, NULL이면 'localhost' 처리
    user 사용자의 MySQL login ID, NULL이면 '현재 사용자' 처리, ODBC 상에서는 생략할 없음
    passwd 암호

    - 복귀 값 : 연결이 설정이 성공하면 mysql을, 실패하면 NULL 복귀

  • int mysql_select_db(MYSQL *mysql, const char *db)
    - mysql_connect() 함수가 성공적으로 수행된 후에 호출하는 함수
    - 서버에서 관리하고 있는 데이터베이스 중 접근하려는 데이터베이스를 선택하는 함수
    - 파라메터
    mysql mysql_connect() 함수가 복귀한 값을 지정
    db 사용하고자 하는 데이터베이스의 이름을 의미하는 문자열

    - 복귀 값 :

  • int mysql_query(MYSQL *mysql, const char *query);
    - mysql에 의해서 지정된 데이터베이스에 query에 의해서 지정된 SQL 쿼리를 실행한다.
    - 쿼리가 성공적으로 실행되었다면, 0을 리턴한다. 에러 시에는 0이 아닌 값을 리턴한다
    - 오류 메시지를 확인하려면 mysql_error를 사용한다.
    - mysql_num_rows를 사용하면, 쿼리에 의해서 리턴된 행(row)의 수를 알 수 있다
    - 만약 INSERT하려는 테이블에 AUTO_INCREMENT 필드가 있다면, mysql_insert_id를 사용하여 새로 지정된 필드를 찾을 수 있다.
  • MYSQL_RES *mysql_store_result(MYSQL *mysql);
    - mysql_query가 성공적으로 실행된 후 그 결과를 읽는다.
    - 써버로부터 결과를 가져오기 위해서는 mysql_store_result()나 mysql_use_result()를 써야한다.
    - mysql_store_result()는 에러가 발생했거나, 리턴 데이터가 없는 경우에 NULL을 리턴한다. 에러 체크는 아래처럼 할 수 있다:

    if (!(result=mysql_store_result(&mysql)) && mysql_num_fields(&mysql))
    fputs(mysql_error(&mysql),stderr);
    메모리를 해제(free)시키려면 mysql_free_result()를 호출한다.

  • MYSQL_ROW mysql_fetch_row(MYSQL_RES *res);
    - 쿼리 결과로부터 다음 줄(row)을 불러온다. 더 이상 불러올 데이터가 없으면, NULL을 리턴한다.
  • int mysql_num_fields(MYSQL_RES *result)
    - 쿼리 결과에 있는 컬럼(fields)의 숫자를 리턴하는 매크로 함수
  • int mysql_num_rows(MYSQL_RES *result)
    - 가장 최근에 mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables 또는 mysql_store_result에 의해서 리턴된 행수(number of row)를 리턴하는 매크로 함수
  • void mysql_close(MYSQL *mysql)
    - 데이터 베이스 엔진과의 연결을 닫는다.
    - 모든 작업이 완료된 후에는 mysql_close으로 connection을 닫아야함.
    - 만약 mysql_close를 호출하지않으면, mysql_connect에 의해서 생성된 thread는 내장 time-out에 도달할 때까지 살아있게 되어서, 메모리를 낭비하게 됨.
    - 디폴트 timeout은 동작 중인 쿼리에 대해서는 30초, 열린 connection에 대해서는 8시간.
    - 복귀 값 : 없음
  • int mysql_eof(MYSQL_RES *)
    - fetch할 자료가 더 있는지를 검사한다.
    - 복귀 값
    Non-zero mysql_fetch_row()가 결과값을 모두 fetch했기 때문에, 더 이상 fetch할 것이 없다면
    Zero(0) mysql_fetch_row()가 fetch할 수 있는 데이터가 남아있음.
  • char *mysql_error(MYSQL *mysql)
    - mysql 연결에서 가장 최근에 호출된 MySQL 함수의 오류 메시지 문자열을 리턴하는 함수.
    - 오류가 발생하지 않았다면, empty string을 리턴

  • int mysql_affected_rows(MYSQL *mysql)
    - 가장 최근의 UPDATE, DELETE 또는 INSERT에 영향을 받은(affected) row의 수를 반환한다.

    RETURN VALUE:

    x > 0 : 바뀐/반환된 row의 수를 가리킨다.
    0 : 해당하는 데이터가 없다
    -1 : 에러가 있는 쿼리. 예를 들어, INSERT 도중에 중복된 primary 키를 add하려고 한 경우.
    EXAMPLE:

    mysql_query( &mysql, "INSERT INTO gl_transact (acctnbr, amount) VALUES (12345, 651.30)" );
    if ( mysql_affected_rows( &mysql ) < 0 )
    fprintf( stderr, "Attempted to add duplicate primary key\n" );
    MySQL은 '테이블에 있는 모든 레코드 삭제' 같은 경우에 대해서 최적화되었다. 이 최적화는 MySQL이 이 경우에 영향을 받은 행(row)의 숫자인 0을 리턴할 것이다. Doing a 'select count(*) from the_table' before deleting all records will give you a value for the number of rows affected, though this value may change between the SELECT and and DELETE since MySQL 3.20.X does not support table locking. 이 버그는 3.21.x 버전에서 고쳐졌다. (역자주. 무슨 얘긴지 종 잡을 수가 없군.)

  • int mysql_create_db(MYSQL *mysql, const char *db);
    - mysql에 의해서 지정된 기계에 db라는 이름의 데이터베이스를 생성한다. 단 create 권한을 가진 user ID에 의해서 MYSQL 연결이 되어있어야한다. (사용자 권한에 대해서는 chapter 5를 참고하라)

    - RETURN VALUE: 데이터베이스가 정상적으로 생성되면, 0을 리턴한다.
    만약 에러가 발생하면, 0이 아닌 값을 리턴한다. 에러 메시지는 mysql_error()로 확인할 수 있다.
  • void mysql_data_seek(MYSQL_RES *res, uint offset);
    - 쿼리 결과값에서 지정된 행(row)을 찾는다. mysql_use_result()에 의해서 생성된 연결에서는 쓸 수 없다.
    - RETURN VALUE : None
  • int mysql_drop_db(MYSQL *mysql, const char *db);
    - mysql에 의해서 지정된 machine으로부터 db라는 이름을 데이터베이스를 drop한다. 지정된 데이터베이스를 drop할 수 있는 권한을 가진 user id로 접속되어있어야한다. (사용자 권한에 대한 자세한 설명은 chapter 6을 참고하라)
    - RETURN VALUE: 데이터베이스가 성공적으로 drop 됐다면, 0을 리턴한다.
    만약 에러가 발생하면, 0이 아닌 값을 리턴한다. 에러 메시지는 mysql_error를 호출하여 확인할 수 있다.
  •  
  • MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *handle);
    - 테이블 필드의 타입이 무엇인지 알아낸다.

  • unsigned int *mysql_fetch_lengths(MYSQL_RES *mysql)
    - 쿼리 결과값에 있는 모든 컬럼의 길이를 리턴한다. 만약 \0을 포함하고 있는 데이터를 받을 생각이라면, 당신은 이 함수를 필드 값의 실제 길이를 얻는데 써야한다.
  • void mysql_field_seek(MYSQL_RES *result, int field)
    - 컬럼 커서를 컬럼 번호 field로 옮긴다. 이때, field 값 x는 0 <= x <= mysql_num_fields(MYSQL_RES*)-1 이어야한다.
  • void mysql_free_result(MYSQL_RES *result);
    - 쿼리 결과를 저장하고있는 메모리를 free시킨다. mysql_store_result()에 대한 결과값 사용을 마치고 호출해야한다.
  • char *mysql_get_client_info(void);
    - 현재 쓰이고 있는 client 라이브러리의 버전 정보를 포함하고 있는 스트링을 리턴한다.
  • char *mysql_get_host_info(MYSQL *mysql);
    - host의 이름을 리턴한다 (mysql_connect와 host 인자(argument)는 같다).
  • int mysql_get_proto_info(MYSQL *mysql);
    - 연결에 쓰이고 있는 프로토콜의 버전을 얻는다. MySQL은 client 특성에 따라 동적인 프로토콜을 제공한다. 단, 3.20.x 버전에서는 아무런 일도 하지 않는다. but in future versions it will for example allow one client to connect using the current protocol, while another connects using encryption and compression.
  • char *mysql_get_server_info(MYSQL *mysql);
    - 써버의 버전 번호를 리턴한다.
  • int mysql_insert_id(MYSQL *mysql)
    - 결과 변수인 'res'에서 AUTO_INCREMENT 필드를 위해서 생성된 ID를 리턴한다.

  • MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild);
    - mSQL 어플리케이션을 쉽게 포팅하기 위해서 제공되었다.

    쿼리처럼 'SHOW databases [ LIKE wild-card ]'를 실행하는 것과 유사하다.
  • MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild);
    - mSQL 어플리케이션을 쉽게 포팅하기 위해서 제공되었다.

    쿼리에서 'SHOW fields [FROM table] [FROM database] [LIKE wild-card]'를 하는 것과 유사하다.
  • MYSQL_RES *mysql_list_processes(MYSQL *mysql);
    - MySQL 데이터베이스 엔진에서 현재 실행 중인 thread의 리스트를 얻는다. 단, process 권한을 가지고 있어야한다.
  • MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild);
    - mSQL 응용 프로그램을 쉽게 포팅하기 위한 함수.

    Similar to doing 'SHOW tables [FROM database]' as a query.

    쿼리처럼 'SHOW tables [FROM database]'를 하는 것과 유사하다.
  • int mysql_real_query(MYSQL *mysql, const char *query, uint length);
    - This function is called by mysql_query after it does a strlen function call to calculate the length of the query string. 쿼리 스트링을 위해서 크기가 고정된 버퍼를 할당했다면, 이것을 쓸 수 있다.

    만약 un-escaped \0 값을 가지고 있는 데이터를 가지고 있다면, 이 함수를 써야한다.
  • int mysql_reload(MYSQL *mysql);
    - MySQL 데이터베이스 엔진이 사용자 권한 테이블을 다시 읽어들이고, 모든 캐쉬를 정리하고, 쓰이지 않는 모든 테이블을 close한다. 이 함수는 어떤 테이블에 isamchk를 실행하기 전에 꼭 호출해야한다.

    단, 사용자가 reload 권한을 가지고 있어야한다.
  • int mysql_shutdown(MYSQL *mysql)
    - MySQL 데이터베이스 엔진을 shutdown한다. 단, 사용자가 shutdown 권한을 가지고 있어야한다.
  • char *mysql_stat(MYSQL *mysql);
    - 커맨드 'mysqladmin version'과 유사한 정보를 문자 배열로 리턴한다. 이것은 실행시간(updatime), 실행 중인 thread, 질문들(역자주 쿼리가 아니라 질문?), reload되거나 open된 테이블에 대한 정보를 포함하고 있다. 이것은 본질적으로 mysqladmin 프로그램의 상태 옵션과 비슷하다.
  • MYSQL_RES *mysql_use_result(MYSQL *mysql);
    -결과를 mysql_fetch_row()에 의해서 써버에서 동적으로 불러오는 것을 제외하면, mysql_store_result()와 같다. 이것은 써버에 ties up하기 때문에, interactive 응용 프로그램에서는 쓰여져서는 안 된다. 이 함수는 client의 메모리를 적게 사용한다.

4.3 프로그램 예제

mysql001.c

 

5. Perl DBI

5.1 Perl DBI 란?

 

5.2 Perl DBI의 설치

 

  • Perl 지원 Perl `DBD'/`DBI' client code Perl 5.004 이후 버전을 사용해야한다.
  • Perl 관련 프로그램 세가지를 다운로드한다.('Data-Dumper', 'DBI', 'Msql-Mysql-modules') 'Data-Dumper', 'DBI', 'Msql-Mysql-modules' 순서대로 설치한다.
  • 압축된 패키지를 푼다.
  • shell> gunzip | tar xzvf Data-Dumper-VERSION.tar.gz 이렇게 하면 `Data-Dumper-VERSION' 디렉토리가 생긴다.
  • 생성된 디렉토리로 이동
  • shell> cd Data-Dumper-VERSION 2.9.3
  • 컴파일 하고 설치
  • shell> perl Makefile.PL
  • shell> make
  • shell> make test
  • shell> make install
  • 테스트 make test 특히 중요하다. 모든 모듈을 검증하기 때문이다.
  • 나머지지 두개 패키지 설치 나머지 'DBI', 'Msql-Mysql-modules' 위와 같은 방법으로 설치한다.

관련글 더보기