Mysql 을 설치하고, db 를 생성하고, table 을 만들고, 데이터를 insert 했는데!!!!

이런식으로 한글이 ??? 라고 떠버렸습니다.

utf-8 로 인코딩해서 넣어야 하나 라고 생각을 했다가, 왠지 좀 덥수룩(?)한 방법 같아서 찾아봤어요.

mysql 의 character set 이 기본적으로 설정되어 있는게 utf-8 이 아니라 이런 문제가 발생한다고 하네요.

mysql 의 캐릭터셋 설정을 변경해 주어야 이런 한글 깨짐 현상을 수정할 수 있습니다.

간단하게 아래 3가지 정도의 순서만 거치면 되더라구요.

1. my.cnf 수정

2. mysql 재시작

3. 확인 or 테이블 캐릭터 셋 변경

1. my.cnf 수정

보통의 경우에 my.cnf 파일은 /etc 아래에 있나봅니다.

개발은 Mac OS 에서 하고 있는지라, 제 경우에는 /usr/local/mysql 경로에 있더군요.

mysql 이 설치된 환경에 따라 위치는 다를 수 있지만, 잘 찾아가서 my.cnf 파일을 열어서 아래의 내용을 추가해줍니다.

[client] default-character-set=utf8 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci init_connect=SET collation_connection=utf8_general_ci init_connect=SET NAMES utf8 [mysql] default-character-set=utf8

2. mysql 재시작

mysql restart

service mysql restart

등의 명령으로 mysql 을 재시작 해줍니다.

3. 확인 or ALTER TABLE

mysql 에 접속해 status 명령으로 character set 이 변경되었는지 확인합니다.

mysql> status

이런식으로 mysql 의 상태를 확인할 수 있습니다.

이제 테이블에 데이터를 넣어서 확인해 봅니다.

만약 그래도 제대로 출력이 되지않고, 기존과 마찬가지로 물음표로 ??? 출력된다면, 테이블의 캐릭터셋을 변경해줍니다.

mysql> ALTER TABLE table_name convert to charset utf8;

이제 다시 데이터를 넣어서 확인해봅니다. (여기까지 했으면 아마) 정상적으로 출력이 되는걸 확인할 수 있습니다.

출처 : http://croute.me/606

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

APMSETUP7 ‘MYSQL’에서 한글깨짐을 처리하기 위한 캐릭터셋 설정


ALTER TABLE 테이블_이름 CHARACTER SET utf8 COLLATE utf8_general_ci; //TABLE


(혹은 DB를 만들면서 지정)


CREATE DATABASE 데이타베이스_이름 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;




 나의 SQL 캐릭터셋 리스트 보기


윈도우키 + R 을 누른뒤 >cmd 를 입력하여 도스 커맨드 창을 뛰운다.


기본 비번은 root / apmsetup 이니 알아두도록 하고 다음과 같이 mysql에 접속한다.


C:\> mysql -uroot -papmsetup


mysql> show variables like 'c%'; 를 입력하면 현재 적용되어있는 캐릭터셋이 아래와 같이 리스트로 뜬다.



살펴보면 캐릭터셋의 설정이 모두 latin1 로 되어있다.


문제점1) phpAdmin같은 편리한 관리 도구로 테이블에 입력된 값을 살펴 볼 경우 한글이 죄다 ????으로 떠서 확인이 불가.


문제점2) 게다가 php로 select로 결과값을 받을때에도 @mysql_query('set names utf8')', 일일이 iconv() 메서드로 계속 인코딩을


 관리해서 입/출력 해야한다.


문제점3) 위에 설명했듯이 ALTER로 속성을 바꿀수는 있지만... 이미 캐릭터가 입력되어서 서로 다른 타입이 테이블에 혼재할경우


 이래저래 엄청 일이 꼬이게 된다.



 my.ini 파일 수정


1. C:\APM_Setup\Server\MySQL5\data 에서 my.ini 파일을 편집기로 오픈한다.


이렇게 생긴 파일 맞다)



2. 정확히 "[항목의]" 다음의 문자열을 추가한다.


[client]

default-character-set=utf8


[mysqld]

init_connect=SET collation_connection = utf8_general_ci

init_connect=SET NAMES utf8

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci


[mysql]

default-character-set=utf8



3. 저장이 되었으면 현재 my.ini파일을 복사하여 APM_setup\Server\MYSQL5에 붙여넣기 한다.


그러면 


C:\APM_setup\Server\MYSQL5\data 폴더에 my.ini 한개 존재


C:\APM_setup\Server\MYSQL5 폴더에 my.ini 한개 존재


이렇게 총 두개의 my.ini가 존재 할 것이다.


data 하위에 my.ini가 없으면 APMSETUP모니터가 작동하지 않기때문에 이렇게 조치 하는것이다.




4. 수정이 끝났으면 mysql을 재시작 해야 하는데


ㄱ. APM프로그램에서 stop을 누른뒤 다시 Start를 누르거나 (추천)


ㄴ. mysql> quit;


 c:\>mysqladmin -uroot -papmsetup reload 라는 커맨드로 입력해도 된다.





 캐릭터셋 변경 확인


수정이 잘 되었는지 반드시 확인해야 한다.


C:\> mysql -uroot -papmsetup mysql에로그인한 뒤


mysql> show variables like 'c%'; 명령어를 치면 아래와 같이 전부 utf8로 잘 변경되어져있다.





 이후 데이터 값의 확인은 phpMyAdmin 에서


http://localhost/myadmin/index.php 에 접속하면 아래 처럼 SQL 관리 도구가 뜬다.


역시 비번과 이이디는 root / apmsetup 으로 동일하다.


앞으로의 데이터베이스 열람은 cmd에서 명령기반의 모니터링이 아니라 phpMyAdmin으로 확인하는것이 정신에 매우 이로울것이다.




ps. 캐릭터셋 때문에 하도 고생을 해서 10번 이상의 임상실험을 통해 계속해서 반복적으로 성공한 구성을 튜토리얼로 기록 남겨둔다.

 2~3시간 삽질한 것 같은데 "euc-kr / utf-8" 도 아니고 하필 latin1 이라니... 이래저래 다른 유저들도 참 많이 고생할듯.

출처 : http://serpiko.tistory.com/442

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag java, mysql

게시물을 길게 써야 할 일이 생겼습니다. 표로된 HTML문서를 긁어서 그대로 에디터에 붙여넣고 입력했더니~ 짤리네요..

음~ 길면 그럴수도 있지~ 하다가 갑자기 궁금해졌습니다. 왜 짤리지?
그래서 테스트에 들어갔습니다.

테스트에 사용한 글은... 긴 텍스트... 긴 텍스트.....
성경으로 하기로 했습니다. 시편 119편!

처음에는 POST 방식의 데이터 전송에 제한이 있나를 알아봤는데, 서버사이드 스크립트 쪽에서 받는 데이터가 정상적으로 뜨더군요~

어? 그럼 DB의 문제인가?

DB에 입력된 데이타가 정상적으로 저장되어 있지 않다면!! php에서 MySQL로 자료를 보내는 중에 짤리는 것일 거야... 란 가정을 세우고~

SELECT RIGHT(content, 400) FROM `table_name` WHERE `id` = '15';

이런 명령을 내렸습니다.

어? 아니나 다를까 잘려 있더군요~ 그렇다면 DB 자체의 문제구나~ 싶었습니다.

그래서 구글링!!!! 했더니 이런 자료가 나오는군요~


TINYTEXT 256 bytes
TEXT 65,535 bytes ~64kb
MEDIUMTEXT 16,777,215 bytes ~16MB
LONGTEXT 4,294,967,295 bytes ~4GB

랍니다~ 전 'TEXT'형식으로 테스트를 하고 있었습니다. 음... 생각보다 짧더라구요~

그렇다고 MEDIUMTEXT를 쓰기엔 좀 큰 감도 있고~

뭐~ 어쨌든 좋은 정보를 알게 된 것 같습니다.

출처 : http://sjpison.tistory.com/119


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

안녕하세요~!!

오늘 포스팅할 내용은 SQL AS 구문입니다.

as 구문은 테이블 또는 테이블의 열에 대해서 임시로 이름을 변경할 수 있습니다. 약간 말이 어려운데 예제를 보면 금방 이해가 되지 않을까 싶습니다.

 

아래 member 테이블이라고 가정하고 예제를 살펴보겠습니다.

 id

 user_id

 user_pwd

 name

 age

 phone

 email

 1

 hhhh

 1111

 홍길동

 25

 010-1111-1111

 test1@test.com

 2

 aaaa

 2222

 임꺽정

 45

 010-2222-2222

 test2@test.com 

 3

 bbbb

 3333

 이영수

 34

 010-3333-3333

 test3@test.com

 4

 cccc

 4444

 김영희

 28

 010-4444-4444

 test4@test.com

 5

 eeee

 5555

 김철수

 34

 010-5555-5555

 test5@test.com 

 

예제구문

select user_id as uid, user_pwd as pwd from member;

// 구문을 살펴보면 user_id as uid 라고 변경했고 user_pwd as pwd 라고 변경했습니다. 테이블의 열이름을 변경하여 사용하기 쉽게 uid, pwd로 변경하여 불러옵니다. 위 구문을 실행하면 아래 처럼 나오게 됩니다.

 uid

 pwd

 hhhh

 1111

 aaaa

 2222

 bbbb

 3333

 cccc

 4444

 eeee

 5555

 

// 열 이름이 변경된것을 확인할 수 있습니다.

 

위 member 테이블로 한 가지 예제구문을 더 살펴보겠습니다.

select user_id, name+', '+age+', '+phone as info from member;

// 위 예제는 여러가지의 테이블 열을 합쳐 하나의 내용으로 묶어서 가져오게 하는 구문입니다.

// 실행하면 아래 처럼 나오게 됩니다.

 user_id

 info

 hhhh

 홍길동 25 010-1111-1111 

 aaaa

 임꺽정 45 010-2222-2222

 bbbb

 이영수 34 010-3333-3333

 cccc

 김영희 28 010-4444-4444

 eeee

 김철수 34 010-5555-5555

 

 

이처럼 as 구문은 아주 유용하게 사용 가능합니다. 예전 ASP 업체에 있을때 MS-SQL에서 정말 많이 사용했었습니다. 그리고 지금은 PHP로 코딩을하고 디비는 My-sql 을 사용하는데 생각보다 as 구문을 사용할일은 많지 않더라구요. 하지만 꼭 기억해야할 기본구문이기에 잘 알아두시기 바랍니다 ^^

 

그럼 오늘 하루 잘 마무리 하시고~ 즐거운 프로그래밍 되세요!! 

 

 

출처 : http://makand.tistory.com/230

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag mysql

테이블은 기본적으로 각 열마다 동일한 행으로 이루어져야 합니다.

<table border="1">
<tr>
 <td>1*1 셀</td>
</tr>
<tr>
 <td>2*1 셀</td>
 <td>2*2 셀</td>
</tr>
</table>

위와 같이 첫번째 열(row)은 1개의 행(column)을 가지고, 두번째 열(row)은 2개의 행(column)을 가지게 만들면 아래처럼 제대로 모양을 갖추어 지지 않습니다.

1*1 셀
2*1 셀 2*2 셀

첫번째 열을 오른쪽으로 확장시켜 주어야 합니다. 이때 사용하는 속성이 colspan 입니다. 

<table border="1">
<tr>
 <td colspan="2">1*1 셀</td>
</tr>
<tr>
 <td>2*1 셀</td>
 <td>2*2 셀</td>
</tr>
</table>

위와 같이 colspan="2"로 지정하면 아래와 같이 의도한 대로 모양이 나옵니다.

1*1 셀
2*1 셀 2*2 셀

즉 첫번째 row의 column수가 1개이고, 두번째 row의 column 수가 2개이므로 이를 동일하게 맞추어 주기 위해서 첫번째 row의 셀에서 colspan 속성을 사용하였습니다.

열을 확장할때는 rowspan 이라는 속성을 사용합니다.

<table border="1">
<tr>
 <td rowspan="2">1*1 셀</td>
 <td>1*2 셀</td>
</tr>
<tr>
 <td>2*2 셀</td>
</tr>
</table>

1*1셀의 열(row)을 확장했으므로 2열(row)에서는 첫번째 셀이 필요없습니다.

1*1 셀 1*2 셀
2*2 셀

여기에서 중요한것은 확장을 하는 방향입니다.

왼쪽에서 오른쪽으로 column을 확장하는 경우 colspan,
위에서 아래로 row를 확장하는 경우는 rowspan

이렇게 기본적으로 기억하면서 colspan과 rowspan 속성을 자유자재로 다룰 수 있어야 합니다.

아주 빈번하게 사용되므로 시간표 같은것을 만들어 보면서 충분한 연습을 해주어야 합니다.

 

출처 : http://www.homejjang.com/03/colspan.php

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag mysql
<권한설정>
grant all privileges on 디비명.테이블명 to 사용자@'접속지 주소' identified by '암호' (with grant option);

grant all privileges on *.* to  root@'%' identified by '암호with grant option;
grant all privileges on *.* to  root@'localhost' identified by '암호with grant option;

<권한 제거>
revoke all on 디비명.테이블명 from 사용자;

<권한 적용>
# 모든 명령 후에 항상 아래 명령을 실행해야 실제로 적용된다. 
flush privileges; 



<기타>
# '사용자'가 '암호'으로  localhost 에서 db1 디비의 table1에 접속하도록 허용
grant all privileges on root.db1 to 사용자@'localhost' identified by '암호';

# '사용자'가 '암호'으로 111.222.333.444 에서 db1 디비의 모든 테이블에 접속하도록 허용
grant all privileges on root.* to 사용자@'111.222.333.444' identified by '암호';

# '사용자'가 '암호'으로 111.222.333.0/24 에서 모든 디비와 테이블에 접속하도록 허용
grant all privileges on *.* to  사용자 @'111.222.333.%' identified by '암호';

 

출처 : http://ir.bagesoft.com/675

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag mysql

INSERT나 UPDATE, DELETE문을 이용해서 MySQL의 사용자를 추가,삭제하거나, 사용자 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해서 사용하는 명령어가 flush privileges 입니다.

 

예제

 

아래와같이 데이터베이스를 만들고 table을 추가하고 마지막에 grant로 webauth라는 유저한테 권한을 주면 flush privileges를 해야 적용이 된다.

 

create database auth;
use auth;
create table authorized_users ( name varchar(20),
                                password varchar(40),
                                        primary key     (name)
                              );
insert into authorized_users values ( 'username',
                                      'password' );

insert into authorized_users values ( 'testuser',
                                      sha1('password') );
grant select on auth.*
             to 'webauth'
             identified by 'webauth';
flush privileges;

 

 


 

출처 : http://www.cyberpr.co.kr/community/community.php?act=v&bid=database&page=1&seq=401


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

  • ENUM
    최대 65535 개의 엘리먼트를 가질 수 있음.
    인덱스를 사용. 인덱스는 1부터 시작.

    테이블을 작성하여 예를 들어가면서 설명.

    1. 테이블 작성
    mysql> create table enum_test ( numbers ENUM('0' , '1' , '2' ));
    mysql> desc enum_test;
    +---------+-------------------+------+-----+---------+-------+
    | Field   | Type              | Null | Key | Default | Extra |
    +---------+-------------------+------+-----+---------+-------+
    | numbers | enum('0','1','2') | YES  |     | NULL    |       |
    +---------+-------------------+------+-----+---------+-------+
    1 row in set (0.01 sec)


    2. 다음 값으로 테이블에 넣기
    mysql> insert into enum_test(numbers) values (2), ('2') , ('3') ,('4') ,   (NULL);


    3. 다음과 같은 결과가 나온다.
    mysql> select * from enum_test;
    +---------+
    | numbers |
    +---------+
    | 1       |
    | 2       |
    | 2       |
    |         |
    | NULL    |
    +---------+
    5 rows in set (0.00 sec)

    설명:
    • ENUM 에 무효한 값을 삽입하면 빈 문자열 "" 이 삽입된다.
      -> 위의 2. 번의 insert into enum_test(numbers) values ('4') 의 경우 '4' 값은 1. 번의 테이블작성시 지정한 허용 값에 포함되어 있지 않음.
      따라서 '4' 를 삽입하려 하면 3. 번의 결과의 4번째 행처럼 빈문자열 "" 이 삽입되나.
    • insert into enum_test(numbers) values (2) 처럼 숫자를 삽입하면 ENUM 의 허용 리스트의 인덱스값으로 인식된다.

      위 테이블 작성시 ENUM 리스트의 인덱스값은 다음과 같다.
      +------+------+
      |Values|INDEX |
      +------+------+
      | NULL | NULL |
      | ''   |   0  |
      | '0'  |   1  |
      | '1'  |   2  |
      | '2'  |   3  |
      +------+------+


      인덱스가 2인 값은 '1' 이므로 3. 번 결과의 첫번째 행의 값은 '1' 이되는것이다.
    • insert into enum_test(numbers) values  ('2'); 처럼 '2' 를 삽입하면 허용리스트에 포함되어 있으므로 그대로 삽입되어 '2' 가 들어감.
    • insert into enum_test(numbers) values ('3'); 처럼 ENUM 리스트에 포함되어 있지않은 값을 삽입하면 인덱스로 인식된다. 인덱스 값이 3인 값은 '2' 가 삽입된다.
      이런 이유로 되도록이면 ENUM 리스트 정의시 숫자식문자열을 사용하지 않을 것을 권하고 있다.
    • insert into enum_test(numbers) values (NULL); 그대로 NULL 이 삽입됨.

      추가로 삽입값들의 인덱스 값을 뽑아보면 다음과 같다.

      mysql> select * , numbers+0 as indices from enum_test;
      +---------+---------+
      | numbers | indices |
      +---------+---------+
      | 1       |       2 |
      | 2       |       3 |
      | 2       |       3 |
      |         |       0 |
      | NULL    |    NULL |
      | 0       |       1 |
      +---------+---------+
      6 rows in set (0.01 sec)

  • SET
    최대 64개의 다른 멤버를 가질 수 있음.
    ENUM 하고 비슷하지만 다른 부분은 모든 요소(엘리먼트)가 사용된다.

    테이블을 작성해서 예를 들어가면서 설명

    테이블 작성
    mysql> CREATE TABLE set_test(
                season SET('SPRING' ,'SUMMER' , 'FALL' ,'WINTER' )
                                );
    Query OK, 0 rows affected (0.05 sec)

    위와 같은 테이블을 작성하면 다음과 같은 값을 갖게 된다.

    +----------+----------+---------+
    | 요소      | 10진값   | 2진값    |
    +----------+----------+---------+
    | SPRING   |        1 |   0001  |
    | SUMMER   |        2 |   0010  |
    | FALL     |        4 |   0100  |
    | WINTER   |        8 |   1000  |
    +----------+----------+---------+


    인서트
    mysql> INSERT INTO set_test VALUES
                    ('SPRING,SUMMER,FALL,WINTER') ,
                    ('SPRING,SUMMER') ,
                    ('SPRING') ,
                    ('SUMMER') ,
                    ('FALL') ,
                    ('WINTER');
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0

    mysql> select * from set_test;
    +---------------------------+
    | season                    |
    +---------------------------+
    | SPRING,SUMMER,FALL,WINTER |
    | SPRING,SUMMER             |
    | SPRING                    |
    | SUMMER                    |
    | FALL                      |
    | WINTER                    |
    +---------------------------+
    6 rows in set (0.00 sec)


    mysql> select * , season+0 as decimals from set_test;
    +---------------------------+----------+
    | season                    | decimals |
    +---------------------------+----------+
    | SPRING,SUMMER,FALL,WINTER |       15 |
    | SPRING,SUMMER             |        3 |
    | SPRING                    |        1 |
    | SUMMER                    |        2 |
    | FALL                      |        4 |
    | WINTER                    |        8 |
    +---------------------------+----------+
    6 rows in set (0.00 sec)


    mysql> select * from set_test where season& 9;
    +---------------------------+
    | season                    |
    +---------------------------+
    | SPRING,SUMMER,FALL,WINTER |
    | SPRING,SUMMER             |
    | SPRING                    |
    | WINTER                    |
    +---------------------------+
    4 rows in set (0.02 sec)

    위에서 9 값은 1 + 8 이 된다. 즉  SPRING 과 WINTER 의 값을 더한 값이다.
    따라서 테이블에서 SPRING 과 WINTER 값이 포함된 행들을 뽑아내면 된다.

    함수 find_in_set()을 사용하는 방법.

    mysql> select * from set_test where find_in_set('SPRING',season)>0;
    +---------------------------+
    | season                    |
    +---------------------------+
    | SPRING,SUMMER,FALL,WINTER |
    | SPRING,SUMMER             |
    | SPRING                    |
    +---------------------------+
    3 rows in set (0.02 sec)

    LIKE 를 사용하는 방법.
    mysql> select * from set_test where season LIKE '%SPRING%';
    +---------------------------+
    | season                    |
    +---------------------------+
    | SPRING,SUMMER,FALL,WINTER |
    | SPRING,SUMMER             |
    | SPRING                    |
    +---------------------------+
    3 rows in set (0.00 sec)


    mysql> select * from set_test where season = 'SPRING,SUMMER';
    +---------------+
    | season        |
    +---------------+
    | SPRING,SUMMER |
    +---------------+
    1 row in set (0.00 sec




    set 타입을 사용하면 여러가지 장점을
    살릴수 있습니다.

    --------------------------------------------
    (초보자를 위해서 조금 길게 적었습니다.)
    ----------------------------------------------

    우선

    100 과 같은 비트단위는 문자형 타입으로 결정하려면
    CHAR(50) 또는 VARCHAR(50) 으로 지정해야 하는데 크기가 50 Bytes라서
    부적절합니다.

    반면 숫자형 타입으로 결정하려면 BIGINT(50) UNSIGNED ZEROFILL 으로
    해야하는데 이때는 크기가 8 Bytes 입니다.
    (INTEGER 로서는 2^50 = 1,125,899,906,842,624 의 크기를 모두 담을 수 없습니다.)
    참고로 BIGINT 는 최대 2^63 까지 가능합니다.

    숫자형 타입으로 또한 DOUBLE 형도 가능하는데 이들
    숫자형 타입은 모두 좀 알아보기가 힘들다는 단점이 있습니다.

    따라서 제일 적절한 타입은 SET 타입으로 64개의 리스트 즉,
    최대 2^64 이라는 경우의 수를 만들 수 있습니다.
    크기는 숫자형타입과 마찬가지로 리스트 개수(L) 이 32 < L < 64 이면
    8 Bytes 입니다.

    SET 타입의 장점으로는
    그 리스트를 bit 형 숫자 또는 문자열 모두 또는 이들 두개의 조합으로도
    가능하기 때문에 잘 구성하면 테이블에서 직접 눈으로 쉽게 판별할수도 있습니다.

    예를들어, 위의 경우라면,

    colanme SET('1','2','3','4','5',...) DEFAULT ...
    또는
    colanme SET('1','2','4','8','16',...) DEFAULT ...       <---- bit
    또는
    colanme SET('1st','2st','3st','4st','5st',...) DEFAULT ...
    또는
    colanme SET('a','b','c','d','e',...) DEFAULT ...
    ...

    등등 여러가지 형태로 가능하고 실제로 이들은 내부적으로
    모두 두번째 예인 비트단위로 DB 에 저장됩니다.

    4번째의 경우라면

    a => 1
    b => 2
    c => 4
    d => 8
    e => 16

    이와같이 내부는 실제의 문자나 문자열로 연산하지 않고 오른쪽의 비트단위인 숫자로
    증가하면서 저장되고 숫자형으로 비교하기 때문에 상당히 빠른다는 장점이
    있습니다.

    참고로, ENUM 은 1씩 증가하고 택일이지만, SET 타입은 비트 단위로 증가하고
    다중선택이 가능합니다. 물론 크기는 ENUM 이 더 작습니다.

    SET 타입의 자료입력은

    예)
    INSET INTO SET ... colname = 'a';
    INSET INTO SET ... colname = 'a,b';
    INSET INTO SET ... colname = 'b,a'; // 순서가 바뀌면 a,b 순서로 자동으로 저장
    INSET INTO SET ... colname = 'd,e';
    INSET INTO SET ... colname = 'b,c,d';

    이와 같은 형식으로 자료를 입력하면 됩니다.

    이들을 각각

    'a'     => 1
    'a,b'   => 1 + 2 = 3
    'd,e'   => 8 + 16 = 24
    'b,c,d' => 2 + 4 + 8 = 14

    이렇게 내부적인 비트단위로 저장되고 연산됩니다.
    출력은 비트단위의 숫자가 아닌 원래의 저정한 형태의 자료형으로
    출력됩니다.

    검색부분에 대해서도 숫자형 BIGINT 와 같이 숫자형 연산도
    가능할 뿐더러 문자열 비교도 할 수 있습니다.

    BININT 같은 경우도 LIKE 와 같은 문자열 비교 연산도 가능하지만
    잘못된 결과가 나올 수 있기 때문에 역시 곤란합니다.
    반면 SET 타입은 문자열로도 취급가능하므로 LIKE 에 대한 잘못된
    결과가 나오는 경우는 없습니다.

    굳지 예를 들자면(문자형태로 저장되었을 경우),

    1) 문자열로 취급할 경우

    SELECT ... WHERE colname = 'a,b'; // a 와 b 만 선택한 경우
    SELECT ... WHERE colname LIKE 'a%'; // 최소한 a 를 선택한 경우
    SELECT ... WHERE colname IN('a','b'); // a 또는 b 만 선택한 경우
    SELECT ... WHERE FIND_IN_SET('a',colname); // 최소한 a 를 선택한 경우
    SELECT ... WHERE INSTR(colname,'a'); // 최소한 a 를 선택한 경우
    ...

    2) 비트의 숫자형으로 취급할 경우

    SELECT ... WHERE colname = 1; // 1 = 2^0 이므로 첫번째인 a 만 선택한 경우임
    SELECT ... WHERE colname >= 1; // 최소한 a 를 선택한 경우
    SELECT ... WHERE colname = 3; // 이것은 a 와 b 만 선택한 경우임
    SELECT ... WHERE


    3) 비트단위로 취급할 경우(bit 연산)

    SELECT ... WHERE colname & 1; // 최소한 a 를 선택한 경우
    SELECT ... WHERE colname & 3; // 최소한 a 또는 b를 선택한 경우(간단한 OR 연산에 이용)

    이와 같이 여러가지 형태로 SQL 문을 만들 수 있다는 것이 그 장점중의 하나입니다.
  •  

    출처 : http://woong.koong.net/index.php?MenuID=4&cat=DB&list_count=30&mode=view&idx=753

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Tag mysql

    MySQL 서브쿼리는 버전 4.1.x 대부터 지원하고 있다.

    ENUM(value1, value2, value3...) value는 최대 65535 개까지 가능.

    CREATE TABLE TEST (
    id varchar(10),
    name varchar(20),
    auth_code ENUM('AA01', 'AB01', 'AC01', 'AD01', 'AD99')
    )

    INSERT INTO TEST VALUES ('test1', '테스트1','AA01')
    INSERT INTO TEST VALUES ('test2', '테스트2', 2)

    select * from TEST;
    결과는
    ------------------------------------
    id name auth_code
    -------------------------------------
    test1 테스트1 AA01
    test2 테스트2 AB01
    -------------------------------------
    select * from TEST where auth_code = 1;
    결과는
    ------------------------------------
    id name auth_code
    -------------------------------------
    test1 테스트1 AA01
    -------------------------------------

    속도면에서도 도움이 될것 같다. 디비가 알아서 n개중에 하나를 찾게 되니...

    비슷한 기능을 하는 놈 중에 SET이 있는데 ENUM이 한개만 선택이 가능
    다중선택은 SET 이라는 것이 있다고 하는데...

    INSERT INTO TEST VALUES ('test', '테스트','AA01,AB01, AC01') <-- ENUM타입이라면 에러난다.

    출처 : http://www.isfull.com/bbs/board.php?bo_table=tb05&wr_id=14

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Tag mysql

    가끔 MySql 에서 날짜 관련 블로그나 기술 문서를 보면
    저같은 초심자들은 종종 무아지경에 빠지는 경우가 있지요~~ ^^;

    MySql에서 지원하는 날짜관련 함수도 너무 많구요~

    그저 가장 일반적이고 가장 손쉬운 오늘 날짜에 기록된 레코드만을 뽑아보고 싶을 뿐인데
    타임 스템프니 유닉스 타임이니 형변환이니 ~~ 아~~ 어렵더군요!!! ㅠ.ㅠ

    그래서 좀 쉽게 오늘 날짜에 기록된 데이터만을 뽑아보고 싶었습니다. 

    만약 컬럼형태가 DateTime 형이라면

        select * from 테이블 where 컬럼명 > date_format(curdate( ), '%Y-%m-%d %H:%i:%s' ) ;

    이렇게만 하셔도 오늘 기록된 레코드만을 뽑아 올 수 있구요~

    좀더 간결하게 하고 싶다면

        select * from 테이블 where 컬럼명 > CURRENT_DATE( );

    만 하셔도 됩니다. 그리고 컬럼의 형태에 따라서

        select * from 테이블 where 컬럼명 > curdate( ); 

    처럼 하시면 더욱 간결하게 오늘 날짜에 기록된 데이터만 뽑을 수 있습니다.

    위 쿼리들은 정확하게는 오늘 0시 이후에 기록된 레코드들을 볼러오라는 명령이니 반대로

        select * from 테이블 where 컬럼명 < curdate( ); 

    하면 오늘 0시 이전 데이터들, 다시말해 어제를 포함한 오늘 이전에 기록된 데이터를 모두 불러오게 됩니다.

    출처 : http://goodhelper.egloos.com/1889111

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그


    Limit 연산자를 이용하면 쿼리 결과 개수를 제한할 수 있다.

     

    1
    select * from 테이블명 Limit 개수(정수);



    예) cookie_sales 테이블에서 first_name별로 그룹을 만들어 sales컬럼의 합계가 가장 높은 순으로 
         출력하되, 2개까지만 출력한다.

     

    1
    2
    3
    4
    select first_name, sum(sales) from cookie_sales
    group by first_name
    order by sum(sales) desc
    Limit 2;

    결과

     first_name sales 
     Britney 107.91 
     Paris 98.23 




    Limit의 조금 다른 사용법

    아래처럼 두 개의 정수가 들어간다면 완전히 다른 의미가 된다. 

    Limit 0, 4 
                      0은 시작할 레코드의 번호이다. (SQL은 0이 처음)
                      4는 반환할 결과의 수이다. 


    예를 들어 음악 챠트에서 20위에서 30위까지 보고 싶다고 하면
    Limit 19,10 으로 하면 된다~

    출처 : http://warmz.tistory.com/259

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Mysql

    select * from tablename
    where jumin = '주민번호' and o_date > SUBDATE(NOW(),INTERVAL 7 DAY)

     

     

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    having 은 group by 절 에 포함됩니다. group by ... having ... 이딴식으로 쓰이죠.. having 만으로는 쓰여지진 않겟죠...

    쉽게 생각하면 group by 절에서 사용하는 where 절 이라고 보시면 됩니다. ( 참 쉽죠잉? 개뿔~ -.-;;;)

    where 절에 사용하는 조건들이 group by 보다 먼저 적용되니 group by 로 그룹핑 한후의 시점에서 조건을 걸때 사용합니다.

    예를들어...

    select
      이름, count( 이름 ) as 갯수
    from 테이블이름
    where 지역 = '서울'
      group by 이름
      having count(이름) > 1;

    위는 지역이 서울인 사람들 에서 이름으로 그룹핑해서 이름과 레코드수를 표시해주는데 having 절이 없으면 모든 레코드를 표시해주겟죠... 위의 예는 중복된 사람을 찾기 위함인데 count(이름) 이 1 이면 중복이 아니겟죠? 그러면 count(이름) 이 1보다 큰사람만 보기 위해서 having 으로 조건을 줍니다.

    그럼 count(이름) 을 where 절에 넣으면 되지 않겟냐?? ... 위에서도 언급은 했지만 where 절이 그룹핑 이전의 시점에 적용되기때문에 집계함수 ( count, sum, avg 같은것들.. 통계함수 라고도 함..) 를 사용할수 없다는것이죠...그래서 having 에사용하는데 having 에는 집계함수만 사용할수 있습니다

     

     

    출처 : 네이버 지식인  http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=169113467&qb=bXlzcWwgZ3JvdXAgYnk=&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=RohLK35Y7vRssuyHG68ssssssss-090939&sid=UoYNM3JvLDUAACy52uo

     
    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Tag mysql, SQL

    다음은 테이블(purchaseT) 정보이다. 이 테이블은 날짜와시간대 별로 각 회원의 구매물품을 저장한다.

     

    다음은 테이블을 생성하기 위한 DDL문이다. 주석은 '--' 다음에 반드시 한칸(' ')을 띄어쓰기하고 기술해주어야 한다.

    create table purchaseT (
           idx int not null primary key auto_increment, -- 구매정보idx
           member_id int not null, -- 회원id
           product_id int not null, -- 상품id
           buydate datetime not null -- 거래일자
    );

     

     idx

    member_id 

    product_id 

    buydate 

     1

    gildong 

    orange 

     2011-01-30 01:34:37

     2

    mildong

    apple

     2011-02-02 01:34:37

     3

    lidong

    banana

     2011-02-03 01:34:37

     

    1. 오늘날짜(현재)를 기준으로 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) = date(now())

    > ORDER BY idx ASC;

     

    now()는 2011-02-03 01:34:37 와 같은 형식의 값을 반환한다. 여기서 YYYY-MM-DD만 필요하므로 date() 함수를 사용한다.

    buydate도 마찬가지이므로 2011-02-03 01:34:37 와 같은 형식의 값을 반환한다. 여기서 YYYY-MM-DD만 필요하므로 date() 함수를 사용한다.

     

    2. 어제를 기준으로 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) = date(subdate(now(), INTERVAL 1 DAY))

    > ORDER BY idx ASC;

     

    여기서 subdate(now(), INTERVAL 1 DAY)으로 사용을 했다. 현재날짜에서 1일 전의 날짜를 구하기 위함이다.

    SUBDATE(date,INTERVAL expr unit)

    이게 원형인데, date에는 now() 함수나 '2011-01-01'의 날짜를 넘겨준다. INTERVAL 키워드는 그대로 사용하고 expr은 몇일 전을 원하는지 그 숫자를 쓰면된다. unit은 아래표중에서 빨간글씨로 두드러진 표에 unit Value라고 나와있다. 기호상수처럼 이해했다. 몇일 전이므로 DAY를 사용했다.

     

    3. 오늘을 기준으로 이번달에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date_format(now(), '%Y-%m-01') and date(buydate) <= last_day(now())

    ORDER BY idx ASC;

     

    이번달이라고 하면 오늘을 기준으로 1일부터 말일까지 해당한다. 말일을 구하는 함수는 제공되어 있었다.

    LAST_DAY(date)

    이게 원형인데, 여기서는 date 자리에 now()를 사용했다. 즉,  last_day(now())를 사용했다.

    이번달 1일을 구하는 함수는 찾기가 어려워서 조합해서 사용했다.

    DATE_FORMAT(date, format)

    이게 원형인데, 설명은 아래에 표에 나와있다. date를 format식으로 바꿔준다고 보면 된다. 년도와 월만 필요하므로 format string에는 %Y(Year, numeric, four digits)와 %m(Month, numeric (00..12))을 사용했다.

    여기서는 date_format(now(), '%Y-%m-01')을 사용했다.

     

    4. 오늘을 기준으로 3일전(3일이내)에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date(subdate(now(), INTERVAL 3 DAY)) and date(buydate) <= date(now())

    ORDER BY idx ASC;

     

    5. 오늘을 기준으로 일주일전(7일이내)에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date(subdate(now(), INTERVAL 7 DAY)) and date(buydate) <= date(now())

    ORDER BY idx ASC;

     

    6. 오늘을 기준으로 10일전(10일이내)에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date(subdate(now(), INTERVAL 10 DAY)) and date(buydate) <= date(now())

    ORDER BY idx ASC;

     

    7. 오늘을 기준으로 20일전(20일이내)에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date(subdate(now(), INTERVAL 20 DAY)) and date(buydate) <= date(now())

    ORDER BY idx ASC;

     

    8. 오늘을 기준으로 30일전(30일이내)에 구매한 물품정보만을 조회하는 쿼리문을 작성하자.

    > SELECT * FROM purchaseT

    > WHERE date(buydate) >= date(subdate(now(), INTERVAL 30 DAY)) and date(buydate) <= date(now())

    ORDER BY idx ASC;

     

    다음의 표와 설명자료는 MySQL 함수에 대한 설명이다.

    출처 - http://www.tutorialspoint.com/mysql/mysql-date-time-functions.htm

    Name Description
    ADDDATE() Add dates
    ADDTIME() Add time
    CONVERT_TZ() Convert from one timezone to another
    CURDATE() Return the current date
    CURRENT_DATE(), CURRENT_DATE Synonyms for CURDATE()
    CURRENT_TIME(), CURRENT_TIME Synonyms for CURTIME()
    CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP Synonyms for NOW()
    CURTIME() Return the current time
    DATE_ADD() Add two dates
    DATE_FORMAT() Format date as specified
    DATE_SUB() Subtract two dates
    DATE() Extract the date part of a date or datetime expression
    DATEDIFF() Subtract two dates
    DAY() Synonym for DAYOFMONTH()
    DAYNAME() Return the name of the weekday
    DAYOFMONTH() Return the day of the month (1-31)
    DAYOFWEEK() Return the weekday index of the argument
    DAYOFYEAR() Return the day of the year (1-366)
    EXTRACT Extract part of a date
    FROM_DAYS() Convert a day number to a date
    FROM_UNIXTIME() Format date as a UNIX timestamp
    HOUR() Extract the hour
    LAST_DAY Return the last day of the month for the argument
    LOCALTIME(), LOCALTIME Synonym for NOW()
    LOCALTIMESTAMP, LOCALTIMESTAMP() Synonym for NOW()
    MAKEDATE() Create a date from the year and day of year
    MAKETIME MAKETIME()
    MICROSECOND() Return the microseconds from argument
    MINUTE() Return the minute from the argument
    MONTH() Return the month from the date passed
    MONTHNAME() Return the name of the month
    NOW() Return the current date and time
    PERIOD_ADD() Add a period to a year-month
    PERIOD_DIFF() Return the number of months between periods
    QUARTER() Return the quarter from a date argument
    SEC_TO_TIME() Converts seconds to 'HH:MM:SS' format
    SECOND() Return the second (0-59)
    STR_TO_DATE() Convert a string to a date
    SUBDATE() When invoked with three arguments a synonym for DATE_SUB()
    SUBTIME() Subtract times
    SYSDATE() Return the time at which the function executes
    TIME_FORMAT() Format as time
    TIME_TO_SEC() Return the argument converted to seconds
    TIME() Extract the time portion of the expression passed
    TIMEDIFF() Subtract time
    TIMESTAMP() With a single argument, this function returns the date or datetime expression. With two arguments, the sum of the arguments
    TIMESTAMPADD() Add an interval to a datetime expression
    TIMESTAMPDIFF() Subtract an interval from a datetime expression
    TO_DAYS() Return the date argument converted to days
    UNIX_TIMESTAMP() Return a UNIX timestamp
    UTC_DATE() Return the current UTC date
    UTC_TIME() Return the current UTC time
    UTC_TIMESTAMP() Return the current UTC date and time
    WEEK() Return the week number
    WEEKDAY() Return the weekday index
    WEEKOFYEAR() Return the calendar week of the date (1-53)
    YEAR() Return the year
    YEARWEEK() Return the year and week

    ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)

    When invoked with the INTERVAL form of the second argument, ADDDATE() is a synonym for DATE_ADD(). The related function SUBDATE() is a synonym for DATE_SUB(). For information on the INTERVAL unit argument, see the discussion for DATE_ADD().

    mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
    +---------------------------------------------------------+
    | DATE_ADD('1998-01-02', INTERVAL 31 DAY)                 |
    +---------------------------------------------------------+
    | 1998-02-02                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
    +---------------------------------------------------------+
    | ADDDATE('1998-01-02', INTERVAL 31 DAY)                  |
    +---------------------------------------------------------+
    | 1998-02-02                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    When invoked with the days form of the second argument, MySQL treats it as an integer number of days to be added to expr.

    mysql> SELECT ADDDATE('1998-01-02', 31);
    +---------------------------------------------------------+
    | DATE_ADD('1998-01-02', INTERVAL 31 DAY)                 |
    +---------------------------------------------------------+
    | 1998-02-02                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    ADDTIME(expr1,expr2)

    ADDTIME() adds expr2 to expr1 and returns the result. expr1 is a time or datetime expression, and expr2 is a time expression.

    mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002');
    +---------------------------------------------------------+
    | DATE_ADD('1997-12-31 23:59:59.999999','1 1:1:1.000002') |
    +---------------------------------------------------------+
    | 1998-01-02 01:01:01.000001                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    CONVERT_TZ(dt,from_tz,to_tz)

    This converts a datetime value dt from the time zone given by from_tz to the time zone given by to_tz and returns the resulting value. This function returns NULL if the arguments are invalid.

    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
    +---------------------------------------------------------+
    | CONVERT_TZ('2004-01-01 12:00:00','GMT','MET')           |
    +---------------------------------------------------------+
    | 2004-01-01 13:00:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
    +---------------------------------------------------------+
    | CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00')     |
    +---------------------------------------------------------+
    | 2004-01-01 22:00:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    CURDATE()

    Returns the current date as a value in 'YYYY-MM-DD' or YYYYMMDD format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT CURDATE();
    +---------------------------------------------------------+
    | CURDATE()                                               |
    +---------------------------------------------------------+
    | 1997-12-15                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CURDATE() + 0;
    +---------------------------------------------------------+
    | CURDATE() + 0                                           |
    +---------------------------------------------------------+
    | 19971215                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    CURRENT_DATE and CURRENT_DATE()

    CURRENT_DATE and CURRENT_DATE() are synonyms for CURDATE()

    CURTIME()

    Returns the current time as a value in 'HH:MM:SS' or HHMMSS format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.

    mysql> SELECT CURTIME();
    +---------------------------------------------------------+
    | CURTIME()                                               |
    +---------------------------------------------------------+
    | 23:50:26                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CURTIME() + 0;
    +---------------------------------------------------------+
    | CURTIME() + 0                                           |
    +---------------------------------------------------------+
    | 235026                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    CURRENT_TIME and CURRENT_TIME()

    CURRENT_TIME and CURRENT_TIME() are synonyms for CURTIME().

    CURRENT_TIMESTAMP and CURRENT_TIMESTAMP()

    CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().

    DATE(expr)

    Extracts the date part of the date or datetime expression expr.

    mysql> SELECT DATE('2003-12-31 01:02:03');
    +---------------------------------------------------------+
    | DATE('2003-12-31 01:02:03')                             |
    +---------------------------------------------------------+
    |  2003-12-31                                             |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DATEDIFF(expr1,expr2)

    DATEDIFF() returns expr1 . expr2 expressed as a value in days from one date to the other. expr1 and expr2 are date or date-and-time expressions. Only the date parts of the values are used in the calculation.

    mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
    +---------------------------------------------------------+
    | DATEDIFF('1997-12-31 23:59:59','1997-12-30')            |
    +---------------------------------------------------------+
    | 1                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

    These functions perform date arithmetic. date is a DATETIME or DATE value specifying the starting date. expr is an expression specifying the interval value to be added or subtracted from the starting date. expr is a string; it may start with a .-. for negative intervals. unit is a keyword indicating the units in which the expression should be interpreted.

    The INTERVAL keyword and the unit specifier are not case sensitive.

    The following table shows the expected form of the expr argument for each unit value;

    unit Value ExpectedexprFormat
    MICROSECOND MICROSECONDS
    SECOND SECONDS
    MINUTE MINUTES
    HOUR HOURS
    DAY DAYS
    WEEK WEEKS
    MONTH MONTHS
    QUARTER QUARTERS
    YEAR YEARS
    SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
    MINUTE_MICROSECOND 'MINUTES.MICROSECONDS'
    MINUTE_SECOND 'MINUTES:SECONDS'
    HOUR_MICROSECOND 'HOURS.MICROSECONDS'
    HOUR_SECOND 'HOURS:MINUTES:SECONDS'
    HOUR_MINUTE 'HOURS:MINUTES'
    DAY_MICROSECOND 'DAYS.MICROSECONDS'
    DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
    DAY_MINUTE 'DAYS HOURS:MINUTES'
    DAY_HOUR 'DAYS HOURS'
    YEAR_MONTH 'YEARS-MONTHS'

    The values QUARTER and WEEK are available beginning with MySQL 5.0.0.

    mysql> SELECT DATE_ADD('1997-12-31 23:59:59', 
        -> INTERVAL '1:1' MINUTE_SECOND);
    +---------------------------------------------------------+
    | DATE_ADD('1997-12-31 23:59:59', INTERVAL...             |
    +---------------------------------------------------------+
    | 1998-01-01 00:01:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
    +---------------------------------------------------------+
    | DATE_ADD('1999-01-01', INTERVAL 1 HOUR)                 |
    +---------------------------------------------------------+
    | 1999-01-01 01:00:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DATE_FORMAT(date,format)

    Formats the date value according to the format string.

    The following specifiers may be used in the format string. The .%. character is required before format specifier characters.

    Specifier Description
    %a Abbreviated weekday name (Sun..Sat)
    %b Abbreviated month name (Jan..Dec)
    %c Month, numeric (0..12)
    %D Day of the month with English suffix (0th, 1st, 2nd, 3rd, .)
    %d Day of the month, numeric (00..31)
    %e Day of the month, numeric (0..31)
    %f Microseconds (000000..999999)
    %H Hour (00..23)
    %h Hour (01..12)
    %I Hour (01..12)
    %i Minutes, numeric (00..59)
    %j Day of year (001..366)
    %k Hour (0..23)
    %l Hour (1..12)
    %M Month name (January..December)
    %m Month, numeric (00..12)
    %p AM or PM
    %r Time, 12-hour (hh:mm:ss followed by AM or PM)
    %S Seconds (00..59)
    %s Seconds (00..59)
    %T Time, 24-hour (hh:mm:ss)
    %U Week (00..53), where Sunday is the first day of the week
    %u Week (00..53), where Monday is the first day of the week
    %V Week (01..53), where Sunday is the first day of the week; used with %X
    %v Week (01..53), where Monday is the first day of the week; used with %x
    %W Weekday name (Sunday..Saturday)
    %w Day of the week (0=Sunday..6=Saturday)
    %X Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
    %x Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
    %Y Year, numeric, four digits
    %y Year, numeric (two digits)
    %% A literal .%. character
    %x x, for any.x. not listed above

    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
    +---------------------------------------------------------+
    | DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y')          |
    +---------------------------------------------------------+
    | Saturday October 1997                                   |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00'
        -> '%H %k %I %r %T %S %w');
    +---------------------------------------------------------+
    | DATE_FORMAT('1997-10-04 22:23:00.......                 |
    +---------------------------------------------------------+
    |  22 22 10 10:23:00 PM 22:23:00 00 6                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DATE_SUB(date,INTERVAL expr unit)

    This is similar to DATE_ADD() function.

    DAY(date)

    DAY() is a synonym for DAYOFMONTH().

    DAYNAME(date)

    Returns the name of the weekday for date.

    mysql> SELECT DAYNAME('1998-02-05');
    +---------------------------------------------------------+
    | DAYNAME('1998-02-05')                                   |
    +---------------------------------------------------------+
    | Thursday                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DAYOFMONTH(date)

    Returns the day of the month for date, in the range 0 to 31.

    mysql> SELECT DAYOFMONTH('1998-02-03');
    +---------------------------------------------------------+
    | DAYOFMONTH('1998-02-03')                                |
    +---------------------------------------------------------+
    | 3                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DAYOFWEEK(date)

    Returns the weekday index for date (1 = Sunday, 2 = Monday, ., 7 = Saturday). These index values correspond to the ODBC standard.

    mysql> SELECT DAYOFWEEK('1998-02-03');
    +---------------------------------------------------------+
    |DAYOFWEEK('1998-02-03')                                  |
    +---------------------------------------------------------+
    | 3                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    DAYOFYEAR(date)

    Returns the day of the year for date, in the range 1 to 366.

    mysql> SELECT DAYOFYEAR('1998-02-03');
    +---------------------------------------------------------+
    | DAYOFYEAR('1998-02-03')                                 |
    +---------------------------------------------------------+
    | 34                                                      |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    EXTRACT(unit FROM date)

    The EXTRACT() function uses the same kinds of unit specifiers as DATE_ADD() or DATE_SUB(), but extracts parts from the date rather than performing date arithmetic.

    mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');
    +---------------------------------------------------------+
    | EXTRACT(YEAR FROM '1999-07-02')                         |
    +---------------------------------------------------------+
    | 1999                                                    |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
    +---------------------------------------------------------+
    | EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03')          |
    +---------------------------------------------------------+
    | 199907                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    FROM_DAYS(N)

    Given a day number N, returns a DATE value.

    mysql> SELECT FROM_DAYS(729669);
    +---------------------------------------------------------+
    | FROM_DAYS(729669)                                       |
    +---------------------------------------------------------+
    | 1997-10-07                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    Use FROM_DAYS() with caution on old dates. It is not intended for use with values that precede the advent of the Gregorian calendar (1582).

    FROM_UNIXTIME(unix_timestamp)

    FROM_UNIXTIME(unix_timestamp,format)

    Returns a representation of the unix_timestamp argument as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone. unix_timestamp is an internal timestamp value such as is produced by the UNIX_TIMESTAMP() function.

    If format is given, the result is formatted according to the format string, which is used the same way as listed in the entry for the DATE_FORMAT() function.

    mysql> SELECT FROM_UNIXTIME(875996580);
    +---------------------------------------------------------+
    | FROM_UNIXTIME(875996580)                                |
    +---------------------------------------------------------+
    | 1997-10-04 22:23:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    HOUR(time)

    Returns the hour for time. The range of the return value is 0 to 23 for time-of-day values. However, the range of TIME values actually is much larger, so HOUR can return values greater than 23.

    mysql> SELECT HOUR('10:05:03');
    +---------------------------------------------------------+
    | HOUR('10:05:03')                                        |
    +---------------------------------------------------------+
    | 10                                                      |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    LAST_DAY(date)

    Takes a date or datetime value and returns the corresponding value for the last day of the month. Returns NULL if the argument is invalid.

    mysql> SELECT LAST_DAY('2003-02-05');
    +---------------------------------------------------------+
    | LAST_DAY('2003-02-05')                                  |
    +---------------------------------------------------------+
    | 2003-02-28                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    LOCALTIME and LOCALTIME()

    LOCALTIME and LOCALTIME() are synonyms for NOW().

    LOCALTIMESTAMP and LOCALTIMESTAMP()

    LOCALTIMESTAMP and LOCALTIMESTAMP() are synonyms for NOW().

    MAKEDATE(year,dayofyear)

    Returns a date, given year and day-of-year values. dayofyear must be greater than 0 or the result is NULL.

    mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
    +---------------------------------------------------------+
    | MAKEDATE(2001,31), MAKEDATE(2001,32)                    |
    +---------------------------------------------------------+
    | '2001-01-31', '2001-02-01'                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    MAKETIME(hour,minute,second)

    Returns a time value calculated from the hour, minute, and second arguments.

    mysql> SELECT MAKETIME(12,15,30);
    +---------------------------------------------------------+
    | MAKETIME(12,15,30)                                      |
    +---------------------------------------------------------+
    | '12:15:30'                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    MICROSECOND(expr)

    Returns the microseconds from the time or datetime expression expr as a number in the range from 0 to 999999.

    mysql> SELECT MICROSECOND('12:00:00.123456');
    +---------------------------------------------------------+
    | MICROSECOND('12:00:00.123456')                          |
    +---------------------------------------------------------+
    | 123456                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    MINUTE(time)

    Returns the minute for time, in the range 0 to 59.

    mysql> SELECT MINUTE('98-02-03 10:05:03');
    +---------------------------------------------------------+
    | MINUTE('98-02-03 10:05:03')                             |
    +---------------------------------------------------------+
    | 5                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    MONTH(date)

    Returns the month for date, in the range 0 to 12.

    mysql> SELECT MONTH('1998-02-03')
    +---------------------------------------------------------+
    | MONTH('1998-02-03')                                     |
    +---------------------------------------------------------+
    | 2                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    MONTHNAME(date)

    Returns the full name of the month for date.

    mysql> SELECT MONTHNAME('1998-02-05');
    +---------------------------------------------------------+
    | MONTHNAME('1998-02-05')                                 |
    +---------------------------------------------------------+
    | February                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    NOW()

    Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.

    mysql> SELECT NOW();
    +---------------------------------------------------------+
    | NOW()                                                   |
    +---------------------------------------------------------+
    | 1997-12-15 23:50:26                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    PERIOD_ADD(P,N)

    Adds N months to period P (in the format YYMM or YYYYMM). Returns a value in the format YYYYMM. Note that the period argument P is not a date value.

    mysql> SELECT PERIOD_ADD(9801,2);
    +---------------------------------------------------------+
    | PERIOD_ADD(9801,2)                                      |
    +---------------------------------------------------------+
    | 199803                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    PERIOD_DIFF(P1,P2)

    Returns the number of months between periods P1 and P2. P1 and P2 should be in the format YYMM or YYYYMM. Note that the period arguments P1 and P2 are not date values.

    mysql> SELECT PERIOD_DIFF(9802,199703);
    +---------------------------------------------------------+
    | PERIOD_DIFF(9802,199703)                                |
    +---------------------------------------------------------+
    | 11                                                      |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    QUARTER(date)

    Returns the quarter of the year for date, in the range 1 to 4.

    mysql> SELECT QUARTER('98-04-01');
    +---------------------------------------------------------+
    | QUARTER('98-04-01')                                     |
    +---------------------------------------------------------+
    | 2                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    SECOND(time)

    Returns the second for time, in the range 0 to 59.

    mysql> SELECT SECOND('10:05:03');
    +---------------------------------------------------------+
    | SECOND('10:05:03')                                      |
    +---------------------------------------------------------+
    | 3                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    SEC_TO_TIME(seconds)

    Returns the seconds argument, converted to hours, minutes, and seconds, as a value in 'HH:MM:SS' or HHMMSS format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT SEC_TO_TIME(2378);
    +---------------------------------------------------------+
    | SEC_TO_TIME(2378)                                       |
    +---------------------------------------------------------+
    | 00:39:38                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    STR_TO_DATE(str,format)

    This is the inverse of the DATE_FORMAT() function. It takes a string str and a format string format. STR_TO_DATE() returns a DATETIME value if the format string contains both date and time parts, or a DATE or TIME value if the string contains only date or time parts.

    mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
    +---------------------------------------------------------+
    | STR_TO_DATE('04/31/2004', '%m/%d/%Y')                   |
    +---------------------------------------------------------+
    | 2004-04-31                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    SUBDATE(date,INTERVAL expr unit) and SUBDATE(expr,days)

    When invoked with the INTERVAL form of the second argument, SUBDATE() is a synonym for DATE_SUB(). For information on the INTERVAL unit argument, see the discussion for DATE_ADD().

    mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
    +---------------------------------------------------------+
    | DATE_SUB('1998-01-02', INTERVAL 31 DAY)                 |
    +---------------------------------------------------------+
    | 1997-12-02                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
    +---------------------------------------------------------+
    | SUBDATE('1998-01-02', INTERVAL 31 DAY)                  |
    +---------------------------------------------------------+
    | 1997-12-02                                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    SUBTIME(expr1,expr2)

    SUBTIME() returns expr1 . expr2 expressed as a value in the same format as expr1. expr1 is a time or datetime expression, and expr2 is a time.

    mysql> SELECT SUBTIME('1997-12-31 23:59:59.999999',
        -> '1 1:1:1.000002');
    +---------------------------------------------------------+
    | SUBTIME('1997-12-31 23:59:59.999999'...                 |
    +---------------------------------------------------------+
    | 1997-12-30 22:58:58.999997                              |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    SYSDATE()

    Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT SYSDATE();
    +---------------------------------------------------------+
    | SYSDATE()                                               |
    +---------------------------------------------------------+
    | 2006-04-12 13:47:44                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIME(expr)

    Extracts the time part of the time or datetime expression expr and returns it as a string.

    mysql> SELECT TIME('2003-12-31 01:02:03');
    +---------------------------------------------------------+
    | TIME('2003-12-31 01:02:03')                             |
    +---------------------------------------------------------+
    | 01:02:03                                                |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIMEDIFF(expr1,expr2)

    TIMEDIFF() returns expr1 . expr2 expressed as a time value. expr1 and expr2 are time or date-and-time expressions, but both must be of the same type.

    mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
        -> '1997-12-30 01:01:01.000002');
    +---------------------------------------------------------+
    | TIMEDIFF('1997-12-31 23:59:59.000001'.....              |
    +---------------------------------------------------------+
    |  46:58:57.999999                                        |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

    With a single argument, this function returns the date or datetime expression expr as a datetime value. With two arguments, it adds the time expression expr2 to the date or datetime expression expr1 and returns the result as a datetime value.

    mysql> SELECT TIMESTAMP('2003-12-31');
    +---------------------------------------------------------+
    | TIMESTAMP('2003-12-31')                                 |
    +---------------------------------------------------------+
    | 2003-12-31 00:00:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIMESTAMPADD(unit,interval,datetime_expr)

    Adds the integer expression interval to the date or datetime expression datetime_expr. The unit for interval is given by the unit argument, which should be one of the following values: FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

    The unit value may be specified using one of keywords as shown, or with a prefix of SQL_TSI_. For example, DAY and SQL_TSI_DAY both are legal.

    mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
    +---------------------------------------------------------+
    | TIMESTAMPADD(MINUTE,1,'2003-01-02')                     |
    +---------------------------------------------------------+
    | 2003-01-02 00:01:00                                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

    Returns the integer difference between the date or datetime expressions datetime_expr1 and datetime_expr2. The unit for the result is given by the unit argument. The legal values for unit are the same as those listed in the description of the TIMESTAMPADD() function.

    mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
    +---------------------------------------------------------+
    | TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01')          |
    +---------------------------------------------------------+
    | 3                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIME_FORMAT(time,format)

    This is used like the DATE_FORMAT() function, but the format string may contain format specifiers only for hours, minutes, and seconds.

    If the time value contains an hour part that is greater than 23, the %H and %k hour format specifiers produce a value larger than the usual range of 0..23. The other hour format specifiers produce the hour value modulo 12.

    mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
    +---------------------------------------------------------+
    | TIME_FORMAT('100:00:00', '%H %k %h %I %l')              |
    +---------------------------------------------------------+
    | 100 100 04 04 4                                         |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TIME_TO_SEC(time)

    Returns the time argument, converted to seconds.

    mysql> SELECT TIME_TO_SEC('22:23:00');
    +---------------------------------------------------------+
    | TIME_TO_SEC('22:23:00')                                 |
    +---------------------------------------------------------+
    | 80580                                                   |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    TO_DAYS(date)

    Given a date date, returns a day number (the number of days since year 0).

    mysql> SELECT TO_DAYS(950501);
    +---------------------------------------------------------+
    | TO_DAYS(950501)                                         |
    +---------------------------------------------------------+
    | 728779                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

    If called with no argument, returns a Unix timestamp (seconds since '1970-01-01 00:00:00' UTC) as an unsigned integer. If UNIX_TIMESTAMP() is called with a date argument, it returns the value of the argument as seconds since '1970-01-01 00:00:00' UTC. date may be a DATE string, a DATETIME string, a TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD.

    mysql> SELECT UNIX_TIMESTAMP();
    +---------------------------------------------------------+
    | UNIX_TIMESTAMP()                                        |
    +---------------------------------------------------------+
    | 882226357                                               |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
    +---------------------------------------------------------+
    | UNIX_TIMESTAMP('1997-10-04 22:23:00')                   |
    +---------------------------------------------------------+
    | 875996580                                               |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    UTC_DATE, UTC_DATE()

    Returns the current UTC date as a value in 'YYYY-MM-DD' or YYYYMMDD format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
    +---------------------------------------------------------+
    | UTC_DATE(), UTC_DATE() + 0                              |
    +---------------------------------------------------------+
    | 2003-08-14, 20030814                                    |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    UTC_TIME, UTC_TIME()

    Returns the current UTC time as a value in 'HH:MM:SS' or HHMMSS format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
    +---------------------------------------------------------+
    | UTC_TIME(), UTC_TIME() + 0                              |
    +---------------------------------------------------------+
    | 18:07:53, 180753                                        |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    UTC_TIMESTAMP, UTC_TIMESTAMP()

    Returns the current UTC date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function is used in a string or numeric context.

    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
    +---------------------------------------------------------+
    | UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0                    |
    +---------------------------------------------------------+
    | 2003-08-14 18:08:04, 20030814180804                     |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    WEEK(date[,mode])

    This function returns the week number for date. The two-argument form of WEEK() allows you to specify whether the week starts on Sunday or Monday and whether the return value should be in the range from 0 to 53 or from 1 to 53. If the mode argument is omitted, the value of the default_week_format system variable is used

    Mode First Day of week Range Week 1 is the first week .
    0 Sunday 0-53 with a Sunday in this year
    1 Monday 0-53 with more than 3 days this year
    2 Sunday 1-53 with a Sunday in this year
    3 Monday 1-53 with more than 3 days this year
    4 Sunday 0-53 with more than 3 days this year
    5 Monday 0-53 with a Monday in this year
    6 Sunday 1-53 with more than 3 days this year
    7 Monday 1-53 with a Monday in this year

    mysql> SELECT WEEK('1998-02-20');
    +---------------------------------------------------------+
    | WEEK('1998-02-20')                                      |
    +---------------------------------------------------------+
    | 7                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    WEEKDAY(date)

    Returns the weekday index for date (0 = Monday, 1 = Tuesday, . 6 = Sunday).

    mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
    +---------------------------------------------------------+
    | WEEKDAY('1998-02-03 22:23:00')                          |
    +---------------------------------------------------------+
    | 1                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    WEEKOFYEAR(date)

    Returns the calendar week of the date as a number in the range from 1 to 53. WEEKOFYEAR() is a compatibility function that is equivalent to WEEK(date,3).

    mysql> SELECT WEEKOFYEAR('1998-02-20');
    +---------------------------------------------------------+
    | WEEKOFYEAR('1998-02-20')                                |
    +---------------------------------------------------------+
    | 8                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    YEAR(date)

    Returns the year for date, in the range 1000 to 9999, or 0 for the .zero. date.

    mysql> SELECT YEAR('98-02-03');
    +---------------------------------------------------------+
    | YEAR('98-02-03')                                        |
    +---------------------------------------------------------+
    | 1998                                                    |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    YEARWEEK(date), YEARWEEK(date,mode)

    Returns year and week for a date. The mode argument works exactly like the mode argument to WEEK(). The year in the result may be different from the year in the date argument for the first and the last week of the year.

    mysql> SELECT YEARWEEK('1987-01-01');
    +---------------------------------------------------------+
    | YEAR('98-02-03')YEARWEEK('1987-01-01')                  |
    +---------------------------------------------------------+
    | 198653                                                  |
    +---------------------------------------------------------+
    1 row in set (0.00 sec)
    

    Note that the week number is different from what the WEEK() function would return (0) for optional arguments 0 or 1, as WEEK() then returns the week in the context of the given year.

     

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Mysql - Comment달기

    CREATE TABLE `momo` (
      `rownum` int(11) NOT NULL comment '메모' auto_increment,
      PRIMARY KEY  (`rownum`)
    ) ENGINE=InnoDB DEFAULT CHARSET=euckr COMMENT='momo';

    테이블 Comment보기
    select *
    from all_tab_comments
    where table_name = '테이블명';

    칼럼 Comment보기
    select *
    from all_col_comments
    where table_name = '테이블명';

    [출처] Mysql Comment달기|작성자 세은맘

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    MySql에 대한 기본 사용방법 및 명령어에 대해 알아본다.

    - 목차 -

    1. Mysql 기본 사용법
    2. 데이터베이스 생성 및 삭제
    3. 새로 생성한 데이터베이스 등록하기
    4.  Mysql 사용자등록
    5. 테이블 생성 및 삭제
    6. 테이블속성 및 구조변경법
    7. 데이터 입력하기 (INSERT)
    8. 데이터 검색 (SELECT)
    9. 데이터 수정하기(UPDATE)
    10. 데이터 삭제하기(DELETE)
    11. 새로운 사용자 등록
    12. 일반사용자 권한설정(보안사항)
    13 .Mysql root 암호 변경하기
    14. root 패스워드를 잊어버렸을 때는 어떻게?
    15. 특정 테이블의 구조보기
    16. 현재 상태 보기(STATUS)



    1. Mysql 기본 사용법


    ● Mysql 데이터베이스 접속하기

    # mysql -u 사용자명 -p dbname

    설치 직후에는 root 사용자에 비밀번호가 없으므로 다음과 같이 접속하여 MySQL을 관리할 수 있다.

    # mysql -u root mysql


    ● mysql 관리자 root 패스워드 설정하기

    MySQL을 설치한 직후에는 root 계정에 암호가 지정되어 있지 않다.
    다음 세가지 방법으로 비밀번호를 변경 할 수 있다.

     ▶ mysqladmin이용
    # mysqladmin -u root password 새비밀번호

     ▶ update문 이용
    # mysql -u root mysql

    mysql> UPDATE user SET password=password('새비밀번호') WHERE user='root';
    mysql> FLUSH PRIVILEGES;

    mysql> update user set password = password('shcm0816') where user = ' root';

    일단 root 비밀번호가 설정된 상태에서는 
    mysql이나 mysqladmin 명령을 실행할 때 -p 옵션을 붙여주고 
    기존 비밀번호를 입력해야만 한다.

     ▶ Set Password 이용
    SET PASSWORD FOR root=password('새비밀번호');


     ▶ 빠져나간후 데이터베이스를 재시작
    # mysqladmin -u root reload

     ▶ 패스워드 입력
    # mysql -u root -p mysql



    ● 사용자 추가/삭제

    mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@localhost IDENTIFIED BY 'password';

    username 이라는 사용자를 password라는 비밀번호를 갖도록 하여 추가한다. 
    username은 dbname이라는 데이타베이스에 대해 모든 권한을 가지고 있다.
    username 사용자는 로컬 호스트에서만 접속할 수 있다. 

     ▶ 다른 호스트에서 접속하려면
    mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@'%' IDENTIFIED BY 'password';

    위를 또한 번 실행한다. '%'에서 홑따옴표를 주의한다.

     ※ 추가
    '%'를 호스트네임으로 지정해도 모든 호스트에서 접속할 수 없었다. 
    각 호스트별로 다 지정해야 했다.

     ▶ 불필요한 사용자 삭제는
    mysql> DLETE FROM user WHERE user='username';
    mysql> FLUSH PRIVILEGES;





    2. 데이터베이스 생성 및 삭제

    ● 데이터베이스 생성

    ① 첫번째 방법
    # mysql -u root -p mysqlll
        msyql> create database TESTDB;
        msyql> show databases;

    ② 두번째 방법
    # ./mysqladmin -u root -p create testdb2
    Enter password:
    # ./mysql -u root -p mysql
    Enter passwor

    현재 존재하는 데이터베이스 목록을 보여준다.
    cd /
    msyql> show databases;
    msyql> exit
    Bye
    #

    특정 데이타베이스를 사용하겠다고 선언한다.
    mysql> USE dbname;


    ● 데이타 베이스 삭제

    # ./mysqladmin -u root -p drop testdb2
    Enter password:

    -- mysql> DROP DATABASE [IF EXISTS] dbname;
    mysql> drop database testdb2

    IF EXISTS 옵션은 비록 데이타베이스가 없더라도 오류를 발생시키지 말라는 의미이다.

    # ./mysql -u root -p mysql
    msyql> show databases;
    msyql> desc user =>동일한 결과



    3. 새로 생성한 데이터베이스 등록하기

    데이터베이스를 새로 생성한 후에는 mysql 이라는 관리용 데이터베이스에 등록한다.
    mysql 이라는 데이터베이스의 db라는 테이블에 TESTDB를 등록한 것

    msyql> insert into db  values('%','TESTDB','root','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
    msyql> select host, db, user from db;



    4.  Mysql 사용자등록(데이터베이스 소유자)

     ▶ mysql 을 사용할 사용자는 반드시 user 라는 테이블에 등록을 해줘야함
    msyql> insert into user (host, user, password) values('localhost', 'sspark', password('shcm0816'));

     ▶ 정상적인 등록여부 확인
    msyql> select host, user, password from user; 

     ▶ sspark이라는 사용자로 mysql 데이터베이스로 접속
    msyql> mysql -u sspark -p
    Enter password:

     ▶ 새로운 데이터베이스를 생성하거나 새로운 사용자를 생성한 후에는 
        반드시 reload를 해줘야함
    # mysqladmin -u root -p reload
    Enter password:




    5. 테이블 생성 및 삭제

     ▶ 테이블 생성
    msyql> create table testtable (
             ->uid mediumint(4) unsigned DEFAULT '0' NOT NULL auto_increment,
             -> name varchar(12) DEFAULT "" NOT NULL,
             -> email varchar (20) DEFAULT "" NOT NULL,
             -> PRIMARY KEY (uid)
             -> );
    Query OK, 0 rows affected (0.00 sec)

     ▶ 현재 데이터베이스의 테이블 목록 확인
    msyql>show tables;

     ▶ 필드 구조가 정의한 필드구조로 생성되었는지 확인
    msyql> desc testtable;

     ▶ 테이블 삭제
    msyql> drop table testtable;
    mysql> show tables;



    6. 테이블속성 및 구조변경법

     ▶ 테이블 구조 확인
    mysql> EXPLAIN tablesname;
    혹은
    mysql> DESCRIBE tablename;

     ▶ 기존 테이블에 필드 추가하기
    ALTER TABLE 테이블명 CHANGE[COLUMN] 필드명 필드타입

    mysql> er table testtable add column homepage varchar(30);
    mysql> desc testtable;

     ▶ 기존에 필드 속성 변경하기
    ALTER TABLE 테이블명 CHANGE[COLUMN] 기존필드명 새필드명 필드타입

    mysql> er table testtable change column homepage home varchar(50);

     ▶ 테이블 이름 변경
    mysql> RENAME TABLE tablename1 TO tablename2[, tablename3 TO tablename4];

     ▶ 기존에 필드 삭제
    ALTER TABLE 테이블명 DROP [COLUMN] 필드명

    mysql> er table testtable drop column home;
    mysql> desc testtable;

     ▶ 기존의 테이블삭제하기
    mysql> create table sampletable
    mysql> show tables;
    mysql> drop table sampletable;
    mysql> show tables;



    7. 데이터 입력하기 (INSERT)

    INSERT INTO tablename VALUES(값1, 값2, ...);

    mysql> insert into testtable (uid, name, email) 
    mysql> values (', 'parksungsoo', sspark09@soback.kornet.net'" target=_blank>'sspark09@soback.kornet.net');

     ※ 주의: uid라는 필드는 auto_increment 라는 속성으로 생성했기 때문에 
    이 속성을 가진 필드들은 실제로 데이터값을 주지 않아도 자동적으로 1씩 증가.

     ▶ 삽입할 필드는 생략가능
    mysql> insert into testtable values(','sontaesoo','shutterbug@orgio.net');


    특정 필드에만 데이터를 입력할 경우에는 
    입력할 필드이름만을 나열하고 그에 해당하는 데이터를 입력한다.

    mysql> insert into testtable (uid,name) values(','junwooki');

     ▶ 정상적으로 입력되었는지 확인
    mysql> select * from testtable;




    8. 데이터 검색 (SELECT)

    SELECT col1, col2, ... FROM tablename;

     ▶ 테이블의 모든 테이터를 검색
    mysql> select * from testtable;

    컬럼명을 *로 하면 모든 컬럼 의미.

     ▶ uid와 name 필드만을 조회
    mysql> select uid, name from testtable;

     ▶ where문을 사용하여 특정 조건에 맞는 데이터만을 검색
    mysql> select * from testtable where name = "sontaesoo";

     ▶ 출력 결과 레코드의 중복제거하기(DISTINCT)
    SELECT DISTINCT sex FROM testtable;

     ▶ 'soo'라는 문자가 포함된 데이터를 모두 검색 (LIKE)
    SELECT name FROM testtable WHERE name LIKE '%soo%'

    mysql> select name from testtable where name LIKE '%soo%';

     ▶ 특정한  한 문자로 시작하는 데이터만을 출력
    SELECT name FROM testable WHERE name LIKE 'park%'

    mysql> select name from testtable where name LIKE 'park%';

     ▶ 특정 필드에 데이터가 NULL 인 경우
    SELECT uid, name FROM testtable WHERE age IS NULL

    mysql> select uid, name from testtable where age IS NULL;

     ▶ 특정 필드의 데이터가 NULL이 아닌 경우
    SELECT uid, name FROM testtable WHERE age IS NULL

    mysql> select uid, name from testtable where age IS NOT NULL;

     ▶ WHERE 조건문이 여러개 일 경우 (AND/OR) 
    mysql> SELECT name, uid, email FROM testtable WHERE savem > 5000 AND sex='M';

     ▶ 결과데이터를 정렬하기 (ORDER BY)
    mysql> SELECT name, uid, savem FROM testtable WHERE savem >= 5000 ORDER BY savem DESC;

    DESC는 내림차순 ASC는 오름차순.

     ▶ 총 개수 구하기 (COUNT())
    mysql> SELECT count(*) FROM testtable WHERE sex='M';

     ▶ 평균 구하기 (AVG())
    mysql> SELECT avg(savem) FROM testtable WHERE sex='M';

     ▶ 컬럼의 이름을 바꿔서 출력.
    mysql> SELECT col1 AS '성명', col2 AS '국어점수' FROM grade;
    mysql> SELECT col1, korean + math + english AS '총점' FROM tablename ORDER BY '총점' ASC;

     ▶ 결과중 처음부터 10개만 가져오기
    mysql> SELECT * FROM grade LIMIT 10;

     ▶ 결과중 100번째부터 10개만 가져오기.(첫번째 레코드는 0번 부터 시작한다.)
    mysql> SELECT * FROM grade LIMIT 100, 10;



    9. 데이터 수정하기(UPDATE)

    UPDATE 테이블명 
    SET 필드명=필드값 또는 산술식 {, 필드명 = 필드값 또는 산술식}
    [WHERE 검색조건]

    mysql> select * from testtable;

     ▶ uid 4 번의 데이터에 name 값과 email을 입력해 봄
    mysql> update testtable set name = 'junyangmi' where age = 23;
    mysql> update testtable set email = jym@superuser.co.kr'" target=_blank>'jym@superuser.co.kr' where age = 23;
    mysql> select * from testtable;

     ▶ uid 1 인 사람 (parksungsoo)의 나이를 25살로 수정
    mysql> update testtable set age= 25 where uid =1;

     ▶ uid 2인 사람의 나이를 30살로 수정
    mysql> update testtable set age = 30 where uid =2;
    mysql> update testtable set age = 41 where uid=3;

     ▶ 한해가 지났으므로 모든 사람의 나이를 한 살씩 증가
    mysql> update testtable set age = age + 1;
    mysql> select * from testtable;



    10. 데이터 삭제하기(DELETE)

    DELETE FROM 테이블명 [WHERE 검색조건]

    mysql> select * from testtable;
    mysql> delete from testtable where uid = 3;



    11. 새로운 사용자 등록

     ▶ Mysql 에 root로 접속
    ./mysql -u root -p

     ▶ Mysql DB 선택
    mysql> use mysql;
    mysql> show tables;

     ▶ 새로운 DB 생성
    mysql> create database xlare;

     ▶ user 테이블에 입력 
    (user 라는 테이블에 새로운 사용자의 계정이름과 권한설정을 할 차례)
    호스팅사용자에 대한 설정 user테이블에 현재 사용장0ㅔ 대한 권한들을 모두 'N'로 설정
    mysql> insert into user valuses('localhost', 'xlare', password('123'),'Y','Y','Y','Y','Y','N','N','N','N','N','N','N','N','N');

     ▶ user  테이블에 입력확인
    mysql> select * from user where user = 'xlare' ;

     ▶ db 테이블에 입력
    mysql> insert into db values('localhost', 'xlare', 'xlare', 'Y','Y','Y','Y','Y','N','N','N','N','N',);

     ▶ db 테이블에 입력 확인
    mysql> select * from db where db = 'xlare';

    새로운 설정을 바로 적용키위해 mysqladmin 이라는 관리자명령어로 mysql을 재시작한다.
    reload를 해주지 않으면 생성했던 것들이 적용이 되지 않는다

    # ./mysqladmin -u root -p reload;




    12. 일반사용자 권한설정(보안사항)

    #./mysql -u root -p mysql
    Enter password:
    mysql> show tables;
    --------------------
    tables in mysql
    --------------------
    columns_priv
    db
    func
    host
    tables_priv
    user
    ----------------------

     ▶ columns_priv 테이블
    모든 특정 DB 의 특정 User 에 대한 특정 테이블의 각 컬럼에 대한 
    select, insert, update, reference 권한을 설정한다.

    mysql> desc columns_priv;

     ▶ db 테이블
    db라는 테이블에는 특정 DB에 대한 user들의 여러가지 권한들을 설정하는 테이블

    mysql> desc db;

    kebia 라는 데이터베이스의 소유자와 그 권한에 대해서 알아보고자 한다.
    kebia 라는 데이터베이스의 소유자는 hyung 이라는 mysqkl 사용자이며 
    이 hyung 이라는 사용자는 이 kebia 라는 데이터베이스에 대한 각종 권한을 볼수 있다.

    mysql> select * from db where db = 'kebia';
    | localhost | kebia | hyung | Y  |   - - - - - ...........
    ------------------------

     ▶ tables_priv테이블
    columns_priv 테이블처럼 각 데이터베이스와 사용자 및 그 테이블에 대한 권한을 설정한다.

    mysql > desc tables_priv;
    ---------------------

     ▶ user 테이블
    - 새로운 사용자를 생성할 때 이 테이블에 등록한다.
    - 특정 사용자에 대한 Mysql에 존재하는 모든 데이터베이스에 대한 권한을 설정한다.
    - 특정 사용자의 어떤권한에 대한 사항은 특정 데이터베이스가 아니라 Mysql에 존재하는 모든 데이터베이스에 권한이 주어진다.
    - host와 user, password 항목을 제외한 나머지 권한들은 모두 'N'으로 설정한다.
    - 특정한 사용자에 대한 특정한 데이터베이스에 대한 권한을 주려면 위에서 보았던 db라는 테이블에서 그 권한설정을 하는것이 안전하다.



    13 .Mysql root 암호 변경하기

     ▶ 방법 1
    mysqladmin 이라는 명령어 사용
    # ./mysqladmin -u root -p password 12345

     ▶ 방법 2
    mysql의 set 이란 명령어로 root 암호 변경
    # ./mysql -u root -p mysql
    mysql> set password for root=passwd('12345678');

     ▶ 방법 3
    mysql 데이터베이스로 접속하여 update문을 사용하는 방법
    # ./mysql -u root -p mysql
    mysql> update user set password=password('12345' where user = 'root';
    mysql> flush privileges;

     ▶ flush-privileges
    권한 테이블을 재시작한다. 권한 설정을 변경했을경우 반드시 재시작한다.
    mysql> flush privileges;



    14. root 패스워드를 잊어버렸을 때는 어떻게?

     ▶ 단계 1
    실행중인 mysql 종료
    # ps -ef | grep mysqld
    # killall mysqld

     ▶ 단계 2
    grant-table 미사용모드로 mysql시작 및 root로 접속
    # .safe_mysqld --skip-grant-tables&

     ▶ 단계 3
    update문으로 root사용자 패스워드 변경
    mysql> update user set password=password('12345') where user = 'root';
    mysql> flush privileges;

     ▶ 단계 4
    실행중인 mysql 다시 종료
    # ps -ef | grep mysqld
    # killall mysqld

     ▶ 단계 5
    일반모드로 Mysql 재시작
    # ./safe_mysqld&
    # ps -ef | grep mysql



    15. 특정 테이블의 구조보기(show columns from 테이블)

    특정테이블의 필드명 type, 설정값들을 보기 위한 것이다.

     ▶ 특정한 테이블의 칼럼(필드)구조 확인
    SHOW COLUMNS FROM tablename;

    mysql> show columns form user;

     ▶ 필드 구조가 정의한 필드구조로 생성되었는지 확인
    DESC 테이블명

     ▶ 특정 테이블의 인덱스 보기
    mysql> show index from user;

     ▶ 데이타베이스의 설정상태 보기(show status)
    mysql> show status;
    # ./mysqladmin -u root -p status

     ▶ 데이터베이스의 설정환경변수와 값보기(show variables)
    mysql> show variables;
    # ./mysqladmin -u root -p variables

     ▶ 현재 데이터베이스에 연결된 프로세스들 보기(show processlist)
    # ./mysqladmin -u root -p processlist


     ▶ mysql 원격접속 권한 설정

    mysql> use mysql
    mysql> grant all privileges on *.* to 'oops'@'192.168.5.14'      
    mysql> identified by 'passwd' with grant option;

    ip대신 % 를 주면 모든 호스트허용!
    oops 라는 유저가 모든 권한을 부여받을 수있다. 
    단 해당 아이피의 호스트 에서만.
    이와 같은 설정은 select host,user from user; 로 확인해볼수 있다.



    16. 현재 상태 보기

    mysql> status;

    --------------
    mysql Ver 11.18 Distrib 3.23.58, for pc-linux (i686)

    Connection id: 26
    Current database: study
    Current user: study@localhost
    Current pager: stdout
    Using outfile: '
    Server version: 3.23.58
    Protocol version: 10
    Connection: Localhost via UNIX socket
    Client characterset: latin1
    Server characterset: euc_kr
    UNIX socket: /var/lib/mysql/mysql.sock
    Uptime: 2 hours 9 min 59 sec

    Threads: 1 Questions: 160 Slow queries: 0 Opens: 28 Flush tables: 1
    Open tables: 1 Queries per second avg: 0.021
    --------------




    참고

    네이버 지식인

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    사용자 추가 명령어:
    mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@localhost IDENTIFIED BY 'password';
    username 사용자를 password 라는 비밀번호를 갖도록 추가 한다
    그리고 dbname 라는 데이터베이스를 사용할것이며 모든 권한을 부여한다.
    username 사용자는 로칼 호스트에서만 접속할 수 있다.
    사용자 삭제:
    mysql> delete from user where user='username';
    mysql> flush privileges;
    데이터베이스 생성
    mysql> create database dbname; -->dbname 이름으로 데이터베이스 생성
    데이터베이스 삭제
    mysql> drop database dbname; -->dbname 이라는 데이터베이스 삭제
    mysql 기본 콘솔 명령 사용법
    mysql> status; --> mysql 정보를 출력한다
    mysql> show databases; --> 현재 존재하는 데이터베이스 목록보기
    mysql> use dbname; --> dbname 데이터베이스를 사용한다고 선언한다.
    mysql> show tables; --> 데이터베이스의 테이블 목록보기
    mysql> explain tablesname; --> 테이블 구조를 출력한다.
    mysql> DESCRIBE tablename; --> 테이블 구조를 출력한다.

    [출처] mysql 명령어 모음|작성자 짜릿남

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Tag mysql

    초보자를 위한 mysql 사용법 


    -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 
    원본사이트: http://www.devshed.com/Server_Side/MySQL/Intro/ 
    * Beginning MySQL Tutorial 
    *(o) By W.J. Gilmore 
    *(o)| April 03, 1999 
    (o)| | 번역 : 원주희(haremoon@won.hongik.ac.kr) 
    | | | 번역일자 : 1999년 9월26일 
    ============================================================================== 

     The Database 

    데이타베이스는 이제 모든 사람들의 생활에서 없어서는 안될 매우 중요한 부분이 되어졌다. 
    데이타베이스가 없다면 우리가 하고 있는 많은 일들은 매우 지루하고, 불편한 일들이 될 
    것이다. 은행과 대학, 도서관은 이러한 데이타베이스 시스템에 크게 의존하고 있는 기관의 
    예이며, 인터넷의 서치엔진, 온라인 쇼핑몰또한 데이타베이스를 이용하여 구축되어지고 있다. 
    데이타베이스는 하나의 컴퓨터가 데이타베이스 서버와 개방적인 상호 관계를 할 수 있도록 
    도와주는 도구이자 인터페이스의 역할을 한다. 

    T.c.X. DataKonsultAB에 의해 개발된 MySQL 서버는 현재 시장에서 급속하게 성장하고 있는 
    SQL(Structured Query Language) 데이타베이스 서버 중의 하나이다. MySQL은 
    http://www.mysql.com에서 다운로드 받을 수 있으며, 다른 데이타베이스 서버에서는 보기 
    드문 배열된 옵션과 유용한 특성을 가진 데이타베이스 프로그램을 제공한다. 무엇보다 
    도 MySQL의 가장 큰 장점은 개인적으로나 상업적으로 그것을 이용하기 바라는 모든 사람들 
    에게 무료로 제공되는 공개용 데이타베이스라는 것이다. MySQL을 사용하여 명확한 어플 
    리케이션을 개발하고 싶다면 MySQL's licensing ection(http://www.mysql.com/Manual 
    _chapter/manual_Licensing_and_Support.html)을 참고하기 바란다. 


    MySQL 서버는 다음의 내용을 포함하여 헤아릴 수 없이 많은 능력 가지고 있다. 

    · 동시 사용자의 수가 무제한적인 처리 능력 
    · 50,000,000+ record를 처리할 수 있는 용량 
    · 매우 빠른 명령 수행 능력(아마 시장에 나온 데이타베이스 중에 가장 빠를지도 모른다) 
    · 쉽고 능률적인 사용자 특권 시스템 

    그러나 어쩌면 그 수많은 능력 중에서도 가장 흥미로운 사실은 그것이 무료라는 것이다. 
    T.c.X 는 일반 대중에게 공개용 데이타베이스인 MySQL을 무료로 제공하고 있다. 


    누가 MySQL 서버를 사용하는가?(So Who's Using MySQL?) 

    MySQL 데이타베이스 서버는 다음과 같은 기관들에서 막대한 대중성을 얻어가며 사용되어지 
    고 있다. 
    · Silicon Graphics (http://www.sgi.com) 
    · Siemens (http://www.siemens.com) 
    만약 위의 글이 설득력 있기에 충분하지 않다면 더 많은 MySQL 사용자 목록을 
    MySQL User's List (http://www.mysql.com/users.html)에서 찾아 보기 바란다. 

    이 글은 MySQL 서버의 필수 조작과 기본적인 명령을 수행하기 위한 서버의 셋업, 적절하게 
    연결하는 방법을 포함하여 MySQL 서버의 기본적인 운용을 배우는 것을 도울 것이다. 
    만약 이미 MySQL에 대해서 기본적인 이해를 하고 있다면 이장을 뛰어 넘고 다음 장으로 
    가도 상관없다. 그러나 이 글에 쓰여진 명령어들은 좀 더 수준 높은 명령어를 위 
    한 기초로서, MySQL 언어에 있는 가장 중요한 명령어 중의 하나라는 점을 기억하기 바란다. 


    ● Part 1: 미리살펴보기(At First Glance) 
    ======================================= 

    MySQL은 일반적으로 telnet을 통해 들어간다. (괜찮은 Telnet 프로그램인 Easyterm은 
    http://www.arachnoid.com에서 구할 수 있다.) 한번이라도 웹서버에 telnet으로 접속한 
    적이 있다면 MySQL 서버에 접근하는 두 번째 명령어를 준비하기 바란다. 

    연결하기 위한 절차는 다음과 같습니다. 

    1. telnet 접속하기 : ISP에서 제공된 username(ID)과 password가 필요하다. 
    -------------------------------------------------------------------------- 
    login: haremoon 
    Password: ******** 
    Last login: Sat May 22 12:52:01 from 203.249.84.223 

    Sun Microsystems Inc. SunOS 5.6 Generic August 1997 

    You have new mail. 
    [haremoon@won /user/center/haremoon]# 
    -------------------------------------------------------------------------- 

    2. MySQL 연결하기

     MySQL 사용을 위해서는 명확하게 주어진 username과 password가 필요하다.

    이 정보는 ISP제공자에게 요청하면 제공된다. 

    -------------------------------------------------------------------------- 
    [haremoon@won /user/center/haremoon]# mysql -u root -p mysql 
    -------------------------------------------------------------------------- 
    Syntax : mysql -h hostname -u username -p password database 
    실행파일 | 호스트 | db유저 | 패스워드 |사용할 데이타베이스이름 
    또는 

    mysql -h hostname -u username -password=password database 

    -p 옵션에 의해 패스워드를 입력하는 프롬프트가 나오면 패스워드를 입력한다. 
    Enter password: 

    만약 MySQL이 올바르게 설치되었고 실행되었다면 다음과 같은 화면을 볼 수 있을 것이다. 
    -------------------------------------------------------------------------- 
    Welcome to the MySQL monitor. Commands end with ; or g. 
    Your MySQL connection id is 267 to server version: 3.22.16a-gamma 
    Type 'help' for help. 

    mysql> 
    -------------------------------------------------------------------------- 

    데이타베이스에 이미 연결되어 있다면 MySQL 언어의 여러 가지 명령어를 실행시켜도 좋다. 
    그러나 그렇지 않으면 먼저 데이타베이스에 연결하기 위해 다음의 명령을 수행합니다. 

    -------------------------------------------------------------------------- 
    mysql> use study --> 사용할 데이타베이스 
    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> 
    -------------------------------------------------------------------------- 
    여러분은 지금 데이타베이스에 연결 되어있다. 한가지 주목할 점은 MySQL에서 대부분의 모든 
    명령어는 세미클론 (;)에 의해 수행된다는 것이다. 

    우선 커맨드 라인에서 help, h 또는 ? 라고 입력하면 간단한 명령어 도움말을 볼 수 있다. 

    -------------------------------------------------------------------------- 
    mysql> help 

    MySQL commands: 
    help (h) Display this text 
    ? (h) Synonym for `help' 
    clear (c) Clear command 
    connect (r) Reconnect to the server. Optional arguments are db and host 
    edit (e) Edit command with $EDITOR 
    exit () Exit mysql. Same as quit 
    go (g) Send command to mysql server 
    ego (G) Send command to mysql server; Display result verically 
    print (p) print current command 
    quit (q) Quit mysql 
    rehash (#) Rebuild completion hash 
    status (s) Get status information from the server 
    use (u) Use another database. Takes database name as argument 

    Connection id: 268 (Can be used with mysqladmin kill) 
    mysql> 
    -------------------------------------------------------------------------- 
    이 명령들은 지금 당장 필요 없을지도 모른다. 그러나 그 명령어들의 의미를 정확히 
    알기 위해서 한번씩 테스트해 보는 것이 좋을 것이다. status, use, print, connect, 
    clear, 그리고 quit와 같은 명령어들은 매우 유용하게 사용될 것이다. 

    여러분은 지금 서버에 연결해서 데이타베이스를 선택하고 기본적인 명령어를 수행하는 방법 
    에 대해 기본적으로 이해해야 한다. 다음 장에서는 데이타베이스를 조작하기 위해 필요한 
    개념과 기술을 다룰 것이다. 



    ● Part 2: 데이타베이스와 테이블(Datatypes and Tables) 
    ==================================================== 

    데이타베이스는 좀 더 복잡한 데이타 구조의 계층에 지나지 않는다. MySQL에서는 정보의 
    묶음(또는 레코드)을 테이블이라 부른다. 

    이러한 레코드들은 데이타 타입이라고 알려진, 사용자에 의해 조작될 수 있는 아주 작은 크 
    기의 개체들로 구성된다. 이러한 데이타타입들은 하나 또는 그 이상이 모여 레코드를 구 
    성하며, 데이타베이스의 부분을 이루는 테이블은 레코드의 집합으로 구성된다. 우리는 다 
    음과 같이 데이타베이스의 계층을 생각 할 수 있다. 

    ------------------------------------ 
    Database < Table < Record < Datatype 
    ------------------------------------ 

    데이타 타입은 사용자가 어떠한 프로젝트를 수행하기 위해 가장 적합한 테이블을 만들 
    때 여러 가지의 형식과 크기로 나타낼 수 있다. 적절한 데이타 타입을 선택하고 결정하 
    는 것은 데이타베이스의 실행에 큰 영향을 주므로 이 개념에 대해 자세히 이해해야 한다. 


    2.1 MySQL 데이타 타입 


    MySQL은 경험이 없는 사용자라 할 지라도 한번씩은 많은 종류의 데이타 타입들을 접해 
    본 적이 있을 것이며, 또 쉽게 사용할 수 있다. 가장 일반적으로 사용되는 데이타 타입 
    은 다음과 같다. 

    ⊙ CHAR (M) 

    CHAR 데이타 타입은 고정된 길이의 문자열을 나타내는데 사용된다. 
    하나의 CHAR 문자열은 1-255 자 범위의 문자를 저장할 수 있다. 

    ------------------------------------ 
    ex. 
    car_model CHAR(10); 
    ------------------------------------ 

    ⊙ VARCHAR (M) 

    VARCHAR 데이타 타입은 가변적인 길이의 문자열을 저장하므로 CHAR 보다는 좀더 융통성 있 
    는 데이타 타입이다. 
    VARCHAR 문자열은 1-255 자 범위의 문자를 저장할 수 있다. 
    (CHAR 는 포함된 데이타의 크기에는 관계없이 이미 지정된 가변적인 전체의 길이를 저장하 
    는 반면에 VARCHAR 는 오직 들어가는 데이타의 양만을 저장하므로 데이타베이스 파일의 크 
    기를 줄 일수 있다.) 

    ------------------------------------ 
    ex. 
    car_model VARCHAR(10); 
    ------------------------------------ 

    ⊙ INT (M) [Unsigned] 

    INT 데이타타입은 -2147483648 에서 2147483647 사이의 정수를 저장한다. 
    "unsigned" 옵션과 함께 0부터 4294967295 범위의 정수를 나타낼 수도 있다. 

    ----------------------------------------------------------- 
    ex. 
    light_years INT; 
    Valid integer: '-24567'. Invalid integer: '3000000000'. 
    ----------------------------------------------------------- 
    ex. 
    light_years INT unsigned; 
    Valid integer: '3000000000'. Invalid integer: '-24567'. 
    ----------------------------------------------------------- 

    ⊙ FLOAT [(M,D)] 

    FLOAT는 다소 정확한 숫자의 표시가 필요할 때 사용되어지며, 작은 양의 소수점 숫자를 나 
    타낸다. 

    ------------------------------------ 
    ex. 
    rainfall FLOAT (4,2); 
    ------------------------------------ 
    이것은 소수점 값이 될 수 있는 일년간 평균강수량을 나타낼 수 있다. 좀 더 명확하게 
    말하면 FLOAT (4,2) 는 4개의 저장할 수 있는 최대 자리 수와 2개의 소수점 이하의 자리 수 
    를 가리킨다. 

    42.35 은 올바른 값이다. 
    324.45 은 틀린 값이다. 324.5로 해야 맞다. 
    2.2 은 올바른 값이다. 
    34.542 은 틀린 값이다. 34.54로 해야 맞다. 

    주의) FLOAT 는 어림잡은 수이기 때문에 MySQL 내에 포함 된 정수의 값이 아닌 데이타 타입 
    으로 돈의 값을 나타낼 때에는 DECIMAL을 사용하는 것이 더 현명한 방법이다. 더욱 자세 
    한 설명을 원하면 매뉴얼을 참고하기 바란다. 


    ⊙ DATE 

    날짜와 관련된 정보를 저장한다. 디폴트 형식은 'YYYY-MM-DD' 이며, '0000-00-00' 에서 
    '9999-12-31'까지의 범위를 갖는다. MySQL은 이 기사에서는 다루어지기 너무 방대한 막강 
    한 날짜형식의 조절과 조작 명령어를 제공한다. MySQL 매뉴얼에 이 기능에 대해서 
    자세하게 다루어져 있으므로 참고하기 바란다. 
    ------------------------------------ 
    ex. 
    the_date DATE; 
    ------------------------------------ 

    ⊙ TEXT / BLOB 

    text 와 blob 데이타 타입은 255 - 65535 자의 문자열을 저장할 때 사용된다. 이것은 여 
    러분이 읽은 기사와 같은 것을 저장하기에 유용하다. 그러나 VARCHAR 와 CHAR처럼 딱 잘 
    라 비교할 수는 없다. 단지 BLOB 와 TEXT 사이에 차이점이 있다면 BLOB은 변하기 쉬운 
    경우에 비유할 수 있고, TEXT는 영향을 받지 않는 무감각한 경우에 비유할 수 있다. 


    ⊙ SET 

    지정된 값으로부터 어떤 주어진 값을 선택하는, 정해진 문자열의 데이타 타입으로 그것은 
    하나의 값이 될 수도 있고 여러개의 값을 가질 수도 있다. 64개의 값까지 지정할 수 있다. 
    ------------------------------------------- 
    ex. 
    transport SET ("truck", "wagon") NOT NULL; 
    ------------------------------------------- 

    위의 예로부터 수송기관(transport)은 다음의 값들을 가질 수 있다. 

    ------------------------------------ 
    "" 
    "truck" 
    "wagon" 
    "truck","wagon" 
    ------------------------------------ 

    ⊙ ENUM 

    SET 데이타 타입과 비슷한 특징을 갖는 정해진 문자열의 데이타 타입이지만 선택할 수 있는 
    값이 하나로만 정해져 있다는 점이 다르다. 한 공간의 바이트만을 가지므로 테이블내의 
    시간과 공간을 절약할 수 있다. 


    ------------------------------------------- 
    ex. 
    transport ENUM ("truck", "wagon") NOT NULL; 
    ------------------------------------------- 
    위의 예로부터 수송기관(transport)은 다음의 값들을 가질 수 있다. 

    ------------------------------------ 
    NULL 
    "truck" 
    "wagon" 
    "truck" 
    ------------------------------------ 


    2.2 레코드 


    데이타들은 관련된 것들끼리 묶여서 디스크에 저장되는데 이러한 데이타의 묶음을 레코드라 
    고 한다. 레코드는 데이타저장의 기본단위이며, 하나의 레코드는 서로 다른 형태의 값(데이 
    타타입)을 가질 수있다. 아래에 나열된 이름, 주소, 전화번호는 각각 세개의 부분으로 구성 
    된 레코드로 저장할 수 있으며 이러한 레코드는 데이타가 저장되는 기본단위로서 하나의 
    테이블을 구성한다. 

    이름 | 주소 | 전화번호 
    --------|-------|--------- 
    원주희 | 한국 | 007-0000 
    홍길동 | 북한 | 008-0909 



    2.3 테이블(The Bigger Picture: Tables) 
    -------------------------------------- 

    우리는 데이타베이스 상에서 어떠한 명령어들을 수행하기 전에, 먼저 데이타가 저장될 수 
    있는 테이블을 만들어야 한다. 이것은 다음과 같은 방법으로 만들어진다. 

    ------------------------------------ 
    mysql> CREATE TABLE test ( 
    > name VARCHAR (15), 
    > email VARCHAR (25), 
    > phone_number INT, 
    > ID INT NOT NULL AUTO_INCREMENT, 
    > PRIMARY KEY (ID)); 
    ------------------------------------ 
    테이블이 성공적으로 만들어지면 다음과 같은 화면이 출력될 것이다. 

    ------------------------------------ 
    Query OK, 0 rows affected (0.10 sec) 
    mysql> 
    ------------------------------------ 

    여러분의 데이타베이스에 첫 번째 테이블이 생성되었다. 
    주의(1) : 서로 다른 두 개의 테이블은 같은 이름을 가질 수 없다. 
    주의(2) : 각각의 데이타공간은 종종 컬럼(column)이라는 개체의 속성으로 나타낸다. 

    컬럼(Column)의 특징 : 
    ------------------------------------ 
    하나의 이름이 숫자로만 구성될 수 없다. 
    하나의 이름은 숫자로 시작할 수 있다. 
    하나의 이름은 64자까지 가능하다. 
    ------------------------------------ 

     


    2.3.1 테이블의 다른 옵션들 : 

    나중에 다른 특징들과 성능이 데이타 타입에 추가될지라도 다음의 옵션들은 계속 존재할 것이다. 

    기본 키(Primary Key) : 
    ===================== 
    다른 속성들로부터 하나의 레코드를 유일하게 식별하는데 사용되어지며, 두 개의 레코드는 
    똑같은 기본 키를 가질 수 없다. 이것은 두개의 레코드가 중복되어지는 실수를 없애려 
    고 할 때 아주 적합하게 사용된다. 

    Auto_Increment : 
    ================ 
    이 함수(function)를 가진 컬럼(column)은 레코드에 삽입될 때 자동적으로 한 개씩 값이 
    (previous + 1) 증가한다. data가 'NULL'값 일 때도 컬럼(column)에 자동적으로 한 개씩 
    값이 증가하여 삽입된다. 

    NOT NULL : 
    ========== 
    NULL값(값이 없는)을 절대로 허용하지 않는 컬럼(column)을 의미한다. 

    ------------------------------------ 
    ex. 
    soc_sec_number INT PRIMARY KEY; 
    ------------------------------------ 
    두 개의 soc_sec_number 레코드는 같은 값을 가질 수 없다. 

    ------------------------------------ 
    ex. 
    ID_NUMBER INT AUTO_INCREMENT; 
    ------------------------------------ 
    1 에서 시작한 ID_NUMBER 값은 다음 값이 입력될 때마다 자동적으로 1씩 증가한다. 


    2.3.2 테이블과 관련된 명령어들 

    우리는 다음과 같이 테이블에 관련된 많은 유용한 명령어들을 실행할 수 있다. 


    ⊙ Show Tables 
    ============== 
    ------------------------------------ 
    mysql> show tables; 
    ------------------------------------ 
    결과 : 데이타베이스에 현재 존재하고 있는 모든 테이블들을 나열한다. 

    ⊙ Show Columns 
    =============== 
    ------------------------------------ 
    mysql> show columns from test; 
    ------------------------------------ 
    결과 : 지정된 테이블과 관련된 컬럼과 컬럼의 정보를 보여줄 것입니다. 

    테스트용 테이블을 생성한 후에 위의 명령어들을 한번씩 실행해보기 바란다. 
    복잡 다양한 데이타베이스의 이해에 매우 도움이 될 것이다. 


    여러분은 이제 MySQL 서버의 가장 중요한 개념인, 테이블을 생성하는 기본적인 과정을 이해 
    했다. 또한 테이블은 서로다른 형태의 데이타타입으로 이루어진 레코드가 모여 구성된다는 
    것도 알았다. 다음 장에서는 데이타베이스를 조작하는 방법에 대해 설명할 것이다. 



    ● Part 3: 데이타베이스 다루기(Manipulating the Database) 
    ======================================================== 

    데이타베이스는 다음의 4가지의 방법으로 조작할 수 있다. : addition, deletion, 
    modification, 과 search : 이에 대해서는 다음 장에서 자세히 설명할 것이다. 많은 
    컴퓨터 언어들처럼 SQL 역시 조금은 특별한 명령어 구문을 가지고 있다. 괄호(()), 콤 
    마(,), 또는 세미클론(;)의 위치가 조금만 잘못되어도 에러가 발생하므로 주의해서 입력해 
    야 한다. 


    3.1 레코드 입력하기(Insertion of records) 


    전에 설명한 test라는 테이블 만드는 방법을 다시 한번 살펴보자. 

    ------------------------------------ 
    mysql> CREATE TABLE test ( 
    > name VARCHAR (15), 
    > email VARCHAR (25), 
    > phone_number INT, 
    > ID INT NOT NULL AUTO_INCREMENT, 
    > PRIMARY KEY (ID)); 
    ------------------------------------ 


    이미 만들어진 테이블에 데이타를 입력하기 위해서는 INSERT 문을 사용한다. 

    ------------------------------------ 
    mysql> INSERT INTO test VALUES 
    mysql> ('Bugs Bunny', 'carrots@devshed.com', 
    mysql> 5554321, NULL); 
    ------------------------------------ 
    성공적으로 입력이 되면 다음과 같은 메시지가 나온다. 
    --------------------------------------------------- 
    Result, assuming the command was correctly entered: 

    Query OK, 1 row affected (0.02 sec) 
    mysql> 
    --------------------------------------------------- 

    · VARCHAR 데이타타입은 단일인용문으로 둘러싸여 있다. 모든 문자열 타입의 데이타타입 
    은(char, varchar, text, blob 등)단일 인용문으로 둘러싸여야 하며 그렇지 않으면 
    에러가 발생한다. 
    · phone number와 같은 INT 타입의 데이타타입은 단일인용문이 필요하지 않다. 
    · NULL은 아직정해지지않은 값으로 값이 없을 수도 있지만 NOT NULL은 반드시 값을 입력 
    해야한다. AUTO_INCREMENT와 사용된 레코드는 값이 NULL이면 1을 할당하고, 값이 있 
    으면 이전값에 +1씩 자동적으로 부여한다. 

    한가지 주의해야 할점은 데이타를 입력할때 반드시 레코드의 갯수만큼의 데이타를 입력해 
    야한다. 위의 예에서는 4개의 값을 입력해야 하는데 한개의 값만 입력할 경우 다음과 같은 
    에러가 발생한다. 
    -------------------------------------------------- 
    Ex. 
    mysql> insert into test values('doggy'); 
    ERROR 1058: Column count doesn't match value count 
    mysql> 
    -------------------------------------------------- 

    MySQL의 가장 큰 장점중의 하나는 데이타타입을 자유롭게 변경할 수 있다는 것이다. 


    3.2 테이블정보 검색하기(Selection) 

    데이타를 검색하기 위해 SELECT문을 사용한다. 
    ------------------------------------ 
    mysql> SELECT * FROM test 
    mysql> WHERE (name = "Bugs Bunny"); 
    ------------------------------------ 
    결과: 
    +------------+--------------------+--------------+----+ 
    | name | email | phone_number | ID | 
    +------------+--------------------+--------------+----+ 
    | Bugs Bunny | carrot@devshed.com | 5554321 | 1 | 
    +------------+--------------------+--------------+----+ 

    같은 이름이지만 서로 다른 email와 phone number를 가진 데이타를 입력해보자. 

    +------------+---------------------+--------------+----+ 
    | name | email | phone_number | ID | 
    +------------+---------------------+--------------+----+ 
    | Bugs Bunny | carrot@devshed.com | 5554321 | 1 | 
    | Bugs Bunny | pepper@devshed.com | 5554331 | 2 | 
    | Bugs Bunny | celery@devshed.com | 5554351 | 4 | 
    | Bugs Bunny | lettuce@devshed.com | 5554341 | 3 | 
    +------------+---------------------+--------------+----+ 


    3.3 삭제하기(Deletion) 

    테이블에 있는 한개 이상의 레코드를 삭제하기 위해 사용한다. 
    DELETE문으로 수행된다. 
    ------------------------------------ 
    mysql> DELETE FROM test 
    mysql> WHERE (name = "Bugs Bunny"); 
    ------------------------------------ 
    결과 : 이름이 Bugs Bunny인 레코드를 도두 삭제하므로 테이블에는 데이타가 
    하나도 없다. 

    ------------------------------------ 
    mysql> DELETE FROM test 
    mysql> WHERE (phone_number = 5554321); 
    ------------------------------------ 
    결과 : phone_number 가 5554321인 레코드를 삭제한다. 
    +------------+---------------------+--------------+----+ 
    | name | email | phone_number | ID | 
    +------------+---------------------+--------------+----+ 
    | Bugs Bunny | pepper@devshed.com | 5554331 | 2 | 
    | Bugs Bunny | celery@devshed.com | 5554351 | 4 | 
    | Bugs Bunny | lettuce@devshed.com | 5554341 | 3 | 
    +------------+---------------------+--------------+----+ 


    3.4 데이타 변경하기(Modification) 

    테이블에 이미 입력된 자료를 변경하기 위해 사용되며 UPDATE 문을 사용한다. 
    ------------------------------------------ 
    mysql> UPDATE test SET name = 'Daffy Duck' 
    mysql> WHERE name = "Bugs Bunny"; 
    ------------------------------------------ 

    +------------+---------------------+--------------+----+ 
    | name | email | phone_number | ID | 
    +------------+---------------------+--------------+----+ 
    | Daffy Duck | pepper@devshed.com | 5554331 | 2 | 
    | Daffy Duck | celery@devshed.com | 5554351 | 4 | 
    | Daffy Duck | lettuce@devshed.com | 5554341 | 3 | 
    +------------+---------------------+--------------+----+ 

     


    ● Part 4: 고급 MySQL명령어(Advanced MySQL Commands)==================================================== 

    우리는 이제 MySQL에 대해 기본적인 개념과 명령어들에 대해 배웠다. 이번장에서는 
    좀더 진보된 명령어에 대해 배워보기로 하겠다. 


    4.1 논리 연산자(Logical Operations) 

    MySQL은 모든 기본적인 논리연산자를 지원한다. 

    ⊙ AND (&&) 
    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name = "Bugs Bunny") AND 
    mysql> (phone_number = 5554321); 
    ------------------------------------ 
    결과 : 이름이 "Bugs Bunny"이고 전화번호가 '5554321'인 레코드가 출력될것이다. 

    ⊙ OR ( || ) 
    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name = "Bugs Bunny") OR 
    mysql> (phone_number = 5554321); 
    ------------------------------------ 
    결과 : 이름이 "Bugs Bunny"이거나 전화번호가 '5554321'인 레코드가 모두 출력된다. 

    ⊙ NOT ( ! ) 
    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name != "Bugs Bunny"); 
    ------------------------------------ 
    결과 : 이름이 "Bugs Bunny"이 아닌 레코드만 출력된다. 

    ⊙ Order By 
    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name = "Bugs Bunny") ORDER BY 
    mysql> phone_number; 
    ------------------------------------ 
    결과 : 이름이 "Bugs Bunny"인 모든 레코드가 phone_number를 기준으로 정렬될것이다. 


    4.2 Search functions 

    MySQL 은 일반문자뿐만아니라 특수문자를 포함해 데이타를 검색할 수 있다. 찾고자하는 
    값을 정확히 모를때 Like연산자를 사용해 문자형태가 같은 열을 검색한다. 

    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name LIKE "%gs Bunny"); 
    ------------------------------------ 
    결과 : 
    · "gs Bunny"를 포함하는 모든 레코드가 출력될 것이다. 
    ("Bugs Bunny", "ags Bunny", "gs Bunny", 와 "234rtgs Bunny"등과 같은 이름) 

    · "LIKE"가 equals sign(=)대신 사용된것에 주목하자. "LIKE"는 정확한 값을 모르는 
    데이타를 검색할때 사용된다. 

    · '%'는 임의의 문자(0개~임의의 개수)를 의미하며, '_'는 한문자를 의미한다. 

    ------------------------------------ 
    mysql> SELECT * FROM test WHERE 
    mysql> (name LIKE "Bugs Bunny%"); 
    ------------------------------------ 
    결과 : "Bugs Bunny"를 포함하는 문자가 출력될 것이다. 
    ("Bugs Bunnys", "Bugs Bunnyyyy453", "Bugs Bunnytrtr"등과 같은 이름, 
    그러나 "gs Bunny"는 아니다.) 


    4.3 주어진 조건에 맞는 특정한 열만 검색하기
    (Focused Search Results) 
    ------------------------------------ 
    mysql> SELECT name FROM test WHERE 
    mysql> (name = "Bugs Bunny"); 
    ------------------------------------ 
    결과 : 
    +------------+ 
    | name | 
    +------------+ 
    | Bugs Bunny | 
    +------------+ 


    4.4 테이블 변경하기(Alter table) 

    MySQL의 가장 중요한 기능중의 하나가 이미 만들어진 테이블을 변경하는 것입니다. 
    ALTER 문을 사용하며 다음과 같은 것을 수행할 수 있습니다. 
    · 새로운 열 추가하기 
    · 열의 속성 바꾸기 
    · 열 삭제하기 
    · 테이블 이름 바꾸기 

    Example: 테이블 이름 변경하기(Rename the table) 
    -------------------------------------------- 
    mysql> ALTER table test RENAME mytest; 
    -------------------------------------------- 

    Example: 새로운 열 추가하기(Add a column) 
    -------------------------------------------- 
    mysql> ALTER table mytest ADD birthday DATE; 
    -------------------------------------------- 

    Example: 열의 속성변경하기(Modify a column) 
    -------------------------------------------- 
    mysql> ALTER table mytest CHANGE 
    mysql> name newname VARCHAR (25); 
    -------------------------------------------- 

    Example: 열 삭제하기(Delete a column) 
    -------------------------------------------- 
    mysql> ALTER table mytest DROP newname; 
    -------------------------------------------- 

    MySQL 에서 ALTER 사용시 컬럼 위치 지정하기 
    ------------------------------------------------

    MySQL 에서 ALTER 명령을 이용해 테이블의 스키마를 변경할 때 
    컬럼 위치를 지정 할 수 있습니다. 
    아래 예는 email 이라는 컬럼 뒤에 attachment 라는 컬럼을 추가하는 SQL 문입니다. 
    > alter table {TABLE_NAME} add attachment char(64) DEFAULT '' NOT NULL AFTER email;

     

    이제 아래에 주어진 테이블을 만들어 보고 테이블을 변경해 보자. 
    -------------------------------------------- 
    mysql> TABLE mytest ( 
    > email VARCHAR (25), 
    > phone_number INT, 
    > ID INT AUTO_INCREMENT, 
    > birthday DATE ); 
    --------------------------------------------

     

    * 세은 파파의 프로그래밍 하자에서 퍼왔습니다.

     

    블로그 이미지

    가카리

    소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

    Tag mysql