본문 바로가기
프로그래밍/SQL, Hive, SAS 관련 정보

[SQL기초] Oracle/MySQL의 대표적인 용법 차이

by TrillionNT 2025. 3. 22.

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


오늘은 간단하게 Oracle과 MySQL의 대표적인 용법 차이에 대해 짚어보고 가겠습니다. 

1. Null 관련함수

Null일 경우 대체값 반환하기

SELECT NVL(salary, 0) FROM employees;--ORACLE

 

SELECT IFNULL(salary, 0) FROM employees;--MySQL

 

여러 개의 값을 검사하며 첫 번째 Null이 아닌 값을 반환 (공통)

SELECT COALESCE(salary, bonus, 0) FROM employees;

 

두 값이 같으면 Null반환, 다르면 첫 번째 값을 반환 (공통)

SELECT NULLIF(salary, bonus) FROM employees;

 

 

2. 날짜 포맷/형 변환

select TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') from dual;--ORACLE
select DATE_FORMAT(NOW(),'%Y%m%d%H%i%s') from dual;--MySQL

2025.03.22 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL기초] 형 변환

2025.02.26 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL 기초] 날짜형식 연/월/일

 

SELECT CAST(12345 AS CHAR) AS str_value;
SELECT CAST('2025-03-22' AS DATE) AS date_value;

 

3. 문자열 Concatenate

SELECT first_name || ' ' || last_name AS full_name FROM employees;--ORACLE
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;--MySQL

 

참고로 Oracle도 CONCAT함수를 사용할 수 있지만 2개의 문자열만 연결할 수 있습니다. 

 

 

4. 페이징처리

Oracle은 기본적으로 아래와 같이 Rownum을 활용하는 방식으로 출력되는 행을 조절해야 합니다. (참고로 아래 예시는 Between을 사용해서 동일한 결론을 얻을 수도 있을 겁니다)

SELECT * FROM (
    SELECT row_.*, ROWNUM rownum_ FROM (
        SELECT * FROM table_name
        ORDER BY column_name
    ) row_
) 
WHERE rownum_ > 20 AND rownum_ <= 30;

Oracle 12c 이후 부터는 MySQL과 유사한 방식도 사용할 수 있다고 합니다. 

SELECT * FROM table_name
ORDER BY column_name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

 

MySQL은 Limit를 활용하면 됩니다. (21번째 행부터 10개의 행을 반환)

SELECT * FROM table_name
ORDER BY column_name
LIMIT 10 OFFSET 20;--MySQL

 

 

5. Window 함수의 사용 용법

-- ORACLE (RANGE 지원)
SELECT SUM(salary) OVER (ORDER BY hire_date RANGE BETWEEN 30 PRECEDING AND CURRENT ROW)
FROM employees;

-- MySQL (ROWS만 지원)
SELECT SUM(salary) OVER (ORDER BY hire_date ROWS BETWEEN 30 PRECEDING AND CURRENT ROW)
FROM employees;

2024.11.03 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL 기초] Window함수

 

 

5. Full outer join

MySQL에서는 Full outer join을 지원하지 않습니다. 그래서 우회해서 조인시켜야합니다. 

SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
UNION
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL; -- LEFT JOIN에서 이미 포함된 레코드 제외

 

 

  • 첫 번째 SELECT 문은 LEFT JOIN을 사용하여 customers 테이블의 모든 레코드와 orders 테이블에서 일치하는 레코드를 결합합니다.
  • 두 번째 SELECT 문은 RIGHT JOIN을 사용하여 orders 테이블의 모든 레코드와 customers 테이블에서 일치하는 레코드를 결합합니다. WHERE c.customer_id IS NULL 절은 LEFT JOIN에서 이미 포함된 레코드를 제외합니다.
  • UNION 연산자는 두 SELECT 문의 결과를 결합하여 FULL OUTER JOIN과 동일한 결과를 반환합니다.