7.3.3 MySQL 내장 함수 (MySQL전용 함수)

RealMysql 2012.11.22 18:06 posted by dev.bistro


7.3.3 MySQL 내장 함수 (MySQL전용 함수)


- IFNULL(A, B) : A가 null 이면 B를 A가 null이 아니면 A를 그대로 반환한다.

- ISNULL(A) : A가 null 이면 true(1) , null 이 아니면 false(0) 을 반환한다.


- NOW() : 현재시간 반환

- SYSDATE() : 현재시간 반환

** 일반적인 웹서비스에서 NOW()가 아닌 SYSDATE()를 꼭 사용해야 이유는 없다. 기능은 동일하지만 SYSDATE()는 '호출시점'에 따라 값이 결정되기 떄문에 인덱싱 등에 문제를 가진다.

    where from_data > SYSDATE() 는 실행때마다 SYSDATE값이 달라진다, 이건 상수가 아닌상태이다!!



- DATE_FOMRAT : Date Type -> String

  SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H시 %i분 %s초') AS cur_str;

- STR_TODATE : 문자열을 날자 타입으로 변경

  SELECT STR_TO_DATE( '2011-04-30', '%Y-%m-%d') as cur_dt;


- DATE_ADD, DATE_SUB : 날자 타입의 가감

  SELECT DATE_ADD( NOW(), INTERVAL 1 DAY ) as tomorrow;

  SELECT DATE_ADD( NOW(), INTERVAL -1 DAY ) as yesterday;

** YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 의 값이 있고 [ INTERVAL n 단위 ] 형식으로 입력하면 된다.


- RPAD(),  LPAD() : 문자의 좌우측에 문자를 덧붙여 지정된 길이로 만든다.

  SELECT RPAD("Cloee', 10, '_'); -> Cloee_____

- RTRIM(), LTRIM(), TRIM() : 문자의 우측, 좌측, 양측의 공백(Space, NewLine, Tab)을 제거

- CONCAT : 문자열을 연결, 인자의 갯수는 제한이 없다.

- CONCAT : 문자열을 구분자를 넣어서 연결해준다.

  SELECT CONCAT_WS(',', 'A', 'B', 'C') --> A,B,C


- GROUP_CONCAT :  값들을 정렬한후, 연결하거나 구분자설정, 중복제거등 유용하다.


  ex1-SELECT GROUP_CONCAT(dept_no) 

  ==> d001, d002, d003, d004 

  FROM dept (dept모든 레코드에서 dept_no 칼럼을 기본 구분자, 로 연결한 값을 반환)

  


  ex2- SELECT GROUP_CONCAT(dept_no, SEPARATOR '|') FROM dept

  ==> d001|d002|d003}d004 

  

  ex3- SELECT GROUP_CONCAT(dept_no, ORDER BY dept_name DESC) from dept

  ==> d007,d008,d004,d001

  dept_name 역순 정렬 -> dept_no 들의 연결값을 가져옴


  ex4- SELECT GROUP_CONCAT(DISTINCT dept_no ORDER BY dept_name DESC) from dept

  ==> d007,d008,d006,d004

  ex3과 동일하지만 중복된 dept_no가 있다면 제거하고 가져온다.

  

** 제한적인 메모리 버퍼를 사용하는데 TOAD나 SQLYog에서는 단순한 Warnning지만, JDBC로 연결할 때는 SQLException이 발생하므로, GROUP_CONCAT의 결과가 버퍼를 초과하지 않도록 주의해야한다.


  

- CASE WHEN (Function가 아닌 Syntax)

SELECT emp_no, frst_name 

CASE gender WHEN 'M TEHN 'Man' 

WHEN 'F' THEN 'Woman' 

ELSE 'Unknown' 

END AS gender

FROM emp LIMIT 10

 ** CASE WHEN 절이 일치해야만 THEN 이하도 실행이 된다.   서브쿼리->CASE WHEN으로 성능 향상을 꾀할 수 있다.(P407)



- MD5, SHA : 비대칭형 암호화 알고리즘 (SHA - SHA-1알고리즘, 160bit 해시 값, MD5 - Message Digest알고리즘 128bit 해시 값)

 중복의 가능성이 매우 낮기 때문에, 길이가 긴 데이터를 줄여서 인덱싱하는 용도로도 사용한다.(url값 인덱싱)



- COUNT() : 칼럼이나 표현식을 인자로 받고, *을 사용하지만 '모든 칼럼이 아니라, RECORD 자체를 의미'한다.
  - MyISAM : 메타테이블의 전체 레코드수가 있어서 where가 없는 count(*)는 결과를 바로 반환가능
  - 그외 스토리지 : 직접 읽어야만 하므로, 큰 테이블에서 count(*)는 주의해야한다.

- 표준 주석
  -   --공백하나 : 한줄의 주석
  -   /* 내용 */ : 여러준 주석
  -   # 라인 이후 주석 : 비표준 

  - 변형 주석
   CREATE /*! 50154 TEMPORARY */ TABLE tb_test (fd INT, PRIMARY KEY(fd));
   -> 5.1.54이상 CREATE TEMPORARY TABLE tb_test (fd INT, PRIMARY KEY(fd));
   -> 5.1.54미만 CREATE TABLE tb_test (fd INT, PRIMARY KEY(fd));
    MySQL의 버전에 따라 주석이 될수도, 쿼리문장이 될 수도 있다. !뒤에가 기준 버전이 된다.

    MySQL 5.0에서 쿼리나 프로시저에 포함된 주석은 모두 삭제되는데 이를 트릭으로 막을 수 있다.

    BEGIN
        /*! 99999 주석 내용 */
        RETURN '테스트'
    END 

신고


티스토리 툴바