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과 동일한 결과를 반환합니다.
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL 기초] Join의 on 조건과 where 조건 (0) | 2025.04.05 |
---|---|
[SQL 기초] 날짜 덧셈/뺄셈 (0) | 2025.03.23 |
[SQL기초] 형 변환 (0) | 2025.03.22 |
[SQL 기초] Self 조인 (0) | 2025.03.17 |
[SQL문제풀이] - 명시적 Group이 없을 때 Grouping (2) (0) | 2025.03.14 |