반응형

 

  oracle mysql  
  NVL(EPSD_NO,'0')   select IFNULL(null,'if it is null');
CASE WHEN EPSD_NO IS NULL OR EPSD_NO = ''
THEN '0' ELSE EPSD_NO END
오라클은 ''을 null로 삽입하지만, mySQL은 ''은 그대로 ''로 삽입함
이것때문에 문제소지 없는지 확인필요함
  decode( 1,1,'true','false') IF(조건, '참','거짓'))

case when 조건 then 결과
else 결과 end
SELECT IF (5<10, '크다','작다')
select case when 1=1 then 'true' else 'false' end;
 
  WHERE ROWNUM <= 30   LIMIT 30 정렬후 limit할 경우, 오라클은 limit이 where절에 들어가고(WHERE ROWNUM<x)
정렬보다 먼저 적용되므로 정렬후 inner view로 싸고 limit해야 하나 mySQL은
limit이 정렬후에 적용되어 inner view로 감쌀 필요가 없음 이건 mySQL이 더편함












string
관련
 

select LENGTHB('가나다') from dual;
select LENGTH('가나다') from dual;
LENGTH(str)
CHAR_LENGTH(str)
select LENGTH('가나다'); /*byte legnth*/
select CHAR_LENGTH('가나다');
9
3
 'A'||'B'||'C CONCAT(str1,str2,...)
CONCAT_WS(separator,str1,str2,...)
select CONCAT( 'A', 'B', 'C');
select CONCAT_WS(',','1','2','3');
ABC
1,2,3
 SUBSTR(str, pos)  SUBSTRING(str, pos)
= SUBSTRING(str FROM pos)
SUBSTRING(str, pos, len)
= SUBSTRING(str FROMpos FOR len)

 
SELECT SUBSTRING('123456',3); /* index는 모두 1부터 시작*/
SELECT SUBSTRING('123456',3,2);
SELECT SUBSTRING('123456', -3); /* 음수일때는 끝에서부터 셈*/
SELECT SUBSTRING('123456', -5, 4);
3456
34
456
2345



SUBSTRING_INDEX(str,delim,count) SELECT SUBSTRING_INDEX('AB*CD*EF*G', '*', 1);
SELECT SUBSTRING_INDEX('AB*CD*EF*G', '*', 2);
SELECT SUBSTRING_INDEX('AB*CD*EF*G', '*', 5);
SELECT SUBSTRING_INDEX('AB*CD*EF*G', '*', -2);
SELECT SUBSTRING_INDEX('AB*CD*EF*G', '*', 0);
AB
AB*CD
AB*CD*EF*G
EF*G
''
INSTR
 
SELECT INSTR('AB*CD*EF*G', '*', 4, 2 ) FROM dual
4th 문자부터 시작하여 2nd *의 위치 반환
없으면 0 반환
     














date
관련
sysdate
trunc(sysdate)
?
NOW()
CURDATE()
CURTIME()
select NOW(); /*GMT 기준시로 나옴*/
select CURDATE(); /*GMT 기준시로 나옴*/
select CURTIME(); /*GMT 기준시로 나옴*/
2015-07-16 05:05:54
2015-07-16
05:05:54
TO_DATE( time ,'yyyymmddhh24miss') STR_TO_DATE( str ,'format') select STR_TO_DATE(now(),'%Y-%m-%d'); 2nd 인자가 string의 format에 맞아야 함
  DATE(date)
TIMESTAMP(date)
UNIX_TIMESTAMP(date)
select DATE(now())
select TIMESTAMP(now())
select UNIX_TIMESTAMP(now())
date에서 time자르고 day까지 반환
time까지 반환
sec단위로 반환?
  EXTRACT(unit FROM date) select EXTRACT(year FROM now())  
TO_CHAR( TIME,'yyyymmddhh24mi') DATE_FORMAT(date,format) select DATE_FORMAT(now(),'%b %d %Y %h:%i %p');
select DATE_FORMAT(now(),'%d %b %y %k:%i');
select DATE_FORMAT(now(),'%d %b %Y %T:%f');
Jul 16 2015 06: 18 AM
16 Jul 15 6: 23
16 Jul 2015 06:19:33:000000
sysdate + hour/24 DATE_ADD(date,INTERVAL expr type) select DATE_ADD(now(),  INTERVAL 12 HOUR)  
sysdate - day DATE_SUB(date,INTERVAL expr type) select DATE_SUB(now(),INTERVAL 5 DAY)  
오늘 14:10   select DATE_ADD(DATE_ADD(current_date, interval 14 hour), interval 10 minute)
select current_date + interval 14 hour + interval 10 minute
 
어제 14:10   select DATE_ADD(DATE_ADD(current_date, interval -10 hour), interval 10 minute)
select current_date - interval 10 hour + interval 10 minute
 
ROUND((COMPLT_DATE - GEN_DATE) * 24 * 60, 0) min DATEDIFF(date1,date2) select TIMEDIFF(COMPLT_DATE, GEN_DATE) from TB_IC_DMON_SCHD_HIST  
ROUND((END_TIME - STRT_TIME) * 24 * 60 * 60, 0) sec   ROUND(UNIX_TIMESTAMP(IBS.END_TIME) - UNIX_TIMESTAMP(IBS.STRT_TIME), 0)  총 걸린 second
    select CONVERT_TZ(now(),'+00:00','+09:00'); timezone변경: GMT를 KST로
  SELECT TO_CHAR( 11 ) FROM DUAL;
SELECT TO_NUMBER( '-11' ) FROM DUAL;
  select CAST( 11 AS CHAR );
select CAST( '-11' AS SIGNED );
 
  select * from A, B where 조건   select * from A, B where 조건;
select * from A join B on 조건;
select * from A inner join B on 조건;
select * from A natural join B; (A, B에 같은 이름의 컬럼이 있을 때만 동작)
inner join
  select * from A, B where 조건( + )   select * from A left outer join B on 조건;
select * from A left outer join B on 조건 left outer join C on 조건;
select * from A right outer join B on 조건;
mySQL은 full outer join 지원안함
outer join
      select * from A cross join B; cross join
         

 

 

  • meta lock: online DDL지원하면서 도입된 개념(mySQL 5.X대 버젼부터 추가된듯), transaction 잡고 select 하면 DDL에 hang걸림, DML은 괜찮음 
    (즉, autocommit=false 설정하고 작업후 commit 안하고 그냥 끝내면 안됨, select만 해도 autocommit=true설정하거나 작업 후 반드시 commit해야함)
    svc package에는 view재생성 등 DDL이 많으므로 특히 주의해야함
  • mySQL에는 배열, synonym이 없음 - sdp-ibs에서는 배열로 임시테이블 만드는 대신 string으로 임시테이블 만드는 방법 사용함 
  • mySQL에는 sequence 없음 - 대신 auto increment라는 함수??사용가능 (default key 만들어주는 용도??) or sequence대신 테이블과 function을 사용할 수도 있음
    (sdp에서는 기존 sequence를 거의 테이블로 대체했음, hesdp_seq에 sequence로 사용하기 위한 테이블들 모여있음)
  • mySQL은 oraclel과 hint 사용법이 다르며 oracle hint /*+ ...*/은 mySQL에서 주석으로 무시된다
  • package 내 function들을 모두 procedure로 변경한 이유 - mySQL의 function은 out parameter를 사용할 수 없어서
  • batch job - event job으로 등록가능 (hesdp_com.pbf_batch_history 테이블에 이력남김, 등록은 DBA통해서)
  • HESDP_COM.FN_BLANKTONULL('$(GEN_USR_NO)') 사용하는 이유: 오라클은 ''을 null로 바꾸주는데 mySQL은 안바꿔줘서 function 만들어 사용함
  • mySQL은 oracle과 달리 object 변경이 있을 시, 관련 procedure나 fucnciton 재컴파일 안해줘도 됨
  • oracle은 select시 from절이 필수인 반면 mySQL은 필수아님 (from dual 안써도 됨)
  • 시간관련 함수들은 상당히 다름 (위 표 참고)
  • mySQL은 oracle과 달리 대소문자를 구분하는 경우가 많다. (e.g. 접속 user, 시간포맷 오라클은 YYYYMMDD=yyyymmdd이지만 mySQL은 %Y!=%y)
  • mySQL은 oracle과 달리 inner view를 사용할 때 꼭 table alias를 명시해줘야 함, 안그러면 에러남
  • SDP 운영 KIC, AIC, EIC, Q1 KIC mySQL DB만 master와 slave로 이중화 되어 있고 나머지는 하나임
    이중화된 DB의 경우, select는 slave에서 하고 update, delete, 혹은 update, delete와 select가 함께 일어나는 operation의 경우 master에서 작업한다.
    (성능때문에 이중화한건데, 그렇게 안하고 master만 계속 이용하면 이중화한 의미가 없음)
    master에서 변경된 data는 slave로 1초 이내에 복사된다.
반응형

'db' 카테고리의 다른 글

mysql lock  (0) 2020.05.25
mysql data migration  (0) 2020.05.21
mysql query tip  (0) 2020.01.31
H2 DB 사용방법  (0) 2019.10.30
mysql.*, information_schema.*  (0) 2019.09.06

+ Recent posts