강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

First Guide to MySQL
작성자 : 13 김영철
등록날짜 : 2009.01.23 00:31
1,816

이 글은 예전에 (주)리눅스넷 에서 작성된 글로서 MySQL 을 처음 사용하는 분들에게는 상당한 도움이 될 것으로 판단되어 올리게 되었습니다. 이 글이 작성된 시점은 상당히 초창기로서 비교적 요즘의 MySQL 과는 약간의 차이점이 있을 수 있습니다. 그러나 기본적인 부분은 크게 다르지 않으므로 많은 도움이 될 것으로 생각됩니다. 참조하시기 바랍니다.

============================

 

MySQL First Guide

 

(주)리눅스넷 (LinuxNet)

 

이 문서는 MySQL 을 처음으로 사용하는 사람들이 조금이라도 편하게 볼만한, Guide 문서를 구하기 힘들어 직접 작성한 것이다. 모든 내용이 창조적인 내용은 아니며, 주로 MySQL 문서와 기존의 많은 분들이 고생해 놓은 문서들을 참조로하여 작성하였다. 이미 문서를 만든지 오래 되고 하여 어느분의 문서를 어떻게 참조로 했는지 일일이 기억을 하지 못하여, 여기에 언급은

못해도 그러한 모든 분들께 감사를 드리며 내용을 시작하고자 한다.

 

[colro=BLUE]1. DBMS( Database Management System) 개론

 

이장에서는 Database의 개념과 DBMS에 대해 간략하게 알아보도록 한다.

 

1.1 Databse 란

데이타 베이스는 궁극적으로 어떠한 목적을 가지고 구축되어진 데이타(DATA)들의 집합 이다. 이 집합은 계속해서 변화하고 이 변화속에 관심을 가지고 있는 데이타들만을 선택할수 있어야한다.

 

Database가 사용되기 전까지의 데이타의 저장과 활용은 일반적으로 파일 시스템에 의존적이였다. 이 파일 시스템은 특정 프로그램이나 특정 시스템에서만 사용이 가능하기 때문에 실시간적인 관리나 활용에 많은 문제점을 가지고 있다.

또한 요즘 같이 네트워크 기반에 시스템에서는 접근 권한적인 문제들이라던지 많은 문제점을 내포하고 있다.

 

주변을 보면 데이타 베이스의 예는 많이 볼수 있다. 대학에서의 학사관리, 은행에서의 입출금및 고개관리, 상점에서의 재고 관리, 회사의 인사관리등 많은 곳에서 사용하고 있으며 데이타베이스는 더욱더 많은 곳에 적용이 될것이다.

 

가령 예를 들어 학교에서 학사관리의 경우 학생의 정보를 데이타 베이스한다고 함은 매년 신입생과 졸업생으로 데이타가 갱신이 되며 학년별 정보라던지, 학과별 인원수라던지 하는 질의에 해결할수 있게 데이타가 모여져 있어야 한다.

 

1.2 Database의 필요성

 

요즘 같이 정보 홍수속에 살고 있는 시점에서 이런한 정보들을 저장하고 활용하기 위한 방안들을 필요로 한다. 정보를 많이 모아서 저장하는 것도 중요하지만 어떻게 활용하는 가도 매우 중요하며 또한 정보를 유지 보수하기 위한 방법들이 요구되어 진다.

 

컴퓨터의 발전으로 더 많은 데이타들을 저장할수 있는 매체들이 발전하였으며 저렴한 가격으로 소규모 데이타 베이스를 구축할수 있는 시점에 현재 와있는 상태이다. 최근에는 추가적으로 웹과 데이타 베이스 연동을 통해 인터넷상에 다양한 정보를 제공하고 있으며 다양한 툴들과 서버들이 개발되고 있다.

 

그럼 데이타 베이스를 구축하기 위해서는 어떠한 작업들이 선행되어야 할까? 먼저 데이타를 구축하는 목적을 철저히 파악한다. 즉 현실 세계를 데이타 베이스로 나타내기 위해 데이타의 집합을 분석하며, 상호 연관성에 대해서도 이해를 해야한다. 이 작업을 모델링이라고 하며 이 부분이 데이타 베이스이 구축의 거의 모든 부분이라 고 해도 관언이 아닐정도로 중요한 부분이다.

 

1.3 DBMS의 개요

 

우리는 이러한 Database을 합리적으로 운영하는 시스템을 DBMS라고 부른다. 운영한다고 함은 데이타 베이스를 생성하며, 갱신, 삭제, 사용자들로부터 질의에 응답 함은 물론 효율적으로 관리하는것까지 포함한다.

데이타베이스에는 동시에 여러명이 접속하여 질의를 하게 되므로 이것을 적절히 배분하고 동시 접근시 문제점이 있는 경우 해결할수 있는 방안이 요구되어진다.

Database <---> DBMS <---> 다수의 사용자, 응용 프로그램

현재는 아직 RDMBS(Relational Database System)가 중심적으로 이루어지고 있으나 점차 ODBMS( Object Database Syterm)의 형태도 사용이 되고있으며 PostgreSQL는 ORDBMS( Object Relational Database System)의 구조를 가지고 있다.

 

잘 알려진 DBMS는 Oracle, Informix, Sybase등이 있으며 Free Databse로는 PostgreSQL , MySQL, MSQL등 있다.

 

2. MySQL

 

이장에서는 웹과 연동시 최고의 성능과 간결한 데이타 베이스인 MySQL의 특징과 사용법에 대해서 알아 본다.

 

2.1 MySQL의 소개

 

MySQL는 멀티 유저, 멀티 쓰레드 SQL Database Server이다.

mysqld라는 서버 데몬을 통해 일반적인 서버/클라이언트 환경을 지원하며 표준 SQL을 지원한다. 하지만 최고의 성능을 내기 위해 표준 ANSI SQL 92을 전부 지원하고 있지는 않다. 웹과 데이타 베이스 연동을 위한 다양한 API을 지원하고 있고 쉬운 관리 툴 제공하고 있다.

 

벤치마크에서도 알수 있듯이 일반적인 DBMS보다 매우 빠르고 현재에도

많은 부분들이 속속히 추가되고있는 상태이다. MySQL에서 현재 처리할수 있는 테이블의 크기는 4G이다. 하지만 인텔용 리눅스는 최대 파일의 사이즈가 2G이므로 실제로 생성할수 있는 크기는 2G라고 할수있다.

 

2.2 라이센스

 

MySQL의 메인 홈페이지는 http://www.mysql.com이다.

 

자세한 라이센스는 홈페이지를 참고하기 바란다.

 

MySQL 라이센스 ( 요약 ) . 기본적으로 GPL 로 제공된다. . 만약 상용 프로그램을 개발하던지 또는 MySQL 자체를 자신들의 상용 프로그램 패키지의 일부로서 포함시키고자 하는 경우에는 상용 라이센스 를 구입할수 있다.

 

3.Mysql의 설치

 

이장에서는 MySQL의 설치방안과 구동 방법에 대해 알아본다.

 

3.1. RPM 설치

 

RPM( Red Hat Package Manager)는 레드햇사의 리눅스 배포본중 패키지 관리 툴이다. 이것이 이용하여 간단하게 MySQL을 설치및 제거, 업그레이드를 할수 있다.

 

MySQL rpm의 종류

- MySQL-VERSION.i386.rpm MySQL server에 대한 rpm - MySQL-client-VERSION.i386.rpm MySQL 클라이언트 프로그램으로 이것은 필수적인 패키지이므로 꼭 설치를 해야한다. - MySQL-bench-VERSION.i386.rpm 테스트와 벤치마크를 위한 패키지. - MySQL-devel-VERSION.i386.rpm MySQL 클라이언트를 개발할때 필요한 헤더파일과 라이브러리들을 가지고 있다. - MySQL-VERSION.src.rpm 위의 모든 패키지의 소스를 포함한 패키지 ( 알파 나 스팍에서 필요하다 ) - MySQL rpm의 설치. ( root로 작업한다. ) 1) 현재의 MySQL 패키지의 구성요서를 확인한다. shell> rpm -qpl MySQL-VERSION.i386.rpm | more 2) 현재 서버에 MySQL이 설치 되어있는지 확인한다. shell> rpm -q MySQL 3) 확인후 설치를 시작한다. shell> rpm -ivh MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm ( 만일 클라이언트 패키지만 설치할 경우 ) shell> rpm -ivh MySQL-client-VERSION.i386.rpm

 

RPM 패키지에서 MySQL의 base 디렉토리는 /var/lib/mysql로 지정되어 있다. 이 디렉토리의 하부에 데이타 베이스들이 생성되어지므로 만일 패키지를 업그레이드를 하는 경우 필히 이 디렉토리를 백업후 실행하도록 한다.

그리고 부팅시 자동으로 MySQL 서버를 가동하기 위해 /etc/rc.d/init.d에 스크립트가 저장되어진다. 부팅시 자동으로 mysqld을 수행할려면 /etc/rc.d/rc3.d에 추가하던가 ntsysv에서 추가를 한다.

 

3.2. 컴파일 설치

 

현재 배포되는 MySQL는 한글 Sorting을 지원하지 않는다. 이것을 사용하기 위해서는 필히 컴파일을 하여 사용하여야 한다.

1) MySQL-VERSION.src.rpm을 가지고 와서 설치를 한다. shell> rpm -ivh MySQL-VERSION.src.rpm 2) spec파일을 수정한다. shell> vi /usr/src/redhat/SPECS/mysql-VERSION.spec ...................................................... ................. 중 략 ......................... ...................................................... sh -c \PATH=$ \r CC=$ \r CFLAGS=${MYSQL_BUILD_CFLAGS:-\-O6 -fomit-frame-pointer\} \r CXX=$ \r CXXFLAGS=${MYSQL_BUILD_CXXFLAGS:-\-O6 -fomit-frame-pointer \r -felide-constructors -fno-exceptions -fno-rtti\} \r ./configure \r ...................................................... ................. 중 략 ......................... ...................................................... 안의 내용중에 --with-charset=euc_kr라는 부분을 추가. 3) rpm 빌더를 수행한다. shell> rpm -ba /usr/src/redhat/SPECS/mysql-VERSION.spec 4) 만들어진 패키지를 확힌후 설치한다. ( RPM설치를 참고 ) shell> ls /usr/src/redhat/RPMS/i386/MySQL-VERSION.rpm [참고] MySQL에서 한글 메세지를 볼수 있다. shell> vi /usr/bin/safe_mysqld 아래와 같이 추가를 해준다. ...................................................... ................. 중 략 ......................... ...................................................... echo \mysqld started on \ `date` >> $err_log while true do rm -f $MYSQL_UNIX_PORT $pid_file # Some extra safety if test \$#\ -eq 0 then nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \r --language=korean --skip-locking >> $err_log 2>&1 =================( 추가 ) else nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \r --language=korean --skip-locking \$@\ >> $err_log 2>&1 =================( 추가 ) fi ...................................................... ................. 중 략 ......................... ......................................................

 

4. MySQL의 구동과 유저 등록

 

이장에서는 MySQL의 시작과 종료, 유저 등록, 관리용 디비의 구조에 대해 알아본다.

 

4.1 서비스의 시작과 종료

 

구동)

shell> /etc/rc.d/init.d/mysql start

종료)

shell> /etc/rc.d/init.d/mysql stop

실제적으로 이 스크립트는 safe_mysqld라는 것을 실행시킵니다.

 

[참고]

업테이트 로그가 필요한 경우 safe_mysqld안에서 mysqld을 띠우는 부분에서 옵션을 추가한다.

 

-log-update=file_name : file_name.#의 형태로 매번 변경사항을 저장합니다.

-log, -l : hostname.log라는 파일로 계속 저장이 됩니다.

 

4.2 Mysql 관리용 툴

 

1) mysqladmin

 

Usage: mysqladmin [OPTIONS] command command....

-?, --help 도움말을 출력한다. -h, --host=... 특정 호스트에 연결 -p, --password[=...] 패스워드 입력 -P, --port=... 연결하고자 하는 서버의 포트번호 -S --socket=... Socket file to use for connection -S, --socket=... 소켓을 이용하여 연결 -u, --user=# 새로운 유저로 연결 -V, --version 버전을 보여준다. command: create databasename 데이타베이스를 생성한다. drop databasename 데이타베이스를 삭제한다. password new-password 새로운 패스워드를 입력 ping Check if mysqld is alive processlist Show list of active threads in server reload 권한을 다시 reload한다. shutdown 서버를 셧다운한다. status 현재의 상태를 보여준다. variables 설정된 값을 보여준다 version 버전을 보여준다. 2) mysqlshow - 현재의 테이타베이스 및 테이블의 내용을 보여준다. Usage: mysqlshow [OPTIONS] [database [table [field]]] -?, --help 도움말을 출력한다. -h, --host=... 특정 호스트에 연결 -p, --password[=...] 패스워드 입력 -P, --port=... 연결하고자 하는 서버의 포트번호 -S --socket=... Socket file to use for connection -S, --socket=... 소켓을 이용하여 연결 -u, --user=# 새로운 유저로 연결 -V, --version 버전을 보여준다. shell> mysqlshow +-----------+ | Databases | +-----------+ | mysql | | test | +-----------+ shell> mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ shell> mysqlshow mysql user Database: mysql Table: user Rows: 7 +-----------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------+------+-----+---------+-------+ | Host | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Password | char(16) | | | | | | 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 | | | Reload_priv | enum(\N\,\Y\) | | | N | | | Shutdown_priv | enum(\N\,\Y\) | | | N | | | Process_priv | enum(\N\,\Y\) | | | N | | | File_priv | enum(\N\,\Y\) | | | N | | | Grant_priv | enum(\N\,\Y\) | | | N | | | References_priv | enum(\N\,\Y\) | | | N | | | Index_priv | enum(\N\,\Y\) | | | N | | | Alter_priv | enum(\N\,\Y\) | | | N | | +-----------------+---------------+------+-----+---------+-------+

3) 기타

 

- mysqldump, mysqlimport 등은 뒤부분에서 하나씩 설명하기로 한다.

 

4.3 새로운 사용자 등록

 

1) MySQL의 인증 방법

일반적인 DBMS가 그러하듯이 시스템 사용자와 DBMS사용자는 같지 않다. 즉 유닉스 시스템에 계정을 가지고 있더라도 DBMS에 접근하기 위해서는 새로운 허가권이 필요 하다. 하지만 MySQL은 유저를 명시하지 않고 접근시 디폴트로 계정이름을 가지고 엑세스 가능 유무를 판단하게 되어있다.

또 이것은 만일 MySQL 사용자에 패스워드가 없는 경우 \-u\ 옵션을 통해 접근이 가능하다는 것을 의미한다. 그러므로 항상 패스워드를 걸어줘야 한다.

 

2) 인증 시스템의 구조

mysql이라는 데이타베이스내에 user, db, host, columns_priv, tables_priv라는 테이블의 조합으로 인증 시스템이 구성되어진다.

우선 각각 table에서 각 필드마다 권한의 의미를 알아보자.

HOST : 접근을 허용할 호스트를 말한다. 공백과 %\는 모든 호스트를 의미한다. User : char(16), 즉 16문자까지 지원한다. Password : 패스워드는 encypt되어 저장된다.( 유닉스 방식과는 틀리다.) Select_priv : select를 할수 있는 권한 Insert_priv : insert를 할수 있는 권한 Update_priv : Update를 할수 있는 권한 Delete_priv : Delete를 할수 있는 권한 Create_priv : 테이블, 데이타베이스, 인텍스를 생성할수 있는 권한 Drop_priv : 테이블, 데이타베이스를 삭제할수 있는 권한 Reload_priv : 권한 테이블들을 잘 reload Shutdown_priv : MySQL Server을 셧다운할수 있는 권한 Process_priv : MySQL 프로세스들을 제어할수 있는 권한 File_priv : 파일 엑세스 즉 LOAD, OUT FILE등을 할수 있는 권한 Grant_priv : 권한 수여를 할수 있는 권한 References_priv : 참조 권한? Index_priv : index을 사용할수 있는 권한 Alter_priv : 변경을 가할수 있는 권한 user 테이블에서 select_priv권한이 있으면 DB 테이블에서 Select_priv권한이 없더라 도 접근이 가능하다. 즉 user 테이블에서 권한 슈퍼 유저와 같은 Global 권한을 가짐 을 의미한다. 그러므로 유저 생성시 가능한 모든 권한을 막아 주는 것이 좋다. 권한의 가능 유무는 ( User table의 권한 ) OR ( Db and host ) OR ( tables_priv ) OR ( columns_priv ) 뒤에서 설명을 하겠지만 Grant라면 SQL문을 통해 아주 쉽게, 안전하게 유저를 등록할 수가 있다.

3) 인증의 절차

MySQL은 접근이 가능한 호스트인지 검사한 후 테이타베이스에 접근이 유효한 유저인지 구분하여 연결을 한후, 요구하는 명령이 허가되어있는지 검사를 하고 실행유무를 결정 한다.

 

4.4 mysql client을 통한 데이타베이스 서버 접근

 

1) mysqld 실행하기

shell> mysql [-h host_name] [-u user_name] [-pyour_pass]

host_name의 기본값은 localhost

user_name의 기본값은 Unix login name( 계정 )

-p 옵션이 없으면 패스워드가 없는것으로 인식한다.

[주의] -p옵션 뒤에는 공란이 없다. 즉 패스워드가 \pass123\일경우 \-ppass123\이다.

예)

shell> mysql -h localhost -u hoonix

shell> mysql -h LinuxNet

shell> mysql -u hoonix

shell> mysql

shell> mysql -u hoonix -p

Enter password:

 

2) 사용할수 있는 명령어

mysql> \elp MySQL commands: help (\) Display this text ? (\) Synonym for `help\ clear (\) Clear command connect () Reconnect to the server. Optional arguments are db and host edit (\) Edit command with $EDITOR exit (\) Exit mysql. Same as quit go (\) Send command to mysql server ego (\) Send command to mysql server; Display result vertically print (\) Print current command quit (\) Quit mysql rehash (\) Rebuild completion hash status (\) Get status information from the server use (\) Use another database. Takes database name as argument

4.5 새로운 유저의 등록

 

두가지 방법으로 가능하다.

 

1) mysql 데이타베이스에 접근하여 insert을 통해 입력하는 방법

Db, User 등 데이블을 SQL을 통해 조작하는 방법을 말한다.

이 방법은 매번 번거롭고 사용자가 실수를 할수 있으므로 별로 권장하지 않는다. 하지만 권한 시스템이 어떻게 동작하는 지는 알기 위해 한번쯤은 각각의 테이블의 내용을 보기 바란다.

 

2) grant 을 이용하는 방법

mysql> GRANT SELECT

ON intra.*

TO hoonix@localhost

IDENTIFIED BY \pass123\;

- hoonix라는 local 사용자에게 board라는 테이타 베이스에 select 권한을 주었다.

특정 테이블만을 주고 싶다면 intra.board라고 적으면 되며 local아닌 특정 호스트인

경우 hoonix@linuxnet.co.kr 와 같이 적어준다.

mysql> FLUSH PRIVILEGES; ----------------- 새로운 패스워드를 적용시키기 위해서는 꼭 해줘야 한다.

 

3) 패스워드의 변경

패스워드의 변경은 오직 root와 허가된 사람만이 가능하다.

shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD(\new_password\) WHERE user=\user_name\; mysql> FLUSH PRIVILEGES;

[주의]

다시 한번 강조하지만 MySQL을 처음으로 시작할때 꼭 MySQL의 root계정에 패스워드를 꼭 입력하기 바란다. 대부분의 사용자들이 이부분에 소홀하다. 또한 새로운 사용자를 추가할때마다 마찬가지로 패스워드를 꼭 넣어주는 습관을 가지자

덧글쓰기 | 엮인글 쓰기 download.asp?FileID=1888408이 포스트를..
네이버

5. MySQL의 column types

 

이장에서는 다양한 column type들과 그 예를 배운다.

 

5.1 수치 데이타 타입

M : 표시할수 있는 최대 사이즈. 최대 255 D : 소수점이하의 숫자 갯수 - TINYINT[(M)] [UNSIGNED] [ZEROFILL] 정수형(1 byte)으로 -128부터 127까지. unsigned로 사용시 0부터 255 - SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 정수형(2 byte)으로 -32768부터 32767까지. unsigned로 사용시 0부터 65535 - MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 정수형(3 byte)으로 -8388608부터 8388607까지. unsigned로 사용시 0부터 16777215 - INT[(M)] [UNSIGNED] [ZEROFILL] 정수형(4 byte)으로 -2147483648부터 214748364까지. unsigned로 사용시 0부터 4294967295 - INTEGER[(M)] [UNSIGNED] [ZEROFILL] 위의 INT와 같다. - BIGINT[(M)] [UNSIGNED] [ZEROFILL] 정수형(8 byte)으로 -922337203685477580 부터 9223372036854775807까지. unsigned로 사용시 0부터 18446744073709551615 - FLOAT(precision) [ZEROFILL] 부동 소수(4,8 byte) , unsinged는 사용할수 없다. precision은 4또는 8 FLOAT(4)는 일반적인 FLOAT형이며 FLOAT(8)는 DOUBLE형이라고 생각하면 된다. - FLOAT[(M,D)] [ZEROFILL] 부동소수 (4byte) , unsigned는 사용할수 없다. -3.402823466E+38 에서 -1.175494351E-38, 0 그리고 1.175494351E-38 에서 3.402823466E+38. - DOUBLE[(M,D)] [ZEROFILL] 부동소수 (8byte) , unsigned는 사용할수 없다. -1.7976931348623157E+308에서 -2.2250738585072014E-308, 0 그리고 2.2250738585072014E-308에서 1.7976931348623157E+308. - DOUBLE PRECISION[(M,D)] [ZEROFILL] (8 byte) - REAL[(M,D)] [ZEROFILL] DOUBLE 과 같다. - DECIMAL(M,D) [ZEROFILL] (M byte)unpacked floating-point number, unsigned는 사용할수 없다. 이것은 각각의 숫자를 CHAR로 저장한다. - NUMERIC(M,D) [ZEROFILL] DECIMAL과 같다. [b]5.2 문자 테이타 타입[/b] - CHAR(M) [BINARY] 문자의 수가 M인 문자열 - VARCHAR(M) [BINARY] 문자의 수가 최대 M인 문자열 - TINYBLOB 255 (2^8 - 1)문자. - TINYTEXT 255 (2^8 - 1)문자. - TEXT 65535 (2^16 - 1)문자. - BLOB ( Binary Large OBject ) 65535 (2^16 - 1)문자. - MEDIUMBLOB 16777215 (2^24 - 1)문자. - MEDIUMTEXT 16777215 (2^24 - 1)문자. - LONGBLOB 4294967295 (2^32 - 1)문자. - LONGTEXT 4294967295 (2^32 - 1)문자. [참고 ] - 모든 문자는 \ 또는 \ 로 묶어 준다. C에서의 같이 \\는 문자열 안에서 특수한 의미를 가진다. \0 NULcharacter. \n newline character. \t tab character. \r carriage return character. \b backspace character. \ single quote (`\) character. \ double quote (`\) character. \ backslash (`\) character. \% `%\ character. 이것은 like문안에서 모든 문자를 의미한다. \_ A `_\ character. 이것은 like문안에서 한 문자를 의미한다. [b]5.3 날짜와 시간 데이타 타입[/b] - DATE 날짜(3 byte), \1000-01-01\에서 \9999-12-31\. - DATETIME 날짜와 시간(8 byte), \1000-01-01 00:00:00\에서 \9999-12-31 23:59:59\. - TIMESTAMP[(M)] timestamp(4 byte). 유닉스 타임으로 1970년부터 1초단위로 시간을 표시한다. \1970-01-01 00:00:00\에서 2037. YYYYMMDDHHMMSS => TIMESTAMP(14) YYMMDDHHMMSS => TIMESTAMP(12) YYYYMMDD => TIMESTAMP(8) YYMMDD => TIMESTAMP(6) - TIME 시간(3 byte), \-838:59:59\에서 \838:59:59\. - YEAR 년도(1 byte), 1901에서 2155, 그리고 0000. 5.5 기타 --------- - ENUM(\value1\,\value2\,...) 목록, value는 문자형 타입이다. 그리고 여러개의 값중 오로지 한가지의 값만이 저장 된다. NULL도 가질수 있다. 최고 65535 - SET(\value1\,\value2\,...) 집합. 0부터 64개까지의 멤버를 가질수 있다.

 

6. MySQL에서 SQL( Standed Query Language)

 

이장에선 MySQL에서 지원하는 SQL과 확장된 SQL에 대해 알아보기로 한다.

 

6.1 CREATE DATABASE syntax

 

* CREATE DATABASE db_name

 

db_name라는 이름을 가지는 데이타베이스를 생성한다.

실제로 MySQL Data 디렉토리내에 이름이 db_name인 디렉토리를 생성한다.

 

rpm인 경우 /var/lib/mysql/db_name

 

예)

mysql> CREATE DATABASE school;

또는

shell> mysqladmin CREATE school

 

실제로 확인을 해보자

 

shell> ls -l /var/lib/mysql/school

 

6.2 DROP DATABASE syntax

 

* DROP DATABASE [IF EXISTS] db_name

 

db_name라는 이름을 가지는 데이타베이스를 삭제한다.

마찬가지로 /var/lib/mysql/db_name을 삭제한다.

 

6.3 CREATE TABLE syntax

 

* CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] or PRIMARY KEY (index_col_name,...) or KEY [index_name] KEY(index_col_name,...) or INDEX [index_name] (index_col_name,...) or UNIQUE [INDEX] [index_name] (index_col_name,...) - NULL 널과 0는 의미가 다른다. NULL는 값이 아예 저장되지 않은 상태, 즉 입력을 받지 않은 상태이며 0라는 값을 받은 상태이며 empty string도 마찬가지이다. - DEFAULT 하나의 레코드를 생성할때 값이 지정되지 않았을 경우 이 디폴트 값을 저장한다. - AUTO_INCREMENT 이것은 테이블마다 오직 한개만, 항상 NOT NULL, 수치 데이타 형만 가능, insert 시 마지막 값에 하나를 더해 저장. 마지막 값이 삭제 되었을 경우 그 값을 다시 사용가능. PostgreSQL에서는 Sequence로 처리. - PRIMARY KEY 자동으로 unique key을 생성하고 항상 NOT NULL이어야 한다. 한 테이블에 한개 - KEY index와 같다. - INDEX 테이타베이스의 성능을 높이기 위해 사용, 인덱스는 따로 관리 되어지며 시스템은 만들어진 인덱스를 이용하고 유지한다. 데이타베이스의 공간이 더 많이 필요하게 되고 INSERT나 UPDATE시 느려지는 단점이 있어 가능한 최소의 인덱스를 생성하여야 한다. - type : 5장의 컬럼 타입 참고 - index_col_name : col_name - select_statement : [IGNORE | REPLACE] SELECT ... 예) CREATE TABLE student ( no SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(20), last_name VARCHAR(20), age TINYINT, birth DATE, d_no SMALLINT ) CREATE TABLE depart ( d_no TINYINT NOT NULL, dept_name VARCHAR(20), PRIMARY KEY (d_no) );

 

6.4 ALTER TABLE syntax

 

ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] or ADD INDEX [index_name] (index_col_name,...) or ADD PRIMARY KEY (index_col_name,...) or ADD UNIQUE [index_name] (index_col_name,...) or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} or CHANGE [COLUMN] old_col_name create_definition or MODIFY [COLUMN] create_definition or DROP [COLUMN] col_name or DROP PRIMARY KEY or DROP INDEX key_name or RENAME [AS] new_tbl_name or table_option - CHANGE는 컬럼 이름까지 바꿀때 - MODIFY는 컬럼 이름외에 바꿀때 - 변경시 여러가지 조건에 맞는 지 항상 고려해봐야한다. 예) mysql> ALTER TABLE student RENAME std; mysql> ALTER TABLE std MODIFY dept TINYINT; mysql> ALTER TABLE std ADD sex ENUM( \x\,\y\) DEFAULT \x\; 6.5 DROP TABLE syntax --------------------- DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] 테이블 tbl_name을 삭제한다. 예) mysql> DROP TABLE std;

 

6.6 INSERT syntax

 

* INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

[INTO] tbl_name [(col_name,...)]

VALUES (expression,...),(...),...

or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

[INTO] tbl_name

SET col_name=expression, col_name=expression, ...

 

- LOW_PRIORITY 옵션은 입력하고자하는 테이블이 다른 클라이언트가 접근해있으며

기다렸다가 접근이 없을시에 INSERT을 수행한다.

 

- DELAYED 옵션은 LOCK을 거는 효과를 낸다.

 

- IGNORE 옵션은 입력시 PRIMARY, UNIQUE key 가 중복 될때 무시하고 계속 입력을

하게 한다.. 이 옵션이 없는 경우 입력은 중단된다.

 

예)

 

mysql> INSERT INTO std VALUES ( \, \길동\, \홍\, \20\, \1980-1-1\, \1\, \);

Query OK, 1 row affected (0.01 sec)

 

mysql> SELECT * FROM std;

+----+------------+-----------+------+------------+------+------+

| no | first_name | last_name | age | birth | dept | sex |

+----+------------+-----------+------+------------+------+------+

| 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | |

+----+------------+-----------+------+------------+------+------+

1 row in set (0.00 sec)

[/pre]

 

- 앞에서 테이블을 만들때 sex의 default는 \x\이지만 디폴트 값은 입력하는 값이 없을 경우에 한해서 적용된다. 즉 \은 empty string을 의미한다.

- 위의 경우와 달리 no 컬럼은 auto_increment로 선언이 되어있기 때문에 \을 사용 하면 자동적으로 맨 마지막의 값에 1을 증가한 값을 더해 저장이 되어진다.

( 뒤장의 select에서 NULL의 의미를 다시 알아본다. )

mysql> INSERT INTO std ( first_name, last_name, birth, d_no) VALUES -> ( \기철\, \홍\, \1976-10-23\,\2\); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | NULL | 1976-10-23 | 2 | x | +----+------------+-----------+------+------------+------+------+ 2 rows in set (0.01 sec) mysql> INSERT INTO std(\,\기자\,\홍\,\22\,\1978-2-1\,\2\,NULL), (\,\기순\,\홍\,21,\1979-9-24\,\1\, \y\); Query OK, 2 rows affected (0.19 sec) 레코드: 2개 중복: 0개 경고: 2개 mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | 24 | 1976-10-23 | 2 | x | | 3 | 기자 | 홍 | 22 | 1978-02-01 | 2 | NULL | | 4 | 기순 | 홍 | 21 | 1979-09-24 | 1 | y | +----+------------+-----------+------+------------+------+------+ 4 rows in set (0.01 sec) mysql> INSERT INTO depart VALUES (1,\컴퓨터공학과\),(2,\전자계산학과\); Query OK, 2 rows affected (0.38 sec) 레코드: 2개 중복: 0개 경고: 0개 mysql> select * from depart; +----+--------------+ | d_no | dept_name | +----+--------------+ | 1 | 컴퓨터공학과 | | 2 | 전자계산학과 | +----+--------------+ 2 rows in set (0.03 sec) [주의] 아래와 같은 경우중 두번째는 NULL이 입력되므로 주의하기 바란다. mysql> INSERT INTO std ( age, dept ) VALUES ( 10, age*2); Query OK, 1 row affected (0.22 sec) mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | 24 | 1976-10-23 | 2 | x | | 3 | NULL | NULL | 10 | NULL | 20 | x | +----+------------+-----------+------+------------+------+------+ 3 rows in set (0.01 sec) mysql> INSERT INTO std ( age, d_no ) VALUES ( d_no*2, 10); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | 24 | 1976-10-23 | 2 | x | | 3 | NULL | NULL | 10 | NULL | 20 | x | | 4 | NULL | NULL | NULL | NULL | 10 | x | +----+------------+-----------+------+------------+------+------+ 4 rows in set (0.01 sec) 6.7 DELETE syntax ----------------- * DELETE [LOW_PRIORITY] FROM tbl_name [WHERE where_definition] [LIMIT rows] tbl_name에서 조건에 맞는 레코드를 삭제한다. mysql> DELETE FROM std WHERE no >=3; Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | 24 | 1976-10-23 | 2 | x | +----+------------+-----------+------+------------+------+------+ 2 rows in set (0.00 sec)

[ 주의 ]

 

- 만일 where절에 조건을 적지 않으면 모든 레코드가 삭제 되어버린다.

 

6.8 SELECT syntax

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | DISTINCTROW | ALL] select_expression,... [INTO OUTFILE \file_name\ export_options] [FROM table_references [WHERE where_definition] [GROUP BY col_name,...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] ] - AS는 alias이고 이 alias는 order by나 having, group by에서 사용할 수 있다. mysql> SELECT concat(last_name,,first_name) AS full_name FROM std ORDER BY full_name; +-----------+ | full_name | +-----------+ | 홍기철 | | 홍길동 | +-----------+ 위와 같이 alias인 full_name은 하나의 필드와 같이 취급되어 진다. - table-references는 JOIN syntax를 통해 만들어질수도 있다. (JOIN 참고) - order by는 col_name에 맞추어 정렬한다. (Descending, Ascending) - DISTINCT 또는 DISTINCTROW는 중복된 컬럼은 제거하고 보여준다. - LIMIT는 select된 rows을 특정 부분을 넘겨준다. ( 인자는 숫자만 ) 인자가 하나일 경우 : 아래쪽부터 인자만큼 인자가 두개일 경우 : 인자를 초과해서 두번째 인자만큼 mysql> select * from std LIMIT 1; mysql> select * from table LIMIT 1,1; - SELECT ... INTO OUTFILE \file_name\은 출력을 파일로 하는 방법으로 뒤에서 배울 LOAD문하고 유사하다. 뒤에 LOAD문에서 다시 상세히 설명하도록한다. [ 참고 ] select와 where에서 쓸수 있는 비교 연산자와 간단한 함수 mysql> select 2 > 2; +-------+ | 2 > 2 | +-------+ | 0 | +-------+ mysql> select 2 >=2 ; +-------+ | 2 >=2 | +-------+ | 1 | +-------+ mysql> select 2 <2 ; +------+ | 2 <2 | +------+ | 0 | +------+ mysql> select 2 <= 2 ; +--------+ | 2 <= 2 | +--------+ | 1 | +--------+ mysql> select 2 <> 2 ; +--------+ | 2 <> 2 | +--------+ | 0 | +--------+ mysql> select 2 != 2 ; +--------+ | 2 != 2 | +--------+ | 0 | +--------+ mysql> select 2 = \2\ ; +---------+ | 2 = \2\ | +---------+ | 1 | +---------+ * 위와 같이 String인 경우 숫자로 전환하여 비교한다. mysql> select \홍길동\ like \_길동\; +-----------------------+ | \홍길동\ like \_길동\ | +-----------------------+ | 0 | +-----------------------+ mysql> select \홍길동\ like \__길동\; +------------------------+ | \홍길동\ like \__길동\ | +------------------------+ | 1 | +------------------------+ mysql> select \홍길동\ like \%길동\; +-----------------------+ | \홍길동\ like \%길동\ | +-----------------------+ | 1 | +-----------------------+ mysql> select \홍길동\ like \%동\; +---------------------+ | \홍길동\ like \%동\ | +---------------------+ | 1 | +---------------------+ * 그외의 다양한 함수는 메뉴얼을 참고한다. - AS는 alias이고 이 alias는 order by나 having, group by에서 사용할 수 있다. mysql> select concat(last_name,first_name) AS full_name from std ORDER BY full_name; +-----------+ | full_name | +-----------+ | 홍기철 | | 홍길동 | +-----------+ 위와 같이 alias인 full_name은 하나의 필드와 같이 취급되어 진다. - table-references는 JOIN syntax를 통해 만들어질수도 있다. (JOIN 참고) - order by는 col_name에 맞추어 정렬한다. (Descending, Ascending , Descending) - group by는 해당되는 컬럼의 값으로 그룹을 묶어준다. - having 은 group by로 나온 결과에 대한 조건식을 명시한다. ( having과 group by는 뒤에 다시 언급하기로 한다. ) - DISTINCT 또는 DISTINCTROW는 중복된 컬럼은 제거하고 보여준다. - LIMIT는 select된 rows을 특정 부분을 넘겨준다. ( 인자는 숫자만 ) 인자가 하나일 경우 : 아래쪽부터 인자만큼 인자가 두개일 경우 : 인자를 초과해서 두번째 인자만큼 mysql> select * from table LIMIT 5,10; # Retrieve rows 6-15 mysql> select * from table LIMIT 5; # Retrieve first 5 rows - SELECT ... INTO OUTFILE \file_name\은 출력을 파일로 하는 방법으로 뒤에서 배울 LOAD문하고 유사하다. 뒤에 LOAD문에서 다시 상세히 설명하도록한다. [참고] NULL의 의미 - NULL이란 데이타의 입력이 없다는 뜻이다. 이것은 한번 입력 0이나 \의 의미와는 다른 뜻이다. 궁극적으로 입력을 받지 않았다는 뜻이며 이것의 구분은 데이타 베이스 에서는 매우 중요하다. 실제 예로 알아보기로 하자. mysql> SELECT * FROM std WHERE sex IS NULL; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 3 | 기자 | 홍 | 22 | 1978-02-01 | 2 | NULL | +----+------------+-----------+------+------------+------+------+ 1 row in set (0.04 sec) mysql> SELECT * FROM std WHERE sex = \; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | d_no | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | +----+------------+-----------+------+------------+------+------+ 1 row in set (0.01 sec) [중요] * IS NULL은 NULL을 체크하는 연산자이다. 이것 대신 NULL을 체크하기 위해 \=\ 연산자를 사용하지 않도록 주의하자.

 

6.9 LOAD DATA INFILE syntax

 

LOAD DATA [LOCAL] INFILE \file_name.txt\ [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY \t\] [OPTIONALLY] ENCLOSED BY \] [ESCAPED BY \\ ]] [LINES TERMINATED BY \n\] [IGNORE number LINES] [(col_name,...)] - SQL문이 아닌 특정 파일로부터 core파일을 읽어 들인다. - 이것은 SQL문으로 쓰여진 외부 파일로부터 입력을 받은 것보다 매우 빠르게 입력이 된다. 만일 대용량의 데이타를 입력을 하는 경우 꼭 이것을 사용해야한다. - mysqlimport 와 같다. ( 8장에서 다시 설명) - 이것은 4.3절에서 말한것과 같이 file 권한이 꼭 있어야한다. - file의 work 디렉토리는 해당 database가 존재하는 물리적 디렉토리이다. 그러므로 현재의 자신의 계정에 있는 파일을 입력할때는 절대경로를 사용하는 것이 좋다. 예) shell> vi std.dat \N 철수 이 33 1968-3-21 2 x \N 순이 김 33 1968-12-24 1 y \N 영수 박 34 1967-5-14 2 x ~ - 한 컬럼후 TAB으로 나누어 준다. - 문자열이라고 \로 묶지 않도록 한다. - NULL은 \N mysql> LOAD DATA INFILE \/root/std.dat\ INTO TABLE std; Query OK, 3 rows affected (0.01 sec) 레코드: 3개 삭제: 0개 스킵: 0개 경고: 3개 mysql> SELECT * FROM std; +----+------------+-----------+------+------------+------+------+ | no | first_name | last_name | age | birth | dept | sex | +----+------------+-----------+------+------------+------+------+ | 1 | 길동 | 홍 | 20 | 1980-01-01 | 1 | | | 2 | 기철 | 홍 | 24 | 1976-10-23 | 2 | x | | 3 | 기자 | 홍 | 22 | 1978-02-01 | 2 | NULL | | 4 | 기순 | 홍 | 21 | 1979-09-24 | 1 | y | | 7 | 영수 | 박 | 34 | 1967-05-14 | 2 | x | | 6 | 순이 | 김 | 33 | 1968-12-24 | 1 | y | | 5 | 철수 | 이 | 33 | 1968-03-21 | 2 | x | +----+------------+-----------+------+------------+------+------+ 7 rows in set (0.00 sec) [참고] SELECT select_expression,... FROM table_name INTO OUTFILE \file_name.txt\ [FIELDS [TERMINATED BY \t\] [OPTIONALLY] ENCLOSED BY \] [ESCAPED BY \\ ]] [LINES TERMINATED BY \n\] - 실제적인 work 디렉토리는 위에서 말한바와 같으므로 해당 디렉토리에서 OUTFILE을 찾으면 된다. mysql> SELECT * FROM std INTO OUTFILE \std_out.txt\ ; - 파일로 출력된 것을 확인해보자. shell> vi /var/lib/mysql/school/std_out.txt 1 길동 홍 20 1980-01-01 1 2 기철 홍 24 1976-10-23 2 x 3 기자 홍 22 1978-02-01 2 \N 4 기순 홍 21 1979-09-24 1 y 7 영수 박 34 1967-05-14 2 x 6 순이 김 33 1968-12-24 1 y 5 철수 이 33 1968-03-21 2 x ~

 

6.10 JOIN syntax

 

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_list)

 

- 조인은 두개의 테이블에서 특정한 조건을 만족하는 각각의 컬럼들을 합쳐서 만든다.

- select문에서 사용할수 있다.

- OUT JOIN은 조건을 만족하지 못하더라도 그 값을 필요로 할때 사용할수 있다.

 

예)

 

mysql> INSERT INTO std SET First_name= \말자\, last_name = \이\;

 

mysql> SELECT concat( std.last_name, std.first_name ) AS Name,

-> depart.dept_name AS department FROM std, depart WHERE std.d_no=depart.d_no;

+--------+--------------+

| Name | department |

+--------+--------------+

| 홍길동 | 컴퓨터공학과 |

| 홍기순 | 컴퓨터공학과 |

| 김순이 | 컴퓨터공학과 |

| 홍기철 | 전자계산학과 |

| 홍기자 | 전자계산학과 |

| 박영수 | 전자계산학과 |

| 이철수 | 전자계산학과 |

+--------+--------------+

7 rows in set (0.00 sec)

 

mysql>SELECT concat( std.last_name, std.first_name ) AS Name,

->depart.dept_name AS department FROM std join depart

->WHERE std.d_no=depart.d_no;

+--------+--------------+

| Name | department |

+--------+--------------+

| 홍길동 | 컴퓨터공학과 |

| 홍기순 | 컴퓨터공학과 |

| 김순이 | 컴퓨터공학과 |

| 홍기철 | 전자계산학과 |

| 홍기자 | 전자계산학과 |

| 박영수 | 전자계산학과 |

| 이철수 | 전자계산학과 |

+--------+--------------+

7 rows in set (0.00 sec)

 

- OUTER JOIN의 예

 

mysql> SELECT concat( std.last_name, std.first_name ) AS Name,

-> depart.dept_name AS department

-> FROM std LEFT OUTER JOIN depart USING (d_no);

+--------+--------------+

| Name | department |

+--------+--------------+

| 홍길동 | 컴퓨터공학과 |

| 홍기철 | 전자계산학과 |

| 홍기자 | 전자계산학과 |

| 홍기순 | 컴퓨터공학과 |

| 이말자 | NULL |

| 박영수 | 전자계산학과 |

| 김순이 | 컴퓨터공학과 |

| 이철수 | 전자계산학과 |

+--------+--------------+

8 rows in set (0.01 sec)

 

mysql> select concat( std.last_name, std.first_name ) AS Name,

-> depart.dept_name AS department

-> from depart left outer join std using (d_no);

+--------+--------------+

| Name | department |

+--------+--------------+

| 홍길동 | 컴퓨터공학과 |

| 홍기순 | 컴퓨터공학과 |

| 김순이 | 컴퓨터공학과 |

| 홍기철 | 전자계산학과 |

| 홍기자 | 전자계산학과 |

| 박영수 | 전자계산학과 |

| 이철수 | 전자계산학과 |

+--------+--------------+

7 rows in set (0.00 sec)

 

- LEFT의 의미를 파악할수 있을 것이다.

[/pre]

 

6.11 UPDATE syntax

 

UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,... [WHERE where_definition] - 해당하는 레코드를 변경한다. - 한번 입력된 레코드는 오로지 UPDATE로만 변경이 가능하다. mysql> UPDATE std SET sex=x where no=1; [주의] - 능숙하게 SQL을 사용하는 사람이라도 가끔씩은 where절을 빠뜨리는 경우가 있다. 이때는 모든 레코드들이 영향을 받으므로 UPDATE, DELETE 명령은 주의해서 사용하자. 6.12 SHOW syntax (Get information about tables, columns,...) ------------------------------------------------------------ SHOW DATABASES or SHOW TABLES [FROM db_name] or SHOW COLUMNS FROM tbl_name [FROM db_name] or SHOW INDEX FROM tbl_name [FROM db_name] or SHOW STATUS or SHOW VARIABLES [LIKE wild] or SHOW PROCESSLIST or SHOW TABLE STATUS [FROM db_name] [LIKE wild] - 데이타베이스의 정보를 보여준다. F mysql> SHOW DATABASES; +-----------+ | Database | +-----------+ | school | | test | +-----------+ 2 rows in set (0.00 sec) mysql> SHOW TABLES; +------------------+ | Tables in school | +------------------+ | depart | | std | +------------------+ 2 rows in set (0.00 sec) mysql> SHOW COLUMNS FROM std; +------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+----------------+ | no | smallint(6) | | PRI | 0 | auto_increment | | first_name | varchar(20) | YES | | NULL | | | last_name | varchar(20) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | birth | date | YES | | NULL | | | d_no | tinyint(4) | YES | | NULL | | | sex | enum(\x\,\y\) | YES | | x | | +------------+---------------+------+-----+---------+----------------+ 7 rows in set (0.01 sec) mysql> SHOW INDEX FROM std; +-----+----------+--------+------------+-----------+---------+-----------+---------+ |Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality|Sub_part | +-----+----------+--------+------------+-----------+---------+-----------+---------+ | std | 0 |PRIMARY | 1 | no | A | 8 | NULL | +-----+----------+--------+------------+-----------+---------+-----------+---------+ 1 row in set (0.01 sec) 6.13 USE db_name ----------------- 사용할 데이타 베이스를 db_name으로 바꾼다. mysql> USE test; mysql> show tables; Empty set (0.00 sec) mysql> USE school; mysql> show tables; +------------------+ | Tables in school | +------------------+ | depart | | std | +------------------+ 2 rows in set (0.01 sec)

 

6.14 DESCRIBE syntax (Get information about columns)

 

{DESCRIBE | DESC} tbl_name {col_name | wild} SHOW COLUMNS FROM과 유사하다.

 

6.15 LOCK TABLES/UNLOCK TABLES syntax

 

LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE} [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...] ... UNLOCK TABLES

 

- table을 LOCK, UNLOCK한다.

- mysql은 거의 모든 작업들을 테이블 단위로 이루어진다. ( 아직 컬럼단위는 아니다.)

- 테이블을 READ LOCK을 걸면 자신을 포함한 다른 쓰레드들은 오직 READ만 할수 있다.

- WRITE LOCK을 걸면 다른 쓰레드에게 write와 read도 불가능한다. ( 자신은 가능)

- 다른 쓰레드들은 자신이 참조할려는 테이블이 LOCK이 걸려 있으면 풀리기을 기다린다.

- 정확한 처리를 위해서는 필요한 부분이므로 충분히 이해와 개념을 잡기

바란다.

 

예제)

 

가령 예를 들어 은행의 입출금의 경우를 생각해보자.

출금의 경우는 먼저 잔액이 있는 지를 확인하는 작업이 이루어진후, 잔액에 여유가 있는 경우 거래가 이루어진다. 하지만 A라는 구좌에 100만원이 있는 경우 B라는 사람이 먼저 100만원을 출금한다고 하자. 우선 구좌에 현금이 있는 지 확인을 할것이다. 현재는 잔고가 100만원이 있기 때문에 거래가 성사되어진다. 하지만 확인을 하는 시점에서 또라는 C라는 사람이 50만월을 출금할려고 한다면 이 사람도 현재 잔액이 100만원이 있다는 사실을 알고 출금을 할려고 할것이다. 정상적인 거래라고 하면 C라는 사람의 거래는 성사되지 않아야 할것이다. 하지만 위와 같은 경우 150만원이 출금되고도 잔액이 50만원이 남아 있는 불상사가 있어날 확률이 있다.

이런 경우에는 먼저 확인한 프로세스가 write LOCK을 사용함으로써 안정하게 거래가 이루어질 수 있다.

에) mysql> LOCK TABLES std READ; Query OK, 0 rows affected (0.01 sec) mysql> SELECT first_name ,age FROM std WHERE d_no=1; +------------+------+ | first_name | age | +------------+------+ | 길동 | 20 | | 기순 | 21 | | 순이 | 33 | +------------+------+ mysql> INSERT INTO std SET d_no=\1\; ERROR 1099: 테이블 \std\는 READ 락이 잠겨있어서 갱신할 수 없습니다. mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO std SET d_no=\1\; Query OK, 1 row affected (0.01 sec) mysql> SELECT first_name ,age FROM std WHERE d_no=1; +------------+------+ | first_name | age | +------------+------+ | 길동 | 20 | | 기순 | 21 | | 순이 | 33 | | NULL | NULL | +------------+------+

 

- 다른 쓰레드에서선 SELECT는 되지만 INSERT라던지 UPDATE는 LOCK을 풀리기만을 기다린다.

mysql> LOCK TABLES std WRITE; mysql> SELECT first_name ,age FROM std WHERE d_no=1; +------------+------+ | first_name | age | +------------+------+ | 길동 | 20 | | 기순 | 21 | | 순이 | 33 | | NULL | NULL | +------------+------+ mysql> SELECT first_name ,age FROM std WHERE d_no=1; +------------+------+ | first_name | age | +------------+------+ | 길동 | 20 | | 기순 | 21 | | 순이 | 33 | | NULL | NULL | | NULL | NULL | +------------+------+ mysql> UNLOCK TABLES;

- LOCK을 해제하기전에 다른 쓰레드에서 쿼리를 주면 LOCK이 풀리기만을 기다리는것을 볼 수 있다.

 

 

6.16 GRANT and REVOKE syntax

 

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY \password\] [, user_name [IDENTIFIED BY \password\] ...] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...] - GRANT : 권한 부여 - REVOKE : 권한 삭제 - priv_type : SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX, ALTER - priv_type : SELECT, INSERT, UPDATE. ( 컬럼인 경우 ) - user_name : user@host ( ex: hoonix@%.linxnet.co.kr ) mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON intra.* -> TO hoonix@localhost -> IDENTIFIED BY \pass1234\

 

6.17 CREATE INDEX syntax

 

CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length]),... )

 

- 인텍스를 생성한다. 멀티 인텍스도 생성할수 있다.

- CHAR, VARCHAR, TEXT, BLOB등은 자료의 일부분으로 인텍스를 생성할수 있다.

mysql>delete from std where no > 8; mysql> CREATE INDEX name ON std (first_name); Query OK, 8 rows affected (0.03 sec) 레코드: 8개 중복: 0개 경고: 0개 mysql> SHOW INDEX FROM std; +-----+----------+--------+------------+-----------+---------+-----------+---------+ |Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality| Sub_part| +-----+----------+--------+------------+-----------+---------+-----------+---------+ | std | 0 |PRIMARY | 1 | no | A | 8 | NULL | | std | 1 | name | 1 |first_name | A | NULL | NULL | +-----+----------+--------+------------+-----------+---------+-----------+---------+ 2 rows in set (0.00 sec) [주의] index을 삭제할때는 DROP INDEX가 아닌 ALTER TABLE을 사용해야한다. mysql> ALTER TABLE std DROP INDEX name; Query OK, 8 rows affected (0.02 sec) 레코드: 8개 중복: 0개 경고: 0개 mysql> show index from std; +-----+----------+--------+------------+-----------+---------+-----------+---------+ |Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality| Sub_part| +-----+----------+--------+------------+-----------+---------+-----------+---------+ |std | 0 |PRIMARY | 1 | no | A | 8 | NULL | +-----+----------+--------+------------+-----------+---------+-----------+---------+ 1 row in set (0.00 sec) 6.18 select에서 group by와 having의 예 -------------------------------------- - 성(last_name)별 인원 출력 mysql> SELECT last_name , count(*) AS no FROM std -> GROUP BY last_name ORDER BY no; +-----------+----+ | last_name | no | +-----------+----+ | 김 | 1 | | 박 | 1 | | 이 | 2 | | 홍 | 4 | +-----------+----+ 4 rows in set (0.01 sec) - 위의 결과중 윈원이 2이상인것만 출력 mysql> SELECT last_name , count(*) AS no FROM std -> GROUP BY last_name HAVING no >= 2 +-----------+----+ | last_name | no | +-----------+----+ | 이 | 2 | | 홍 | 4 | +-----------+----+ 2 rows in set (0.00 sec) - 과의 이름과 인원 출력 mysql> SELECT depart.dept_name, count(*) FROM std, depart -> WHERE std.d_no = depart.d_no GROUP BY std.d_no ; +--------------+----------+ | dept_name | count(*) | +--------------+----------+ | 컴퓨터공학과 | 3 | | 전자계산학과 | 4 | +--------------+----------+ 2 rows in set (0.00 sec)

 

6.19 MySQL에서 바이너리 파일의 저장 ( BLOB)

네이버

7. MySQL의 백업 방안

 

- 데이타 베이스의 생명은 저장된 자료일것이다. 이장에서는 자료를 백업할수있는 방안에 대해 알아보기로 한다.

 

7.1. 파일

 

- 앞에서 설명한것처럼 데이타베이스명으로 디렉토리가 생성되며 테이블은 그 안에서 파일로 생성된다. 이 파일을 저장해놓기전에 먼저 LOCK TABLES을 통해 LOCK을 걸어 주는 것이 좋다. 백업본을 만드는 동안에 다른 쓰레드에서 질의가 들어올수있기 때문 이다.

 

- 이 방법은 dump하는 시간과 공간을 많이 줄여준다. 하지만 문제가 있을수도 있다.

 

7.2 mysqldump

 

- SQL문장으로 백업을 해준다. 시간이 많이 걸리며 특정 컬럼은 저장하지 못하는 경우가 있다.

Usage: mysqldump [OPTIONS] database [tables] -?, --help 도움말을 출력한다. --
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
2685 HTML 태그 제거 스크립트 13 김영철 01.13 1804
2684 문자열함수 13 김영철 01.13 1804
2683 form(2) 99 단국강토 02.09 1805
2682 자바스크립트 - String 객체, Screen 객체 99 단국강토 02.16 1805
2681 제로보드에 RSS를 지원하기 - zero2rss 13 김영철 01.13 1805
2680 라이브러리 없이 그래프 그리기 13 김영철 01.14 1805
2679 새로고침때 현페이지 유지 13 김영철 01.14 1805
2678 회색바탕에 움푹파인듯한 느낌의 스타일시트 M 최고의하루 12.26 1806
2677 Session 값 얻어 내기 13 김영철 01.13 1806
2676 SQL : T-SQL문 : T-SQL(Transact-SQL)문법 13 김영철 01.23 1806
2675 달력 포멧 스크립트 M 최고의하루 12.19 1809
2674 소스 보기방지 우측 마우스 드래그 금지 99 단국강토 01.05 1809
2673 mime_type 알기 13 김영철 01.14 1809
2672 출력버퍼링 예제 13 김영철 01.13 1809
2671 정규표현식의 규칙 13 김영철 01.14 1809
2670 mime_type 알기 13 김영철 01.14 1809
2669 몇가지 sql 명령어 13 김영철 01.23 1809
2668 [펌] 스크롤바 따라 다니는 메뉴 만들기 M 최고의하루 12.26 1810
2667 메일 보내기 소스 - fsocketopen 13 김영철 01.13 1810
2666 MSSQL SERVER에서 접속 port 변경하기 99 단국강토 01.06 1810
2665 php에서 유니코드 인코딩하기 13 김영철 01.13 1812
2664 파라미터 정리 13 김영철 01.14 1812
2663 php 세션css 13 김영철 01.13 1813
2662 한글 및 이미지 정렬 M 최고의하루 12.19 1814
2661 [PHP] PHP5에서의 객체지향프로그래밍 13 김영철 01.13 1814
2660 [JS] 자바스크립트 typeof[(expression]] 99 단국강토 02.16 1815
2659 png 13 김영철 01.13 1815
2658 트랙백 13 김영철 01.13 1816
2657 100~200까지 3과 5의 배수의합을 13 김영철 01.13 1817
2656 PHP FTP함수 13 김영철 01.14 1817
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취