select 한 결과 값을 다시 insert 해야 한다면 2번의 질의를 처리해주어야 하는데, 이것을 한번에 처리할 수 있는 것을 insert select 라고 합니다.


두 개 테이블의 칼럼이 동일할 경우 처리하는 방법:


 insert into [테이블] select * from [테이블] where [조건]; 

ex.1)

 insert into table1 select * from table2 where id > 3;




칼럼 수가 다를 경우 처리하는 방법:


 insert into [테이블] [칼럼명] select [칼럼명] from [테이블] where [조건];


 insert into table1 (col1, col2, col3) select col1, col2, col3 from table2 where id > 3;



블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요


extractValue() 함수는 XPath 식을 지정하여 XML 문자열에서 추출한 값을 반환합니다.

  • xml_frag 인수 : XML 마크 업
  • xpath_expr 인수: XPath 식으로 지정.

 SELECT ExtractValue(xml_frag,xpath_expr)

ex.1)

 mysql> SELECT ExtractValue( ’’, ’count(/a/b)’);
 -> 1

 mysql> SELECT ExtractValue( ’’, ’count(/a/b)’);

 -> 0


ex.2)

 mysql> SELECT ExtractValue('<a>habony<b>php</b></a>', '/a');

 -> habony


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

DEFAULT_NAME () 함수는 테이블 컬럼에 대한 기본 값을 반환합니다. 열에 디폴트 값이 존재하지 않으면, 오류가 발생합니다.


 SELECT DEFAULT_NAME(col_name)

ex.1)

 mysql> UPDATE table SET uid = DEFAULT(uid)+1 WHERE id < 100;


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

DATABASE() 함수는 UTF8 문자 세트의 문자열로 기본 데이터베이스를 반환합니다. 데이터베이스가 없는 경우 NULL 를 반환합니다.


 SELECT DATABASE();

ex.1)

 mysql> SELECT DATABASE();
 -> habony


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

인서트와 업데이트를 수행하기 위해 보통 SELECT, INSERT, UPDATE 를 혼합해서 구성하게 됩니다. 


SELECT 의 결과에 따라 UPDATE 나 INSERT 에 대한 코드를 작성하게 되는데, 문제는 이와 같은 과정으로 코드를 작성할 경우 소스가 길어져서 유지보수가 어려워 질 수 있다는 단점이 있습니다.


이 같은 문제를 해결하기 위해 다음의 코드로 적절히 사용해서 문제를 해결할 수 있겠습니다.


 <?php 
 $id 
1
 $name "habony"
 $key "abncdef"

 mysqli_query('INSERT INTO table_name  
    (id, name, key) VALUES ("'
.$id.'", "'.$name.'", "'.$key.'") 
    ON DUPLICATE KEY UPDATE name="'
.$name.'", key="'.$key.'"' 
 ); 
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이 함수를 사용하려면 파일이 서버에 존재해야하며, 파일의 전체경로를 지정해주어야

합니다. 만약, 파일이 존재하지 않거나 읽혀지지 않는다면 NULL 를 반환합니다.

 LOAD_FILE(field_name)


예제 #1)
 mysql> UPDATE tbname SET field_name = LOAD_FILE('tmp/folder') WHERE id=1;

예제 #2)

 <?php

 $tmpfile = $_FILES['usefile']['tmp_name'];

 if(is_file($tmpfile))

 {

    mysql_query('UPDATE tbname SET field_name = LOAD_FILE(' . $tmpfile .') WHERE id=1');

 }

 ?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

테이블 구조에서 깨진 테이블이 있다면, 테이블을 고치는 기능을 합니다. MyISAM 과 ARCHIVE, CSV 테이블에서 유효한 동작을 합니다.

예제(ex #1
 mysql> REPAIR TABLE tb_name;

예제(ex #2

 <?php
 $sql 
mysql_query("SHOW DATABASES"
);

 while(
$db mysql_fetch_row($sql
)){
    
$db_tmp mysql_query("SHOW TABLE STATUS FROM ".$db[0
]);
    while(
$tmp_sql mysql_fetch_array($db_tmp
)){

        
// 깨진 테이블이 있다면 테이블을 복구합니다.
        
mysql_query("REPAIR TABLE `".$tmp_sql['Name']."` "
);
        
$item .= "REPAIR TABLE `".$tmp_sql['Name']."` <BR />\n"
;
        
        if(
$tmp_sql['Data_free'] == 0
){
            continue;
        }
        
        
// 데이터 파일을 재조합하거나 사용하지 않는 공간을 재사용합니다.
        
mysql_query("OPTIMIZE TABLE ".$tmp_sql['Name'
]);
        
        ECHO 
"TABLE Name: ".$tmp_sql['Name'].'<BR />\n'
;
        ECHO 
$tmp_sql['Data_free']." OPTIMIZED <BR />\n"
;
    }
 }
 ?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이 함수는 정확히 INSERT와 DELETE를 동시 수행하는 기능입니다. 주의할 점은, PRIMARY KEY 와 UNIQUE 인덱스를 가지고 있어야 하는데, 없다면 의미없는 구문이 됩니다. PRIMARY, UNIQUE 인덱스를 가진 열일 경우 새 열을 삽입하기 전에 기존 열을 삭제하게 합니다.

다음 예제는 기존 행에 1를 더한 값을 UPDATE 합니다. 만약, 만족하는 데이터가 있다면 UPDATE 를, 없다면 INSERT 합니다.

예제(ex #1
 mysql> REPLACE tb_name SET field_name = field_name+1;

예제(ex #2
 mysql> REPLACE INTO tb_name set name = 'myname', cnt = DEFAULT(cnt) + 1, date = '20111010';

실수로 사용자가 2번의 쿼리를 날렸다 하더라도, row는 1개만 출력되고, cnt = 2가 되지 않습니다.

예제(ex #3
 mysql> REPLACE INTO tb_name set name = 'myname', cnt = DEFAULT(cnt) + 1;
 mysql> REPLACE INTO tb_name set name = 'myname', cnt = DEFAULT(cnt) + 1;

 mysql> SELECT cnt FROM tb_name WHERE name='myname';
      -> 1

만약, PRIMARY, UNIQUE 인덱스를 가진 열이 아니라면 결과는 달라진다는 점에 주의할 필요가 있습니다.

예제(ex #4
 mysql> REPLACE INTO tb_name set name = 'myname', cnt = DEFAULT(cnt) + 1;
 mysql> REPLACE INTO tb_name set name = 'myname', cnt = DEFAULT(cnt) + 1;

 mysql> SELECT cnt FROM tb_name WHERE name='myname';
      -> 2

다음은 str_replace 와 흡사합니다.

예제(ex #5
 mysql> SELECT REPLACE('mysql.com', 'm', 'www.m');
      -> www.mysql.cowww.m

 mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
      -> WwWwWw.mysql

 mysql> SELECT REPLACE('www.mysql.com', 'com', 'co.kr');
      -> www.mysql.co.kr

<script>태그가 있다면 공백으로 처리해 버립니다.

예제(ex #6
 UPDATE tb_name SET field_name = REPLACE(field_name,'<script>','');
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이 함수를 자동증가 값 정도로 이해하면 됩니다. 어떤 열을 INSERT 하면 자동으로 새로운 열에 대한 유일한 고유키를 1씩 증가시킵니다.

예제(ex #1
 CREATE TABLE tb_name (
      ; id 를 AUTO_INCREMENT 로 사용하겠다고 정의함.
      id int NOT NULL ungigned AUTO_INCREMENT,
      nam char(10),
      PRIMARY KEY (id)
 );

 mysql> INSERT INTO tb_name VALUES ('myname1');

 # LAST_INSERT_ID 는 AUTO_INCREMENT 값을 입력 후 자동으로 생성된 값을 얻습니다.
 # 이 함수는 mysql_insert_id 와 동일한 기능을 합니다.
 # 만약, 성공적으로 입력된 열이 없다면 이 함수는 0 을 반환합니다.
 mysql> SELECT LAST_INSERT_ID();
      -> 1
 mysql> INSERT INTO tb_name VALUES ('myname2');
 mysql> INSERT INTO tb_name VALUES ('myname3');
 mysql> INSERT INTO tb_name VALUES ('myname4');
 mysql> SELECT LAST_INSERT_ID();
      -> 4
 mysql> INSERT INTO tb_name (name) VALUES ('myname4');
 mysql> SELECT LAST_INSERT_ID();
      -> 5

예제(ex #2
 mysql> INSERT INTO tb_name (name) VALUES ('myname5'), VALUES ('myname6'), VALUES ('myname7');
 mysql> SELECT LAST_INSERT_ID();
      -> 6
 mysql> INSERT INTO tb_name (name) VALUES ('myname8'), VALUES ('myname9'), VALUES ('myname10');
 mysql> SELECT LAST_INSERT_ID();
      -> 7
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

업데이트, 인서트, 삭제된 열의 갯수를 반환하는 ROW_COUNT 함수는 mysql_affected_rows 함수의 기능과 동일합니다.

예제(ex #1
 mysql> INSERT INTO table_name VALUES('1', '2', '3');
      -> 3

 mysql> INSERT INTO table_name VALUES('1', '2', '3', '4', '5');
      -> 5

예제(ex #2
 <?php
 mysql_query
("INSERT INTO table_name VALUES('1', '2', '3');"
);
 mysql_affected_rows(); 
// 결과: 3

 mysql_query("INSERT INTO table_name VALUES('1', '2', '3', '4', '5');");
 mysql_affected_rows(); 
// 결과: 5
 ?>

예제(ex #3
 <?php
 mysql_query('DELETE FROM mytable WHERE id < 10'); // 결과: 0

 mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
 printf ("Updated records: %d\n"mysql_affected_rows()); // 결과: 10
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

 LONGBLOB = LONGTEXT  영역 범위
 4,297,967,295 또는 4GByte 크기

 MEDIUMBLOB = MEDIUMTEXT  영역 범위
 16,777,215 Byte 크기

 BLOB  영역 범위
 65,535 Byte 크기

 TEXT  영역 범위
 65,535 문자길이, multi-byte 문자면 최대 길이 줄어듬

 VARCHAR  영역 범위
 255 Byte 크기

 CHAR  영역 범위
 255 문자길이, 공간은 right-padded 됨, 바이너리타입

 TINYBLOB  영역 범위
 255 Byte 크기

 TINYTEXT  영역 범위
  255 문자길이, multi-byte 문자면 최대 길이 줄어듬
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

INT 타입 입력 범위에 대한 설명입니다

 BIGINT interger  영역 범위
 singed   -922,337,206,854,775,808 ~ 923,372,036,854,775,807 
 unsigned  0 ~ 18,446,744,073,709,551,615

 INT interger  영역 범위
 singed   -2,147,483,648 ~ 2,147,483,647
 unsigned  0 ~ 4,294,967,295

 MEDIUMINT interger  영역 범위
 singed   -8,388,608 ~ 8,388,607
 unsigned  0 ~ 16,777,215

 SMALLINT interger  영역 범위
 singed   -32,768 ~ 32,767
 unsigned  0 ~ 65,535

 TYNYINT interger  영역 범위
 singed   -128 ~ 127
 unsigned  0 ~ 255
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

INET ATON 함수

ip 주소를 정수로 반환하는 함수입니다.

 SELECT INET_ATON(expr);

예제(ex #1
 mysql> SELECT INET_ATON('209.208.207.206');
      ->3520122830

INET NTOA 함수

이 함수는 inet_aton 함수와 반대 기능으로 정수를 ip 주소로 변환합니다.

 SELECT INET_NTOA(expr);

예제(ex #2
 mysql> SELECT INET_NTOA(3520122830);
      -> 209.208.207.206

관련글: 2011/09/02 - 불량 ip차단하는 소스
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag IP

댓글을 달아 주세요


 mysql> SELECT VERSION();
      -> 5.5.8;
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

Mysql작성시 다음 문자만 허용됩니다.

 

이름은 영문자 a~z, 0~9, _, $, # 문자를 사용할 수 있음. , 숫자로 시작할 수 있지만,숫자로만 이루어질 수는 없음.

키워드를 제외한 디비, 테이블 이름은 대소문자를 구분함.


다음은 기본키 설정시 주의사항입니다.

 

기본키(Primary Key) NULL이 될 수 없고, LONG이나 LONG ROW로 정의된 열은 기본키가 될 수 없음.

기본키는 최대 16개 이내여야 하고, 테이블 안에서 UNIQUE 해야 함.


키워드 종류는 다음 표와 같습니다.

Auto_increment

레코드의 자료가 insert될 때, 자동으로 1
증가함.

Unsigned

부호없는 양수로만 사용.

Zerofile

입력 값이 없을 때, 자동으로0을 채움.

Not Null

Null 값을 허용하지 않음.

Default

입력값이 없다면, 기본 default값으로 채움.

Distint

중복되는 자료가 있다면, 중복되지 않게
구분해줌.

Limit

limit수 만큼 레코드를 가져옴.

Order by

자료정렬

Order by asc

순차정렬

Order by desc

역순정렬


데이터형과 입력범위는 다음 표를 참조하면 됩니다. 여기서 N은 숫자만, D는 소수점, S는 문자를 말하며,
unsigned 키워드를 사용할 경우 음수를 허용하지 않음을 말합니다.

데이터형

범위

TINYINT(N)

-128~127

0~255 (unsigned)

SMALLINT(N)

32768~32767

0~65535 (unsigned)

MEDIUMINT(N)

-8388608~8388607

0~16777215 (unsigned)

INT(N)

-2147483648~2147483647

= INTERGER(N)

0~4294967295 (unsigned)

BIGINT(N)

-9223372036854775808~
9223372036854775808

0~18446744073709551615 (unsigned)

FLOAT(S,D)

-3402823466E+38~3402823466E+38

DOUBLE(S,D)

-179769313486231517E+308

~179769313486231517E+308

= REAL(S,D)

CHAR(S)

0~255

VARCHAR(S)

0~255

DATE

YYYY-MM-DD

TIME

HH:MM:SS

TIMESTAMP(N)

YYYYMMDD[HH[MM[SS]]]

DATETIME(N)

YYYY-MM-DD HH:MM:SS

YEAR

YYYY

TYNYBLOB

최대 255

= TYNYTEXT

BLOB

최대 65535

= TEXT

MEDIUMBLOB

최대 16777215

= MEDIUMTEXT

LONGBLOB

최대 4294967295

= LONGTEXT

ENUM

LIST

SET

LIST


여기서 FLOAT DOUBLE 데이터형 칼럼을 사용할 경우 FLOAT(4,2)로 정의한다면, 정수 최대수 4자리와 소수점 2자리만 허용됩니다.

예제 (ex #1

FLOAT(4,2): 12.345의 값을 입력하면, 실재 입력되는 값은 12.34입니다.
DATE: 1189
의 값을 입력하면, 실재 입력 값은 20110809가 됩니다.
TIME: 230950
의 값을 입력하면, 실재 입력 값은 23:09:50이 됩니다.

 

숫자타입

INT, FLOAT, DOUBLE, NUMERIC

날짜,시간타입

DATE, DATETIME, TIME, TIMESTAMP, YEAR

문자열 타입

CHAR, VARCHAR, BLOB, TEXT, ENUM, SET

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요