본문 바로가기

DB

MySQL Oracle 조건문 /Insert 문/TOP N 행 / 집계문자열 정리

 조건문 – IF vs CASE

SQL에서 조건 분기 처리하는 방법

MySQL – IF 함수

SELECT name,
       IF(salary >= 5000, '고연봉', '일반') AS pay_grade
FROM employees;
  • IF(expr, true_value, false_value) 형식
  • 조건식이 TRUE면 두 번째 값, FALSE면 세 번째 값 반환

Oracle – CASE 문

SELECT name,
       CASE
           WHEN salary >= 5000 THEN '고연봉'
           ELSE '일반'
       END AS pay_grade
FROM employees;
  • SQL 표준 CASE 문법
  • 복수 조건도 가능

다중 INSERT

여러 행을 한 번에 INSERT 하는 방법

MySQL

INSERT INTO user (id, name) VALUES
(1, '홍길동'),
(2, '이순신'),
(3, '강감찬');
  • 여러 레코드 한 번에 삽입 가능

Oracle 11g

INSERT INTO user (id, name) VALUES (1, '홍길동');
INSERT INTO user (id, name) VALUES (2, '이순신');
INSERT INTO user (id, name) VALUES (3, '강감찬');
  • 다중 VALUES 지원 안 함 → 여러 번 INSERT 실행 필요
  • 12c 이상에서는 INSERT ALL 문법 가능

TOP N 행 조회 – LIMIT vs ROWNUM

결과 상위 N개만 가져오기

MySQL

SELECT * FROM products ORDER BY price DESC LIMIT 5;
  • 간단하게 LIMIT 사용 가능

Oracle 11g

SELECT *
FROM (
    SELECT * FROM products ORDER BY price DESC
)
WHERE ROWNUM <= 5;
  • ROWNUM은 정렬 전에 부여되므로, 정렬 후 제한하려면 서브쿼리 필요

 집계 문자열 – GROUP_CONCAT vs LISTAGG

그룹별 문자열 합치기

MySQL

SELECT department_id, GROUP_CONCAT(name ORDER BY name SEPARATOR ', ')
FROM employees
GROUP BY department_id;

Oracle 11g

SELECT department_id,
       LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS names
FROM employees
GROUP BY department_id;
  • Oracle 11g부터 LISTAGG 지원

10. Boolean 자료형

참/거짓 값 저장

MySQL

CREATE TABLE flags (
    is_active TINYINT(1)
);
  • TINYINT(1)로 대체 (0 = false, 1 = true)

Oracle

CREATE TABLE flags (
    is_active NUMBER(1)
);
  • BOOLEAN 자료형 없음 (PL/SQL에는 있음)
  • 0/1로 표현

 Dual 테이블

임시/가상 테이블

MySQL

SELECT 1;
  • FROM 절 없이 바로 가능

Oracle

SELECT 1 FROM dual;
  • DUAL 테이블 필수

 서브쿼리 별칭

서브쿼리 결과에 별칭 필수 여부

MySQL

SELECT * FROM (SELECT * FROM employees) e;
  • 별칭 생략 가능 (단, 권장 X)

Oracle

SELECT * FROM (SELECT * FROM employees) e;
  • 별칭 필수 (없으면 오류 발생)

 IF EXISTS / REPLACE 차이

MySQL

DROP TABLE IF EXISTS my_table;
REPLACE INTO table_name ...
  • IF EXISTS 지원
  • REPLACE INTO로 UPSERT 구현 가능

Oracle

-- IF EXISTS 없음 → 예외 처리로 대체
-- REPLACE INTO 없음 → MERGE 사용
MERGE INTO target t
USING (SELECT 1 id FROM dual) s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...);