[MySQL] Oracle과 MySql 쿼리문 문법 비교

5
post-thumbnail

✔ 오늘 배운 내용


select li.lec_id
     , li.tutor_id 
     , ui.name
     , li.lec_name
     , li.tutor_name
     , CONCAT(DATE_FORMAT(li.c_st, '%Y.%m.%d'),'~', DATE_FORMAT(li.c_end, '%Y.%m.%d')) as cdate
  from tb_lec_info li
       inner join tb_userinfo ui on ui.loginID = li.tutor_id and ui.user_type = 'B';
       
       
-- 이력서 관리       
select li.lec_id
     , li.tutor_id 
     , ui.name
     , li.lec_name
     , li.tutor_name
     , li.pre_pnum
     , (select count(*) from tb_lecstd_info ls where ls.lec_id = li.lec_id ) as cnt
     , CONCAT(DATE_FORMAT(li.c_st, '%Y.%m.%d'),'~', DATE_FORMAT(li.c_end, '%Y.%m.%d')) as cdate
  from tb_lec_info li
       inner join tb_userinfo ui on ui.loginID = li.tutor_id and ui.user_type = 'B';
       
-- 취업 관리      
select ui.name, ui.loginID, ui.tel, ui.mail, ifnull(em.wp_state,'미취업') as wp_state
  from tb_lecstd_info li
       inner join tb_userinfo ui on ui.loginID = li.std_id
       left outer join tb_employ em on li.std_id = em.std_id
 where li.lec_id = '1007';
 
 
-- 학생명   연락처   입사일   퇴사일   업체명   재직여부
select ui.name
     , ui.tel
     , em.employ_day
     , em.resign_day  
     , em.comp_name
     , ifnull(em.resign_day,'재직중') 
     , case em.resign_day WHEN '' then '재직중'
                          ELSE '퇴직'
       END as emp_type                        
  from tb_employ em
       inner join tb_userinfo ui on ui.loginID = em.std_id;
       

-- 학번   학생명   연락처   강의명   가입일자    
select ui.std_num
      ,ui.name
      ,ui.tel
      ,ll.lec_name
      ,ui.join_date
  from tb_userinfo ui
       left outer join (
                          select li.lec_id
                                ,li.lec_name
                                ,le.std_id
                            from tb_lecstd_info le
                                 inner join tb_lec_info li on li.lec_id = le.lec_id
                       ) ll on ui.loginID = ll.std_id
 where ui.user_type = 'A'
   and ui.loginID not in (
                              select em.std_id
                                from tb_employ em
                         );


-- 강의실 명   크기   자리수   비고   
select lm.lecrm_name
      ,lm.lecrm_size
      ,lm.lecrm_snum
      ,lm.lecrm_note
      ,lm.lecrm_id
  from tb_lecrm lm;
  
  
  
-- 번호   장비명   갯수   비고  
select eq.equ_id
      ,eq.equ_name
      ,eq.equ_num
      ,eq.equ_note
  from tb_equ eq
 where eq.lecrm_id = '1';
 
 
-- 강의명   시험명   시험기간   상태   대상자 수   응시자 수   미응시자 수
select li.lec_id
      ,li.lec_name
      ,te.test_name
      ,concat(DATE_FORMAT(te.test_start, '%Y.%m.%d'),'-',DATE_FORMAT(te.test_end, '%Y.%m.%d')) as dduedate 
      ,case when te.test_end < now() then '시험종료'
           else '시험중'
      end state 
      ,ifnull(llc.cnt,0) as cnt
      ,ifnull(llt.cnt,0) as lltcnt
      ,(ifnull(llc.cnt,0) - ifnull(llt.cnt,0)) as nocnt
     -- ,(cnt - lltcnt) as nocnt
  from tb_test te
       inner join tb_lec_info li on te.lec_id = li.lec_id
       left outer join (
                          select lc.lec_id, count(*) as cnt   
                            from tb_lecstd_info lc
                           group by lc.lec_id
                       ) llc on li.lec_id = llc.lec_id
       left outer join (
                          select tu.test_id, count(*) as cnt   
                            from tb_test_user tu
                           group by tu.test_id
                       ) llt on te.test_id = llt.test_id;     

✔ Oracle과 MySql 쿼리문 문법 비교


Oracle만 사용했던 나는 이번 프로젝트에서 생전 처음으로 MariaDB를 쓰면서 MySql 문법을 익혀야 했다.

■ 공백치환 함수 ( NVL -> IFNULL )

Oracle : SELECT NVL('컬럼명', '') FROM DUAL;

MySql : SELECT IFNULL('컬럼명', '') FROM DUAL;

■ 현재 날짜시간

Oracle : SYSDATE

Mysql  : NOW() 

■ 날짜포멧

Oracle : TO_CHAR(sysdate,'MMDDYYYYHH24MISS')

Mysql  : DATE_FORMAT(now(),'%Y%m%d%H%i%s')  -> 여기서 대문자Y는 4자리 년도, 소문자 y는 2자리 년도

■ 날짜 포멧 : 요일

Oracle : 요일이 1~7로 인식함  -> TO_CHAR(SYSDATE - 1, 'D') 

Mysql : 요일이 0~6으로 인식   -> DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%w')
  • 참고로 자바스크립트가 0~6으로 인식하기에 Oracle 쿼리에서 -1을 해서 맞추는 경우가 많음

■ Like절 '%' 사용법

Oracle : Like '%'||'문자'||'%' 이런식으로 컬럼명 앞뒤로 '%'를 붙여주면 된다
Mysql : LIKE CONCAT('문자','%') 이런식으로 CONCAT 함수 사용

■ 형변환

Oracle : To_char, To_number 등
Mysql : CAST
SELECT TO_CHAR(1234) FROM DUAL 
-> SELECT CAST(1234 AS CHAR) FROM DUAL

■ 대소문자 구분함

Oracle : 구분없음
Mysql : 기본적으로 구분하나, 설정으로 변경 가능함

■ ROWNUM

Oracle : where 절에 rownum > 5 and rownum =< 10 
Mysql : where절 없이 limit 5,10

■ Sequence(시퀀스)는 둘 다 사용자함수를 만들어서 아래와 같이 사용

Oracle : 시퀀스명.nextval

Mysql : 시퀀스명.currval

■ 문자열 자르기

Oracle: SUBSTR(문자열, 1, 10)

Mysql: SUBSTRING(문자열, 1,10), LEFT(문자열, 3), RIGHT(문자열, 3)

■ 문자열 합치기 ( - 문자열을 연결한다고 가정)


Oracle: 문자열(또는 컬럼) ||' - '

Mysql: CONCAT(문자열(또는 컬럼), ' - ')

■ 예약어가 컬럼명일 때

Oracle: 컬럼명을 따옴표(")로 감싸기 (예: select "column" from tab)

Mysql: 컬럼명을 TAB 키 위에 있는 ` 키 ( Single quotation )로 감싸기

■ 저장프로시저 있는지 여부 파악해서 Create 하기

Oracle: CREATE OR REPLACE PROCEDURE 프로시저명

Mysql: DROP PROCEDURE IF EXISTS 프로시저명; 을 한 뒤에 CREATE PROCEDURE 프로시저명

참고 : https://m.blog.naver.com/cacung82/220219070134

profile
ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ 🔥

2개의 댓글

comment-user-thumbnail
2021년 4월 16일

짱이예요bbbbb

답글 달기
comment-user-thumbnail
2021년 4월 16일

최고

답글 달기