달력

52025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형
Description:
In the MySQL stored procedure language, handlers can be written to handle the occurrence of some condition. Typically, handlers are used to handle error conditions.
Error conditions are conveniently declared by referring to some predefined class of conditions (e.g. NOT FOUND), or by specifying a particular SQLSTATE. Also, a "catch-all-others" condition is predefined (SQLEXCEPTION), in order to handle those errors for which no appropriate handler is in scope.
However, when handling such a general error condition, MySQL stored procedures do not provide any means to discover the nature of the error condition. If one would want to log the occurrence of the error, there is no way of logging the current value of SQLSTATE from within the stored procedure layer. One is forced to do this from the application layer, which seems to be the wrong place to do this.
Other major dbms-es have solved this by exposing the current errorcode and (sometimes message) in a global variable (@@ERROR for MSSQL, SQLCODE and SQLERRM for Oracle). The ANSI Standard also suggests a command to discover the nature of an error condition by using the GET DIAGNOSTICS command (although it is not clear to me in what form the information would become available in the context where diagnostics are requested).

How to repeat:
NA

Suggested fix:
Expose SQLSTATE or something similar (like C API mysql_error()) as a global variable or function from within the context of stored procedures so that we could write:

declare exit handler for sqlexception
    insert into error_table (
        code
    ,   message
    ) values (
        @@SQLSTATE
   ,    @@SQLSTATE_MESSAGE
    )

 

 

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

 

 

 

 

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_Test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_Test`()
body:
BEGIN

    DECLARE err_key INT DEFAULT 0;

    CREATE TEMPORARY TABLE T1 (ID INT, Name VARCHAR(250));
    CREATE TEMPORARY TABLE T2 (ID INT, Name VARCHAR(250));

    SET AUTOCOMMIT=0;
    START TRANSACTION;

    BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION SET err_key=1;
        DECLARE EXIT HANDLER FOR SQLWARNING SET err_key=2;

        INSERT INTO T111
        SELECT Source_ID_In, Master_Company_Name_in
        FROM htn.jigsaw_temp limit 1,10;

        INSERT INTO T1
        SELECT Source_ID_In, Master_Company_Name_in
        FROM htn.jigsaw_temp limit 11,30;

        INSERT INTO T1
        SELECT Source_ID_In, Master_Company_Name_in
        FROM htn.jigsaw_temp limit 31,40;
    END;

    IF err_key = 1 THEN
         ROLLBACK;
         SELECT 'SQL EXCEPTION ERROR';
         SELECT perror;
         DROP TABLE T1;
         DROP TABLE T2;
         leave body;
    END IF;

    IF err_key = 2 THEN
         ROLLBACK;
         SELECT 'SQL WARNING ERROR';
         DROP TABLE T1;
         DROP TABLE T2;
         leave body;
    END IF;

    SELECT * FROM T1;
    DROP TABLE T1;
    DROP TABLE T2;
    COMMIT;
END $$

DELIMITER ;

 

 

외.... 참고....http://cafe.naver.com/life4we/45

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

-- 테이블에 자동증가 PK컬럼 만들고 추가된 컬럼 맨 앞으로 이동하기
ALTER TABLE tableName ADD columnName INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;


-- 테이블에 컬럼 만들기
ALTER TABLE tableName ADD columnName INT NOT NULL;


-- 테이블에 자동증가 PK컬럼 수정하고 맨 앞으로 이동하기
ALTER TABLE tableName MODIFY columnName INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;


-- 테이블에 컬럼 수정하기
ALTER TABLE tableName MODIFY columnName INT NOT NULL;


-- 테이블명 tableName1에서 tableName2로 변경
ALTER TABLE tableName1 RENAME tableName2;


-- 컬럼명 columnName1에서 columnName2로 변경

ALTER TABLE tableName CHANGE columnName1 columnName2  VARCHAR(10) NOT NULL;


-- 컬럼명 columnName1 위치를 columnName2 뒤로 컬럼순서 변경
ALTER TABLE tableName CHANGE COLUMN columnName1 columnName1 VARCHAR(1) NOT NULL DEFAULT 'N'  AFTER columnName2;


-- 컬럼 삭제
ALTER TABLE tableName DROP columnName;


-- 지정한 컬럼 뒤에 새로운 컬럼 추가
ALTER TABLE tableName ADD columnName VARCHAR(10) NOT NULL AFTER 지정컬럼;


-- 지정 컬럼 지우고 맨 앞에 컬럼 추가
ALTER TABLE tableName DROP 지정컬럼, ADD columnName VARCHAR(10) NOT NULL FIRST;


-- PRIMARY KEY 삭제
ALTER TABLE tableName DROP PRIMARY KEY;

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|

마리아DB

Develope/DB...etc... 2015. 9. 2. 13:40
반응형
반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

참고 : http://seuis398.blog.me/220063603924  

MySQL에서 파티셔닝은 성능 문제로 권장되는 옵션은 아니다.

하지만, 로그 데이터와 같이 주기적으로 과거 데이터를 삭제해야 되는 경우라면 파티셔닝이 매우 편리하다.

신규 파티션 추가와 오래된 파티션 삭제를 수작업으로 하기는 번거로울테니, 간단하게 이 과정을 자동화 해 줄 프로시저를 만들어 봄~


[파티션 관리 요건]

- 어떠한 이유에서든지 프로시저가 동작하지 않은 경우라도 데이터 INSERT 실패가 발생하지 않도록 할 것

- 프로시저가 일정 기간 동작하지 않고 다시 재가동 되는 경우에, 프로시저가 주기적으로 동작했던 것과 동일한 파티션 구조를 생성할 것

- 파티션 삭제시 Table Lock으로 인한 영향을 최소화 할 것


[파티션 생성 프로시저]

CREATE PROCEDURE create_partition(p_dbname varchar(255), p_tbname varchar(255), p_future INT, p_interval INT)

SQL SECURITY INVOKER
BEGIN
   DECLARE x, max_pdesc, new_pdesc INT;
   DECLARE pname VARCHAR(64);
   DECLARE alter_cmd VARCHAR(1024);
 
  -- 현재 테이블의 파티션의 가장 마지막 파티션의 HIGH VALUE 값을 구함
   SELECT MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) INTO x FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION != 'MAXVALUE' ;

   -- 파티션 미리 생성할 기한까지 지정한 interval에 맞도록 파티션 추가
   -- 파티션 추가는 ADD PARTITION이 아닌 MAXVALUE 파티션의 REORGANIZE로 처리됨
   WHILE x <= p_future DO
      SELECT
         CONCAT('p', DATE_FORMAT(current_date() + interval MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) day, '%Y%m%d')),
         MAX(PARTITION_DESCRIPTION),
         MAX(PARTITION_DESCRIPTION) + p_interval
      INTO pname, max_pdesc, new_pdesc
      FROM information_schema.PARTITIONS
      WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE';
    
      IF max_pdesc < new_pdesc THEN
         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' REORGANIZE PARTITION pMAXVALUE INTO (',
                          'PARTITION ', pname, ' VALUES LESS THAN (', new_pdesc, '), PARTITION pMAXVALUE VALUES LESS THAN MAXVALUE)' );
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;     
         DEALLOCATE PREPARE alter_cmd;
      END IF;
      SET x = x + p_interval;
   END WHILE;
  
   -- 파티션 정보 출력 (옵션)
   SELECT current_date() + interval MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) - 1 day AS Last_Date,
          COUNT(*) AS Partitions_For_Future
   FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION != 'MAXVALUE' 
      AND PARTITION_DESCRIPTION > TO_DAYS(current_date()) + 1;
END 


[파티션 삭제 프로시저]

CREATE PROCEDURE delete_partition(p_dbname varchar(255), p_tbname varchar(255), p_del_date INT)
SQL SECURITY INVOKER
BEGIN
   DECLARE done INT;
   DECLARE pname VARCHAR(64);
   DECLARE alter_cmd VARCHAR(1024);
   DECLARE deleted_partition VARCHAR(1024);

  -- 삭제할 파티션 목록 취합
   DECLARE cur CURSOR FOR
      SELECT PARTITION_NAME FROM information_schema.PARTITIONS
      WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE'
        AND PARTITION_DESCRIPTION<=TO_DAYS(current_date()) - p_del_date ;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
   SET done = 0;
 
   -- 삭제 대상 파티션 목록 확인 및 작업 완료 후 출력 (옵션)

   SELECT GROUP_CONCAT(PARTITION_NAME) INTO deleted_partition 

   FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE'
     AND PARTITION_DESCRIPTION<=TO_DAYS(current_date()) - p_del_date ;
   
   OPEN cur;  
   FETCH cur INTO pname;

   WHILE done = 0 DO

     -- MySQL 5.6 버전 이상인 경우 동일 스키마로 빈 테이블을 만들어서 PARTITION EXCHANGE 처리 후 DROP PARTITION

     -- 파티션 삭제 처리 시간 지연으로 인한 Table Lock 영향을 최소화하기 위함

      IF left(version(),3) >= '5.6' THEN
         -- make empty table for exchange
         SET @alter_sql := CONCAT('CREATE TABLE ', p_dbname, '._exchange_', p_tbname, ' LIKE ', p_dbname, '.' , p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '._exchange_', p_tbname, ' REMOVE PARTITIONING');
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         -- exchange
         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' EXCHANGE PARTITION ', pname, ' WITH TABLE ', p_dbname, '._exchange_', p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         -- drop tmp table
         SET @alter_sql := CONCAT('DROP TABLE ', p_dbname, '._exchange_', p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;
      END IF;

      -- 파티션 삭제
      SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' DROP PARTITION ', pname);
      PREPARE alter_cmd FROM @alter_sql;
      EXECUTE alter_cmd;
      DEALLOCATE PREPARE alter_cmd;
      
      FETCH cur INTO pname;
   END WHILE;

   CLOSE cur;


   -- 삭제 처리한 파티션 목록 출력 (옵션)
   SELECT deleted_partition AS Deleted_Partitions ;
END 


[동작 예시]

1) mydb.daily_table 테이블에 대해서 금일 날짜 기준으로 30일이 경과한 파티션을 삭제

 mysql> call delete_partition('mydb', 'daily_table', 30);
 +--------------------+
 | Deleted_Partitions        |
 +--------------------+
 | p20140610,p20140611  |  --> 삭제된 파티션 목록 출력됨
 +--------------------+

2) mydb.daily_table 테이블에 대해서 금일 날짜 기준으로 7일 후까지 1일 간격으로 파티션을 생성

  mysql> call create_partition('mydb', 'daily_table', 7, 1);
 +-----------+------------------+
 | Last_Date    | Partitions_For_Future | 
 +-----------+------------------+
 | 2014-07-18 |                       7 |  --> 미리 생성되어 있는 파티션들의 개수와 수용 가능한 날짜 정보 출력
 +-----------+------------------+
 

[이벤트 스케줄러 적용]

- 이벤트 스케줄러 미활성 상태인 경우 활성화, 이벤트 스케줄러 미지원 버전인 경우에는 crontab 등록
 set global event_scheduler=on;  -- my.cnf에도 추가

- 이벤트 생성 (프로시저는 mysql db에 생성한 것으로 가정)
DELIMITER $
drop event if exists evt_partition_management $

CREATE DEFINER=`root`@`localhost` EVENT evt_partition_management
ON SCHEDULE EVERY '1' DAY STARTS '2014-07-12 01:00:00'    -- 스케쥴러 시작 시점은 반드시 현재 날짜 기준으로 미래 시점이어야 함
DO
BEGIN
  call mysql.delete_partition('mydb', 'daily_table', 30);  
  call mysql.delete_partition('mydb', 'weekly_table', 180);
  call mysql.create_partition('mydb', 'daily_table', 3, 1);
  call mysql.create_partition('mydb', 'weekly_table', 14, 7);
END $
DELIMITER ;

 

[유의사항]

- 파티셔닝 키 컬럼이 datetime이 아닌 timestamp라면 HIGH VALUE 비교하는 부분 수정 필요 (date 타입은 사용 가능)

- MySQL이 아닌 MariaDB를 사용하는 경우 PARTITION EXCHANGE 부분에서 DB 버전 체크하는 부분 수정 필요

- 적용 대상 테이블은 사전에 RANGE 방식의 파티셔닝 구성이 되어 있어야 하며, MAXVALUE 파티션(파티션명 : pMAXVALUE)이 만들어져 있어야 함 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

참고 : http://blog.naver.com/jjang2guna/100128881776

USE database_name;        ← 사용할 데이터 베이스 선택 :

 

① 검색

   SELECT * FROM table_name WHERE abc_column='a' ;

② 수정

   UPDATE  tabel_name  SET  a_column='a'  WHERE b_column='b' ;

③ 삽입

   INSERT INTO  table_name (a_column, b_column) VALUES ('a', 'b') ;

④ 삭제

   DELETE FROM  table_name  WHERE d_column='del' ;

   ※ TRUNCATE table_name;   ← 전체 레코드 삭제 ( DELETE FROM table_name 보다 빠름 )

 

 

 

MySQL 명령어 완전 쉽죠~

 

 

자~ 여기부터는 MySQL 명령어 기초를 살짝 넘어가 봅니다

 

① SELECT * FROM table_name WHERE abc_column='a' ORDER BY a_column DESC  LIMIT 100;

     └ order by a_column은 정렬,  oder by a_column desc는 역순정렬,  limit 100 은 100개까지

 

   SELECT * FROM table_name WHERE a_column like '%aaa%';

     └ a_column 에서 aaa 를 포함하는 모든 레코드를 가져옴

 

   SELECT * FROM table_name WHERE a_column BETWEEN 10 AND 100;

     └ a_column 에서 10 ~ 100 사이의 값을 가진 레코드를 가져옴

 

   SELECT a_column FROM table_name GROUP BY a_column;

     └ a_column 의 같은 값끼리 그룹을 묶음.

 

   SELECT count(*) FROM table_name;

      └ 테이블의 전체 레코드 갯수를 가져옴

 

 

UPDATE table_a SET table_a . a_column = table_b . a_column FROM table_a, table_b

    WHERE table_a.a_column = table_b.a_column  ;

       └ 두개의 테이블에서 조건을 비교하여 업데이트

 

③ 문자관련 함수

    SELECT LEFT(a_column, 2) FROM table_name;     ← a_컬럼 에서 왼쪽부터 2자리 잘라서 가져온다.

    SELECT MID(a_column, 2, 4) FROM table_name;   ← a_컬럼 2자리부터 오른쪽으로 4자리 만큼 가져온다.

    SELECT RIGHT(a_column, 3) FROM table_name;   ← a_컬럼 에서 오른쪽부터 3자리 잘라서 가져온다.

    SELECT * FROM table_name WHERE LENGTH(a_column)=10;  ← a_컬럼에서 길이가 10인 레코드만

    UPDATE table_name SET a_column=REPLACE(a_column,'변경전글자','변경후글자');

       └ a_컬럼의 '변경전글자' 라는 문자열을 '변경후글자'로 바꾸어 a_컬럼 수정

    UPDATE table_name SET a_column=TRIM(a_column);

       └ a_컬럼의 왼쪽 오른쪽 공백을 모두 제거

     SELECT AVG(a_column),MIN(a_column),MAX(a_column),SUM(a_column) FROM table_name;   

       └ AVG : 평균값, MIN : 최소값, MAX : 최대값, SUM : 합계

     SELECT version(),user(),database();

        └ MySQL 버젼 , 유저 , 데이터베이스명 보기

 

④ 날자관련 함수

    SELECT NOW();

 

 

자~ 여기 부터는 조금더 기초를 넘어 MySQL 명령어 기본기 다지기 정도? 잠시 쉬어갑시다~

 

JOIN : a_테이블 과 b_테이블 에서 a_컬럼의 값이 같은 레코드만 가져옴

    SELECT a_table.a_column, b_talbe.a_column

    FROM a_talbe, b_table

    WHERE a_table.a_column = b_table.a_column;

 

   INNER JOIN : 테이블A 와 테이블B를 비교하여

 

테이블A와 테이블B의 컬럼a 값이 000 인 것의

테이블B 컬럼b 값을 가져오는 쿼리 입니다.

 

SELECT  b.column_b

FROM table_a as a
       inner join table_b as b on a.column_a=b.column_a
WHERE a.column='000'

 

 

 

 

UNION : a_테이블 과 b_테이블 에서 a_컬럼,b_컬럼 모든 값을 한꺼번에 가져옴

    SELECT a_column FROM a_table

    UNION

    SELECT b_column FROM b_table;

 

 

MySQL 은 공개형 데이터베이스로 누구든 라이센스 제한 없이 사용할 수 있습니다.

(공짜라고 절대 무시못할 엄청난 데이터베이스 입니다)

다운로드는 http://www.mysql.com/donwnloads 에서 하실수 있으며, 현재 버전 5.x 까지 나와있습니다~

 

쿼리분석기는 MySQLFRONT 를 사용하는데 그냥 저냥 아주 잘 쓰고 있답니다.

http://www.mysqlfront.de/wp/

 

 

 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

 

 

참고 : http://blog.naver.com/sow21019/146489573

방법

  결   론

MS-SQL

--명확히 하는게 좋다.

INSERT INTO ProductDate(ProductID, ProductName , InsertedDate , ModifiedDate )
VALUES ( 1000 , '갤럭시2', Getdate(), Getdate() ) ;

-- MS-SQL은 원래 이 방법이 정석이고 명확하다.
UPDATE ProductTest SET ProductName = '갤럭시S2LTE', ModifiedDate = Getdate()

WHERE ProductID = 1000 ; 

Mysql

CREATE TABLE ProductDate(
ProductID int,   ProductName varchar(50),
-- 최초 데이타 입력 일자 시간 자동 등록 되는 컬럼
InsertedDate TIMESTAMP DEFAULT  NOW() ,
-- 데이타 수정된 일자 기본값 없이 설정한다.

ModifiedDate DateTime NULL,
Primary Key (ProductID)
) ;

--신규로 데이터 입력 될 때 입력일과 수정일에 현재 일자를 넣어주자.

INSERT INTO ProductDate(ProductID, ProductName , InsertedDate , ModifiedDate )
VALUES ( 1000 , '갤럭시2', SysDate(), SysDate() ) ;

-- 수정 할 때 수정일자를 넣어준다.

UPDATE ProductDate SET ProductName = '갤럭시S2LTE', ModifiedDate = SysDate()

WHERE ProductID = 1000 ;

 

 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

출처 : http://mp17_2.blog.me/140180718634


데이터베이스 생성 create database 데이터베이스명;
데이터베이스 목록보기 show databases;
데이터베이스 삭제 drop  database 데이터베이스명;
데이터베이스 선택 use 데이터베이스명;

테이블 생성 create table 테이블명(필드명, 타입, 공백 여부 등등);
테이블 보기 show tables;
테이블 구조 보기   desc 테이블명;
필드 추가 alter table 테이블명 add 새로추가할 필드명과 타입 (위치 설정[after 필드명]);
필드 삭제 alter table 테이블명 drop 삭제할 필드명;
필드명 변경 alter table 테이블명 change 기존 필드명 새로운 필드명 타입;
필드의 타입만 변경 alter table 테이블명 modify 기존필드명 새로운 타입;

테이블 이름 변경 alter table 기존 테이블명 rename 새 테이블명;
테이블 삭제 drop 테이블명;
---------------------------------------------------------------------------------
일괄실행 명령어 mysql -u root명 -p 비번 데이터베이스명 < 파일명
create table ep_tb(
sno int not null,
name varchar(10),
det char(20),
addr varchar(80),
tel char(20),
primary key(sno));

파일형식  sql로 library/bin/ 폴더에 저장
---------------------------------------------------------------------------------

단일레코드 변경
update  table name set 필드명 = 변경할 조건 where  필드명 = 기존 속성값
ex update haksa_tb set age = age - 3 where son  = 2002323;

전체 레코드 변경
update 테이블명 set 필드명 = 조건
update gk_tb set time = time - 1;

레코드 삭제
delete from table name where field name = 조건 ;

단일 레코드의 삭제 (like)
delete from haksa_tb where addr like '대전%';

특정 레코드 삭제 (where)
delete from 테이블명 where age >= 20 and age <= 30;

전체 체코드 삭제 
delete from table name;


백업 myslqdump -u -p 데이터베이스명 > 백업파일명

복원  mysql -u  -p db < 백업파일명



테이블의 모든 레코드 검색 select *from 테이블명;

load data 구문
load data infile "텍스트파일" into table 테이블명;
맥의 경우 기본 폴더 설정이 테이블까지 되어있음  mamp/db/mysql/디비명/파일.txt


중복된 레코드값 제거해서 출력
select distinct 필드명  from  테이블명;

조건 where
select  필드1 필드2 필드3 from  테이블명 where 조건;
(ex. select name, age, set, addr, sex from haksa_tb where sex = 'm';)

필드정렬
order by 필드명 sac(오름차순)-  작은 숫자부터 정렬  desc(내림차순) - 큰숫자부터 정렬
(ex. select name,age, det, addr, sex from haksa_tb where sex='M' order by age ASC;

결과값 제한 Limit
select *from 테이블명 order by 필드명 asc or desc limit 숫자;

집계함수 count

count(*) : 테이블 속에 속하는 레코드의 갯수
count(필드명) : null값이 아닌 레코드의 개수
sum(필드명) : 필드명의 값들의 합계
avg(필듬명) : 필드명의 값들의 평균
max(필드명) :  필드명의 값들의 최대값
min(필드명) : 필드명의 값들의 최소값

group by 는 필드명 기준으로 그 결과를 그룹화 한다.

select sno, sum(score) from jumsu_tb group by son;

group by 에 의해 수행된 결과에 대해 조건을 적용하고 검색 하려면 having절을 이용한다.
주의할점은 반드시 group by를 먼저 기술해야 한다.
ex . select son from jumsu_tb group by sno having count(*) >= 2;

특정 문자열 검색
_(언더스코어) 임의의 한문자 한글의 경우 2바이트이므로2개 사용 
예를 들어 준이라는 이름으로 끝나는 사람을 찾는다.  '__준'

null값을 갖는 정보 검색

select *from gk_tb where hakjum IS NULL;

null값이 정보를 제외하고 검색
select *from gk_tb where hakjum IS NOT NULL;

join검색

2개 이상의 테이블로 결과를 검색하는 과정을 조인검색이라고 한다.

select haksa_tb.name from haksa_tb, jumsu_tb where haksa_tb.sno = jumsu.sno AND jumsu_tb.codee = 1001;


 















반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

참고 : http://blog.naver.com/sow21019/144801048

 

■ 문자열 비교

 

타입

MS-SQL

 Mysql

 Oracle

 고정길이

 CHAR(길이)

 CHAR(길이)

 0~255 개의 고정길이 문자열

 CHAR(길이)

 최대 2000 바이트

 NCHAR (길이)

열에 정의된 길이의 2배 

   NCHAR (길이)

 가변길이

 VARCHAR(길이)

최대 8,000자 비유니코드

가변 길이 문자 데이터

 VARCHAR(길이)

 0~65,535개의 가변길이 문자열

 VARCHAR2(길이)

 최대 4000 바이트

 NVARCHAR(길이)

열에 정의된 길이의 2배 

최대 4,000자인 가변 길이

유니코드 데이터

 

 NVARCHAR2(길이)

 최대 4000 바이트

 

 TEXT

 TEXT

 0~65,535개의 가변길이 문자열

 CLOB

 1바이트 문자열, 최대 4GB

 VARCHAR2

 MEDIUMTEXT

 0~16,777,215개의 가변길이 문자열

 

 CLOB

 1바이트 문자열, 최대 4GB

 RAW

 LONGTEXT

 0~4,294,967,295개의 가변길이 문자열

 TINYTEXT  VARCHAR2

 NTEXT

   LONG

 

 BINARY

 TINYBLOB

 RAW

 VARBINARY

 BLOB

 BLOB , RAW
 

 IMAGE

 MEDIUMBLOB

 BLOB 이진 문자열, 최대 4GB

 RAW 

 LONGBLOB

 LONG RAW
   

 ENUM

 VARCHAR2
   

 SET

       

 

http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21656&cat1=11&cat2=331&cat3=341&lang=k 

 

 수치 자료형

 

타입

MS-SQL

 Mysql

 Oracle

 

TINYINT

5

TINYINT(길이)

부호 범위는 -128에서 127까지 이다.  부호가 없다면 범위는 0에서 255

Number(3) 

 

 SmallInt

7 

 SmallInt(길이)

부호가 있는 범위는 -32768에서 32767까지 이다. 부호가 없다면 0 에서 65535까지 임.

Number(5) 

   

 MediumInt(길이)

부호가 있으면 -8388608 에서 8388607까지 이고, 부호가 없다면 0 에서 16777215까지 임.

 
 

 Int(길이)

12 

 Int(길이)

부호 범위는 -2147483648 에서 2147483647까지 이고, 없으면 0 에서 4294967295까지 임.

 Number(10) 

 

 Bigint

 Bigint

 Number(19) 

 

 Float(길이,소수)

30 

 Float(길이,소수)

사용 가능한 값은 -3.402823466E+38 에서 -1.175494351E-38, 0 이고, 그리고 1.175494351E-38 에서3.402823466E+38 까지다.

 Float

   

 Double(길이,소수)

일반 크기 (이중 정밀도)의 부동 소수점 숫자. 사용 가능 값은 -1.7976931348623157E+308 에서 -2.2250738585072014E-308, 0, 그리고 2.2250738585072014E-308 에서 1.7976931348623157E+308 까지다.

 
 

 Decimal(길이,소수)

41 

 Decimal(길이,소수)

 

 Numeric(길이,소수)

 

 Numeric

41 

 NUMERIC = Decimal

 Numeric(길이,소수)

 

 Money

30 

 

 Number(19,4

 

 Smallmoney

30 

 

 Number(19,4) 

 

 Real

30 

 REAL = Float

 Float(23)

       
       

 

 

 

 

 

 

 날짜 시간 자료형

 

 MS-SQL

 Mysql

 Oracle

 SmallDatetime

 DATE

DATE

 Datetime

 DATETIME

DATE

 TimeStamp

 TIMESTAMP

RAW

 SmallDatetime

 TIME

 

 SmallDatetime

 YEAR

 

 

http://najsulman.tistory.com/540

http://blog.naver.com/sommer06?Redirect=Log&logNo=80034478302

http://it.moyiza.com/3587 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

MS-SQL 컬럼 길이 변경

ALTER TABLE Product
ALTER COLUMN [ProductNumber] NVARCHAR(150)

 

테이블 삭제

DROP TABLE Product


칼럼 변경

ALTER TABLE Product ALTER COLUMN ProductNumber NVARCHAR(100) NULL


새로운 칼럼 추가

ALTER TABLE Product ADD ProductNumber NVARCHAR(100) NULL

 

여러개의 새로운 칼럼 추가

ALTER TABLE Product ADD ProductNumber NVARCHAR(100) NULL,

ADD ProductName NVARCHAR(100) NULL

 

칼럼 삭제

ALTER TABLE member DROP COLUMN birth_day_type

 

 

[ MSDN - ALTER TABLE http://msdn.microsoft.com/ko-kr/library/ms190273.aspx ]

 

 

ALTER TABLE(Transact-SQL) : 

열과 제약 조건을 변경, 추가 또는 삭제하거나 파티션을 재할당하거나 

제약 조건과 트리거를 설정 또는 해제하여 테이블 정의를 수정합니다.

 

테이블 : T1

컬럼 : col1


ex1 : 인터넷 검색.

ex2 : 현재 내가 사용중인것.(부 : SQL SERVER 2005, 주 : SQL SERVER 2008 R2)

 

 

1. 컬럼 추가

 

ALTER TABLE 테이블명 ADD 컬럼명 

ex1> 

ALTER TABLE T1 ADD col1

 

ex2>

ALTER TABLE T1 ADD col1 NVARCHAR(20) NOT NULL

 

ex2> T1 테이블에 col1 칼럼이 없는 경우 col1 컬럼을 추가 한다.

 

DECLARE @table_id int

DECLARE @nCount int

 

 

SET @table_id = object_id('T1'

SELECT @nCount=COUNT(name) FROM syscolumns WHERE id = @table_id and name='col1'

IF @nCount = 0

ALTER TABLE T1 ADD col1 NVARCHAR(20) NOT NULL;

 

2. 컬럼 수정

 

ALTER TABLE 테이블명 MODIFY (컬럼명 데이터타입 제약조건) 

ex1>

ALTER TABLE T1 MODIFY (col1 NVARCHAR(20) NOT NULL)

 

ex2>

ALTER TABLE T1 ALTER COLUMN col1 NVARCHAR(20) NOT NULL

 

 

3. 컬럼 삭제

 

ALTER TABLE 테이블명 DROP 컬럼명

ex1>

ALTER TABLE T1 DROP col1

 

ex2>

ALTER TABLE T1 DROP COLUMN col1

 

 

4. 컬럼 제약조건 추가

 

ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건 

ex1> 

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (col1)

 

ex2>

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY col1


ex2>

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY CLUSTERED  

(

[col1] ASC

)

 


ex2>

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY CLUSTERED 

(

[col1] ASC,

[col2] ASC

)


5. 컬럼 제약조건 제거


ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건

 

ex2>

DECLARE @nCount int

 

SELECT @nCount=COUNT(CONSTRAINT_NAME) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 

WHERE TABLE_NAME = 'T1'

IF @nCount > 0

ALTER TABLE T1 DROP CONSTRAINT PK_T1

 

 

 

6. 컬럼명 수정

 

EXEC SP_RENAME 기존컬럼명, 변경할 컬럼명

ex> 

EXEC SP_RENAME 'T1', 'T2'



7. 자동 증가 컬럼에 Insert 하기


테이블에 값을 넣을때 자동 증가 컬럼에 값을 넣으려 할때면 아래와 같은 오류가 발생한다.

IDENTITY_INSERT가 OFF로 설정되면 'XXX' 테이블의 ID 열에 명시적 값을 삽입할 수 없습니다.

이럴 경우 해당 설정을 ON으로 설정 후 값을 넣은뒤 다시 OFF로 설정해 주면 된다.

*멍청한 얘기지만 당연히 INSERT 이외의 UPDATE는 이 옵션과 무관하다.(이미 옵션에_INSERT인것을...)

  자동증가 컬럼은 업데이트를 할 수 없다. 한참을 삽질을 하고 나서야 DELETE - INSERT 작업으로 처리했다.

 

col1 이 자동증가 컬럼인 경우.

SET IDENTITY_INSERT  테이블명 ON 또는 OFF


SET IDENTITY_INSERT  T1 ON

INSERT INTO  T1(col1) VALUES(값)

SET IDENTITY_INSERT  T1 OFF


초기화값으로 T1 테이블의 자동 증가값을 초기화 한다.

DBCC CHECKIDENT("T1",RESEED,초기화값)


8. 컬럼 기본값 설정


ALTER TABLE  T1 ADD  CONSTRAINT DF_T1_col1   DEFAULT ((0)) FOR col1

 

IF EXISTS (SELECT name FROM sys.objects WHERE name = N' DF_T1_col1 ' AND type=N'D' )

ALTER TABLE   T1 DROP CONSTRAINT DF_T1_col1

ELSE

ALTER TABLE   T1  ADD  CONSTRAINT   DF_T1_col1  DEFAULT ((0)) FOR col1

[출처] [MS SQL] ALTER TABLE|작성자 BK

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

필드 합치기

MS SQL        - select a + b from table

MY SQL        - select concat(a,b) from table

ORACLE        - select a||b from table

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

MySql을 설치한 컴퓨터에서는 MySql 접속이 잘되는데

 

원격의 컴퓨터에서 연결이 안되는 경우 아래와 같이 해결 합니다.

 

 

특정 사용자가 특정 IP주소로 입력할 때 허용할 권한을 설정하는 것입니다.


1. 특정 사용자 특정 IP에 대해 접속 권한 부여

 

GRANT ALL PRIVILEGES ON *.* TO '사용자명'@'IP주소' IDENTIFIED BY '비밀번호';

[출처] MySql 설치 후 원격(다른 컴퓨터)에서 연결 안 될 경우 |작성자 불가사리

 

 

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

 

마지막으로 삽입된 ID 값을 반환하는 시스템 함수 

- INSERT 되는 테이블에 자동으로 증가하는 컬럼이 있는 경우 마지막으로 INSERT 된 자동증가 컬럼의 값을 반환합니다.

 

MS-SQL

정의

@@IDENTITY

사용 방법

SELECT @@SPID

MySql

정의

LAST_INSERT_ID()

사용 방법

SET lastNumber = LAST_INSERT_ID() ;

결 과

 

 

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

Multirow Considerations for DML Triggers

http://msdn.microsoft.com/en-us/library/ms190752.aspx

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

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

마이바티스 설정파일(Oracle)

 

출처 : http://ihayatesw.tistory.com/296

 

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="ldg.mybatis.model.Comment" alias="Comment" />
</typeAliases>
<environments default="development">
<environment id="development">


<!-- ① 트랜잭션 관리자 -->
<transactionManager type="JDBC" />


<!-- ② 데이터베이스 설정 -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:mybatis" />
<property name="username" value="mybatis" />
<property name="password" value="asdf" />
</dataSource>
</environment>
</environments>


<!-- ③ 매퍼정보 설정 -->

<mappers>
<mapper resource="ldg/mybatis/repository/mapper/CommentMapper.xml" />
</mappers>
</configuration>

 



① 트랜잭션 관리자

-. 데이터베이스에서 트랜잭션은 가장 중요한 기능 중 하나다.

-. JDBC 코드를 대체하기 때문에 type로 지정하면 된다.

-. 트랜잭션 관리자는 JDBC 외에도 MANGED를 지정할 수 있다.



② 데이터베이스 설정

-. JDBC를 사용해 데이터베이스에 연결하려면 드라이버 클래스명, JDBC, URL, 계정 정보가 필요하다.

 

Oracle

드라이버 클래스명

oracle.jdbc.driver.OracleDriver

JDBC URL

jdbc.oracle:thin:@localhost:1521:mybatis

MySQL

드라이버 클래스명

com.mysql.jdbc.Driver

JDBC URL

jdbc:mysql://localhost:3306/mybatis

SQL Server(sqljdbc.jar, sqljdbc4.jar 사용 시)

드라이버 클래스명

com.microsoft.jdbc.sqlserver.SQLServerDriver

JDBC URL

jdbc:sqlserver://localhost:1443;DatabaseName=mybatis

SQL Server(msbase.jar, mssqlserver.jar, msutil.jar 사용 시)

드라이버 클래스명
com.microsft.jdbc.sqlserver.SQLServerDriver

JDBC URL

jdbc:microsft:sqlserver://localhost:1443;DatabaseName=mybatis

SQL Server(log4sql.jar 사용 시)

드라이버 클래스명

net.sourceforge.jtds.jdbc.Driver

net.sourceforge.jtds.jdbcx.JtdsDataSource

JDBC URL

jdbc.jtds:sqlserver://localhost:1443/mybatis;tds=8.0;lastupdatecount=true

SQL Server(jds-1.2.jar 사용시)

드라이버 클래스명 COM.ibm.db2.jdbc.net.DB2Driver
com.ibm.db2.jcc.DB2Driver
JDBC URL

jdbc:db2://localhost:50000/mybatis

DB2
드라이버 클래스명 COM.ibm.db2.jdbc.net.DB2Driver
com.ibm.db2.jcc.DB2Drvier
JDBC URL jdbc:db2://localhost:50000/mybatis
큐브리드
드라이버 클래스명

cubrid.jdbc.driver.CUBRIDDriver

JDBC URL

jdbc:cubrid:localhost:33000:demodb:::

 



③ 매퍼정보 설정

-. SQL을 선언해둔 XML이나 인터페이스 형태의 매퍼 위치를 지정해줘야 한다.

-. XML 위치는 클래스 패스를 기준으로 지정하면된다.

 


※ 팁

-. 각종 설정 파일과 매퍼 정보의 위치는 실제 변환하는 프로젝트의 구조를 보면 한결 이해하기 쉽다.



-. 프로젝트에서 사용하는 매퍼는 XML이며, src 아래 있는 CommentMapper.xml 이다.

-. src가 클래스 패스에 있기 때문에 CommentMapper.xml 파일의 실제 경로는 ldg.mybatis.repository.mapper.CommentMapper.xml이다.

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|