TIL 20241122 - 코테 풀고 메모 (3) oracle 과 mysql 차이

2024. 11. 22. 16:19코딩테스트

회사에서 Oracle를 사용한다고 들어서 미리 공부할겸,,, 코테를 풀었다.

보통 mysql의 문제만 풀어서,, 둘의 차이가 있는 것을 정리하고자 한다.

 

 

 

 

(1) limit vs rownum (페이징 처리 다름)

mysql를 풀었을 때는 limit를 사용하여 간단하게 1개만 제한해서 할 수 있었는데,

oracle에서는 limit을 사용할 수 없고 rowrum을 사용해야한다고 한다. 

왠지 oracle에서 limit을 사용하니 문제에서 에러가 났어서.... 왜 그런가 했는데 제공이 되는 문법이 아니였던 것이다.

 

MYSQL

SELECT DATETIME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1; 

 

ORACLE

SELECT DATETIME FROM (
    SELECT  DATETIME FROM ANIMAL_INS
    ORDER BY DATETIME   
WHERE ROWNUM = 1;

 

이렇게 WHERE 절을 사용해서 rowrum을 사용하여 풀 수 있었다. 

 

 

 

 

(2) IFNULL vs NVL

null을 처리할때 mysql은 IFNULL을 사용하지만 oracle은 NVL을 사용한다고 한다.

 

MYSQL

SELECT  ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS;

 

ORACLE

SELECT  ANIMAL_TYPE, NVL(NAME, 'no name') AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS;

 

같은 형태이지만, 문법만 다르게 사용한다는 것을 알고 넘어가자.

 

 

와 다른 문제도 풀고 있는데,,,

 

SELECT  WAREHOUSE_ID, WAREHOUSE_NAME , ADDRESS, IFNULL(FREEZER_YN, "N") AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE "창고_경기%"

 

MYSQL엔 이렇게 위처럼 풀어서 문제를 맞힐수 있었기에 위에 적어둔 문법 차이일거라고 생각하고 오라클에서 문제를 풀 땐 NVL로 바꿔줬는데,,, 안돼서,,, 이것저것 해보니깐 큰 따옴표가 아닌 작은 따옴표를 사용해서 됐다... ㅎㅎ Oracle에선 웬만해선 ''를 사용해야겠다.

 

SELECT  WAREHOUSE_ID, WAREHOUSE_NAME , ADDRESS, NVL(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '창고_경기%'

 

근데 또 별칭을 사용할 때는 큰 따옴표를 사용하는 것 같다.

AS " " 이런식으로!

 

 

 

 

(3) 상황에 따라 vs 대소문자 구분없음

 

MYSQL

기본적으로는 구분을 하나, 때로 설정을 변경할 수 있다고 한다.

 

ORACLE

대소문자의 구분이 없다고 한다.

 

 

 

 

(4) DATE 관련 현재 날짜 NOW() VS SYSDATE

각 NOW, SYSDATE을 사용하기에 다르다고 한다.  

 

MYSQL

SELECT NOW();

 

ORACLE

SELECT SYSDATE FROM RIM;

 

 

 

(5) DATE 관련 날짜 형식 DATE_FORMAT VS TO_CHAR

 

이전엔 줄곧 MYSQL를 풀었으니,, 주로 DATE_FORMAT을 사용했었는데,,, 

ORACLE 문법도 기억해야겠다...

 

MYSQL

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');

DATE_FORMAT를 사용한다.

 

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,"%Y-%m-%d") AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD ="CS" OR MCDP_CD = "GS"
ORDER BY HIRE_YMD DESC, DR_NAME ASC 

 

ORACLE

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM RIM;

 

TO_CHAR을 사용하고 SYSDATE (=현재 시각)를 사용한다.

SELECT DR_NAME, DR_ID, MCDP_CD, TO_CHAR(HIRE_YMD ,'YYYY-MM-DD') AS  HIRE_YMD FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

 

 

(5) ||

MYSQL

||는 논리 연산자로 문자열을 묶는 용도가 아니다. 

 

ORACLE

||(연결 연산자)로 여러 문자열로 묶을 수 있다. 논리연산자 같은 경우는 OR로 해야 한다.

가시적이기 때문에 현업에서 많이 쓴다고 한다.

비슷한 것은 CONCAT이 있다. 

 

SELECT ('/home/grep/src/' || B.BOARD_ID || '/' || F.FILE_ID || F.FILE_NAME || F.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD B LEFT OUTER JOIN USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID 
WHERE B.BOARD_ID = (
                    SELECT B.BOARD_ID
                    FROM (
                            SELECT *
                            FROM USED_GOODS_BOARD
                            ORDER BY VIEWS DESC
                         ) B
                    WHERE ROWNUM = 1
                    )
ORDER BY F.FILE_ID DESC

 

이런식으로 문자열을 묶을 때 ||를 사용한다. 

 

 

코테 풀때마다 ++ 계속 추가할 예정