Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

자격증/SQL

SQL) SQL 기본

새벽_글쓴이 2025. 5. 23. 00:00
반응형

WHERE

연산자의 종류

구분 연산자 연산자의 의미
비교 연산자 = 같다.
  > 보다 크다.
  >= 보다 크거나 같다.
  < 보다 작다.
  <= 보다 작거나 같다.
SQL 연산자 BETWEEN a AND b a와 b의 값 사이에 있으면 된다. (a와 b 값이 포함됨)
  IN (list) 리스트에 있는 값 중에서 어느 하나라도 일치하면 된다.
  LIKE '비교문자열' 비교문자열과 형태가 일치하면 된다. (%, _ 사용)
  IS NULL NULL 값인 경우
논리 연산자 AND 앞에 오는 조건과 뒤에 오는 조건이 참(TRUE)이 되면 결과도 참(TRUE)이 된다.
  OR 앞의 조건이 참(TRUE)이거나 뒤의 조건이 참(TRUE)이 되어야 결과도 참(TRUE)이 된다.
    즉, 앞뒤의 조건 중 **하나만 참(TRUE)**이면 된다.
  NOT 앞에 오는 조건에 반대되는 결과를 도출한다.
부정 비교 연산자 != 같지 않다.
  <> 같지 않다.
  ^= 같지 않다. (ISO 표준, 모든 응용계에서 사용 가능)
  NOT 같음(=) ~와 같지 않다.
  NOT > ~보다 크지 않다.
  NOT < ~보다 작지 않다.
부정 SQL 연산자 NOT BETWEEN a AND b a와 b 값 사이에 없다.
  NOT IN (list) list 값과 일치하지 않는다.
  IS NOT NULL NULL 값을 갖지 않는다.

 

문자 우형 비교

CHAR 타입인 경우 길이가 다르다면 작은 쪽에 SPACE를 추가하여 길이를 같게 한 후에 비교한다.

ANY(서브쿼리) 서비쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미- 비교연산자로 " > " 를 사용했다면 메인쿼리는 서브쿼리의 값들 중 어떤 값이라도 만족하면 되므로 서브쿼리의 결과의 최소값보다 큰 모든 건이 조건을 만족- SOME과 동일
ALL(서브쿼리) 서브쿼리의 결과에 존재하는 모든값을 만족하는 조건을 의미.- 비교연산자로 " > " 를 사용했다면 메인쿼리는 서브쿼리의 모든 값을 만족해야 하므로 서브쿼리의 결과의 최대값보다 큰 모든 건이 조건을 만족

 

연산자의 우선순위

연산 우선순위 설명
1 괄호 ()
2 NOT 연산자
3 비교 연산자, SQL 비교 연산자
4 AND
5 OR

 

NULL

NULL(ASCII 코드 00번)은 공백(BLANK, ASCII 코드 32번)이나 숫자 0(ZERO, ASCII 48)과는 전혀 다른 값이며, 조건에 맞는 데이터가 없을 때의 공집합과도 다르다. ‘NULL’은 ‘아직 정의되지 않은 미지의 값’이거나 ‘현재 데이터를 입력하지 못하는 경우’를 의미한다.

 

NULL의 연산

  • NULL 값과의 연산(+,-,*,/ 등)은 NULL 값을 리턴
  • NULL 값과의 비교연산(=,>,>=,<,<=)을 통해서 비교할 수도 없고, 비교연산을 하더라도 결과는 거짓(FALSE)를 리턴
  • 어떤 값과 비교할 수도 없으며, 특정 값보다 크다, 적다라고 표현할 수 없다.
  • 비교가 불가하기 때문에 =, != 와 같은 비교연산자가 아닌 IS NULL, IS NOT NULL이라는 키워드를 사용해야 한다.

ORACLE VARCHAR에 ''(공백)이 들어갈 경우 NULL 이 됨. SQL SERVER는 VARCHAR에 ''(공백)이 들어갈 경우 그대로공백으로 들어감.

IN과 NOT IN의 NULL 연산

단일행 NULL 관련 함수의 종류

일반형 함수 함수 설명
NVL(표현식1, 표현식2 (Oracle)  
ISNULL(표현식1, 표현식2) (SQL Server) 표현식1의 결과값이 NULL이면 표현식2의 값을 출력한다.
※ 단, 표현식1과 표현식2의 데이터 타입이 같아야 한다.  
NULL 관련 가장 많이 사용되는 함수로 매우 중요함.  
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 반환한다.
COALESCE(표현식1, 표현식2, ...) 입력된 표현식들 중에서 NULL이 아닌 첫 번째 값을 반환한다.
모든 표현식이 NULL이면 결과도 NULL.  

※ 주: Oracle함수/SQL Server함수로 표시, / 없는 것은 공통 함수

🔹 1. NVL() (Oracle) / ISNULL() (SQL Server)

NULL이면 대체값으로 바꾸기

-- Oracle
SELECT NVL(commission, 0) FROM employees;

-- SQL Server
SELECT ISNULL(commission, 0) FROM employees;
  • commission이 NULL이면 0으로 출력
  • 반드시 두 표현식의 데이터 타입이 같아야 함

🔹 2. NULLIF()

두 값이 같으면 NULL, 다르면 첫 번째 값

SELECT NULLIF(100, 100);  -- 결과: NULL
SELECT NULLIF(100, 200);  -- 결과: 100
  • 자주 쓰이는 용도: 나눗셈 오류 방지 (0으로 나누는 문제)
SELECT salary / NULLIF(hours, 0) FROM employees;

🔹 3. COALESCE()

여러 값 중에서 NULL이 아닌 첫 번째 값 반환

SELECT COALESCE(email, phone, '연락처 없음') FROM customers;
  • email, phone 둘 다 NULL이면 '연락처 없음' 반환
  • 가장 범용적이고 표준 SQL 함수, Oracle/SQL Server 공통 사용 가능

집계 함수

집계 함수의 종류

집계 함수 사용 목적
COUNT(*) NULL 값을 포함한 행의 수를 출력한다.
COUNT(표현식) 표현식의 값이 NULL이 아닌 경우에만 행의 수를 출력한다.
**SUM([DISTINCT ALL] 표현식)**
**AVG([DISTINCT ALL] 표현식)**
**MAX([DISTINCT ALL] 표현식)**
**MIN([DISTINCT ALL] 표현식)**
**STDEV([DISTINCT ALL] 표현식)**
**VARIAN([DISTINCT ALL] 표현식)**

※ DISTINCT: 중복 제거 / ALL: 전체 포함(기본값)

※ NULL은 AVG 연산 대상에서 제외됨

※ STDEV와 VARIAN의 모든 값이 NULL이거나 1개 이하면 NULL

 

각 함수의 설명 + 예제

🔸 1. COUNT(*)

테이블의 전체 행 수를 셈 (NULL 포함)

SELECT COUNT(*) FROM employees;

 

🔸 2. COUNT(컬럼명)

해당 컬럼에 값이 NULL이 아닌 행만 셈

SELECT COUNT(phone) FROM customers;

 

🔸 3. SUM(컬럼명)

숫자형 컬럼의 합계

SELECT SUM(salary) FROM employees;
  • NULL은 자동으로 제외됨

 

🔸 4. AVG(컬럼명)

평균값 계산 (NULL 제외)

SELECT AVG(salary) FROM employees;

 

🔸 5. MAX(컬럼명), MIN(컬럼명)

최댓값 / 최솟값 계산

SELECT MAX(salary), MIN(salary) FROM employees;
  • 문자나 날짜도 가능:
SELECT MAX(hire_date), MIN(name) FROM employees;

 

🔸 6. STDEV(컬럼명) (또는 STDDEV)

표준편차 계산

SELECT STDEV(salary) FROM employees;

 

🔸 7. VARIAN(컬럼명) (또는 VARIANCE)

분산 계산

SELECT VARIANCE(salary) FROM employees;

SQL 집계, 정렬, 그룹 조건 처리의 핵심 구조

GROUP BY 절

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
  • 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  • GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.
  • 집계 함수는 WHERE 절에는 올 수 없다. (집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다)
  • WHERE 절은 전체 데이터를 GROUP 으로 나누기 전에 행들을 미리 제거시킨다.
  • HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
  • GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
  • HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

역할:

테이블의 데이터를 소그룹(집단)으로 묶어서, 각 그룹에 대해 **집계 함수(SUM, AVG 등)**를 적용

 

예제

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

→ 부서별로 급여 평균을 구함


HAVING 절

테이블 전체가 한개의 그룹이 되는 경우 GROUP BY 없이 단독 HAVING이 올 수 있다.

역할:

GROUP BY로 묶인 그룹에 조건을 거는 절

※집계 함수는 WHERE절에서 사용할 수 없고, 반드시 HAVING에서 사용해야 합니다.

 

예제:

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;

→ 급여 평균이 5000 이상인 부서만 출력

 

단독 사용도 가능 (GROUP BY 없이)

SELECT AVG(salary)
FROM employees
HAVING AVG(salary) > 5000;

GROUP BY vs HAVING vs WHERE

절 실행 시점 역할 집계 함수 사용 가능?

WHERE GROUP BY 이전 행 필터링 ❌ 불가능
GROUP BY WHERE 다음 그룹화
HAVING GROUP BY 다음 그룹 조건 필터링 ✅ 가능

 

ORDER BY 절

ORDER BY 절 특징

  • 기본적인 정렬 순서는 오름차순(ASC)이다.
  • 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.
  • 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력된다.
  • Oracle 에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.
  • 반면, SQL Server 에서는 NULL 값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 먼저, 내림차순으로 정렬했을 경우에는 가장 마지막에 위치한다.

역할

SELECT 결과를 정렬(오름차순/내림차순)해서 보여줍니다.

 

정렬 키워드

ASC: 오름차순 (기본값)

DESC: 내림차순 (큰 값부터 먼저 정렬)

SELECT * FROM students
ORDER BY score ASC;
-> 점수가 낮은 학생부터 정렬

SELECT * FROM students
ORDER BY score
-> 기본값인 ASC가 적용됨

SELECT * FROM students
ORDER BY score DESC;
-> 점수가 높은 학생부터 순서대로 정렬

 

프로그램 별 특징

항목 Oracle SQL Server

NULL 오름차순 위치 마지막 맨 앞
NULL 내림차순 위치 맨 앞 마지막

SELECT 실행순서

FROM 발췌 대상 테이블을 참조한다.

WHERE 발췌 대상 데이터가 아닌 것은 제거한다.
GROUP BY 행들을 소그룹화 한다.
HAVING 그룹핑된 값의 조건에 맞는 것만을 출력한다.
SELECT 데이터 값을 출력/계산한다.
ORDER BY 데이터를 정렬한다.

TOP N 쿼리

WITH TIES 옵션은 ORDER BY 절의 조건 기준으로 TOP N 의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N+ 동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션이다.

SQL 기준

SELECT TOP 3 * FROM students
ORDER BY score DESC;

→ 상위 3명 출력 ( 점수 높은 순)

WITH TIES 옵션

SELECT TOP 3 WITH TIES *
FROM students
ORDER BY score DESC;

→ 점수가 동일한 경우 3명 넘게도 반환 (동률 포함)

예시

예 결과

1등: 100점  
2등: 99점  
3등: 98점  
4등: 98점 → TOP 3만 쓰면 98점 1명만 포함
→ WITH TIES 쓰면 98점 둘 다 포함  

함수

내장함수

함수는 벤더에서 제공하는 함수인 내장 함수(Built-in Function)와 사용자가 정의할 수 있는 함수(User Defined Function)로 나눌 수 있다. 내장 함수는 다시 함수의 입력 값이 단일행 값이 입력되는 단일행 함수(Single-Row Function)와 여러 행의 값이 입력되는 다중행 함수(Multi-Row Function)로 나눌 수 있다. 다중행 함수는 다시 집계 함수(Aggregate Function), 그룹 함수(Group Function), 윈도우 함수(Window Function)로 나눌 수 있다.

 

SQL 함수의 종류

종류 내용 함수의 예

문자형 함수 문자를 입력하면 문자나 숫자 값을 반환한다. LOWER, UPPER, SUBSTR / SUBSTRING, LENGTH / LEN, LTRIM, RTRIM, TRIM, ASCII
숫자형 함수 숫자를 입력하면 숫자 값을 반환한다. ABS, MOD, ROUND, TRUNC, SIGN, CHR / CHAR, CEIL / CEILING, FLOOR, EXP, LOG, LN, POWER, SIN, COS, TAN,TRUNC(숫자, m), ROUND(숫자, m)
날짜형 함수 DATE 타입의 값을 연산한다. SYSDATE / GETDATE, EXTRACT / DATEPART, TO_NUMBER(TO_CHAR(d, 'YYYYMMDD')), YEAR, MONTH, DAY
변환형 함수 문자, 숫자, 날짜형 값의 데이터 타입을 변환한다. TO_NUMBER, TO_CHAR, TO_DATE, CAST, CONVERT
NULL 관련 함수 NULL을 처리하기 위한 함수 NVL / ISNULL, NULLIF, COALESCE
결합 함수 문자열을 서로 이어 붙인다. (문자열 연결 연산자) CONCAT(문자1, 문자2) / `문자1

※ /가 있는 함수는 Oracle / SQL Server 구분, / 없는 것은 공통 함수

함수 종류별 설명

🔹 1. 문자형 함수

문자 데이터를 가공하거나 분석할 때 사용

문자형 함수 함수 설명
LOWER(문자열) 문자열의 알파벳 문자소문자로 바꾸어 준다.
UPPER(문자열) 문자열의 알파벳 문자대문자로 바꾸어 준다.
ASCII(문자) 문자의 숫자값(ASCII 코드)를 반환한다.
CHR / CHAR(ASCII 번호) ASCII 코드 번호문자로 바꾸어 준다.
CONCAT(문자열1, 문자열2) Oracle, MySQL의 유효한 함수로 문자열1과 문자열2를 연결한다.
SUBSTR / SUBSTRING(문자열, m, n) 문자열 중 m 위치에서 n개의 문자 길이에 해당하는 문자를 잘라냄
(n이 생략되면 끝까지 반환)
LENGTH / LEN(문자열) 문자열의 문자 수를 숫자로 돌려준다.
LTRIM(문자열 [, 지정문자]) 문자열의 왼쪽(처음부터) 지정한 문자가 나타나는 동안 제거한다.
SQL Server에서는 LTRIM()만 제공하며 공백만 제거 가능
RTRIM(문자열 [, 지정문자]) 문자열의 오른쪽(끝에서부터) 지정한 문자가 나타나는 동안 제거한다.
SQL Server에서는 RTRIM()만 제공하며 공백만 제거 가능
TRIM([LEADING | TRAILING | BOTH]
지정문자 FROM 문자열)
문자열의 앞, 뒤 또는 양쪽에서 지정 문자를 제거한다. (SQL Server에서는 공백만 제거 가능)

 

📌 자주 쓰는 예:

  • LOWER('HELLO') → 'hello'
  • SUBSTR('ABCDE', 2, 3) → 'BCD'
  • LENGTH('한글') → 문자 수 반환

🔹 2. 숫자형 함수

숫자를 계산하거나 정리할 때 사용

숫자형 함수 함수 설명
ABS(숫자) 숫자의 절댓값을 반환한다.
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나눈 나머지를 반환한다.
ROUND(숫자, m) 숫자를 소수 m자리에서 반올림한다. (기본: 0자리)
TRUNC(숫자, m) 숫자를 소수 m자리에서 잘라냄 (반올림 X, 기본: 0자리)
CEIL / CEILING(숫자) 올림한 정수를 반환한다. 예: CEIL(2.3) → 3
FLOOR(숫자) 내림한 정수를 반환한다. 예: FLOOR(2.9) → 2
EXP(숫자) e의 거듭제곱을 반환한다. 예: EXP(1) → 2.718…
LOG(숫자) 숫자의 **로그값(log10)**을 반환한다.
LN(숫자) 숫자의 자연로그(ln) 값을 반환한다.
POWER(x, y) x의 y제곱을 반환한다. 예: POWER(2, 3) → 8
SIGN(숫자) 숫자의 부호를 반환한다. (양수 1, 0은 0, 음수 -1)
SIN, COS, TAN(각도) 삼각함수 결과를 반환한다. (라디안 단위 기준)

 

📌 예시:

  • ABS(-10) → 10
  • ROUND(3.1415, 2) → 3.14
  • CEIL(2.3) → 3

🔹 3. 날짜형 함수

날짜 데이터를 계산, 추출할 때 사용

날짜형 함수 함수 설명
SYSDATE / GETDATE() 현재 날짜와 시간을 반환한다. (SYSDATE는 Oracle, GETDATE()는 SQL Server)
EXTRACT(단위 FROM 날짜) 날짜에서 연도, 월, 일 등을 추출한다.
DATEPART(단위, 날짜) SQL Server 전용. 날짜에서 특정 부분을 추출
YEAR(날짜), MONTH(날짜), DAY(날짜) 날짜에서 각각 연, 월, 일을 반환한다.
TO_CHAR(날짜, '형식') 날짜를 문자열로 형식화한다. (예: 'YYYY-MM-DD')
TO_NUMBER(TO_CHAR(날짜, 'YYYYMMDD')) 날짜를 숫자형으로 변환해 사용할 수 있게 한다.

 

📌 예시:

  • SYSDATE (Oracle) / GETDATE() (SQL Server) → 현재 날짜
  • EXTRACT(YEAR FROM hire_date) → 연도만 추출
  • TO_NUMBER(TO_CHAR(sysdate, 'YYYYMMDD')) → 날짜를 숫자로 바꾸기

🔹 4. 변환형 함수

데이터 타입 변환 (문자 ↔ 숫자, 문자 ↔ 날짜 등)

변환형 함수 함수 설명
TO_CHAR(값) 숫자나 날짜 등을 문자열로 변환한다.
TO_NUMBER(문자) 문자열을 숫자로 변환한다. (형식에 맞아야 함)
TO_DATE(문자, '형식') 문자열을 날짜로 변환한다.
CAST(값 AS 타입) 표준 SQL 방식의 타입 변환 함수
CONVERT(타입, 값) SQL Server에서 사용하는 타입 변환 함수

 

📌 예시:

  • TO_CHAR(123) → '123'
  • TO_DATE('2024-01-01', 'YYYY-MM-DD') → 날짜로 변환
  • CAST('123' AS INT) → 숫자로 변환

🔹 5. NULL 관련 함수

NULL 값 처리 (회피, 비교, 대체 등)

NULL 함수 함수 설명
NVL(표현식1, 표현식2) 표현식1이 NULL이면 표현식2 반환 (Oracle 전용)
ISNULL(표현식1, 표현식2) 표현식1이 NULL이면 표현식2 반환 (SQL Server 전용)
NULLIF(표현식1, 표현식2) 두 표현식이 같으면 NULL, 다르면 표현식1 반환
COALESCE(표현식1, 표현식2, …) 첫 번째 NULL이 아닌 값을 반환

 

📌 예시:

  • NVL(salary, 0) (Oracle)
  • ISNULL(salary, 0) (SQL Server)
  • COALESCE(col1, col2, 0) → 첫 번째 NULL 아님 값 반환
  • NULLIF(a, b) → a = b이면 NULL 반환

🔹 6. 결합 함수 (문자열 연결)

함수 설명 DBMS 예시
CONCAT(a, b) 문자열 a와 b를 이어 붙임 Oracle / SQL Server CONCAT('Hello', 'World') → 'HelloWorld'
a + b 문자열 연결 연산자 SQL Server 'A' + 'B' → 'AB'
    Oracle `‘A’

 

📌 Oracle은 ||, SQL Server는 +를 쓰는 게 일반적이고, CONCAT() 함수는 두 DB 모두 지원합니다.


DUAL 테이블

Oracle에서만 존재하는 특별한 1행 1열짜리 테이블

SQL 문법상 FROM 절이 반드시 필요하기 때문에 만든 더미(Dummy) 테이블

예시: 값을 직접 계산해서 조회하고 싶을 때

SELECT 1 + 1 FROM DUAL;
-- 결과: 2
SELECT SYSDATE FROM DUAL;
-- 결과: 현재 날짜

 

📌 SQL은 SELECT ~ FROM ~ 구조를 요구하므로,

FROM 절에 넣을 "아무거나"가 필요할 때 → DUAL을 사용


특성 요약

특성 설명
소유자 SYS 사용자 (시스템 관리자 계정)
모든 사용자 접근 가능 ✅ 공용 테이블 (Public Synonym)
구조 1개의 행, 1개의 열 (DUMMY 컬럼 하나)
DUMMY 값 항상 'X' 라는 문자열
주 목적 계산, 상수, 함수 테스트, 단일 행 반환용

예제

SELECT 'HELLO' FROM DUAL;
-- 결과: 'HELLO'

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
-- 결과: 오늘 날짜

SQL Server에는 없나요?

맞아요.

SQL Server에는 DUAL 테이블이 없습니다.

하지만 FROM 없이도 쿼리를 쓸 수 있어서 굳이 필요하지 않아요:

-- SQL Server
SELECT GETDATE();  -- 가능!
SELECT 1 + 1;       -- 가능!

왜 이름이 DUAL인가요?

역사적으로 Oracle에서 두 행을 출력하기 위해 만든 임시 테이블이었지만,

지금은 단일 행만 갖고 있으며 그 역할도 테스트용 테이블로 바뀌었습니다.


CASE 구문 (조건문)

SQL의 CASE는 IF문처럼 조건을 분기할 수 있게 해줌

📌 기본 구조

CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ...
    ELSE 기본결과
END
  • WHEN: 조건을 지정
  • THEN: 조건이 참일 때 출력할 값
  • ELSE: 모든 조건이 거짓일 때 출력할 기본값
  • END: CASE문 종료
  • AS: 결과 컬럼에 별칭 부여 (보통 SELECT에서 함께 사용)

예제

SELECT
  emp_name,
  salary,
  CASE
    WHEN salary >= 5000 THEN '고액'
    WHEN salary >= 3000 THEN '중간'
    ELSE '저액'
  END AS 급여등급
FROM employees;

 

항목 설명
CASE 조건 분기 시작
WHEN salary >= 5000 조건
THEN '고액' 해당 조건이 맞을 때 출력할 값
ELSE '저액' 모든 조건이 틀릴 때 출력할 값
END CASE 종료
AS 급여등급 결과 열에 붙이는 이름(별칭)

Oracle SQL에서 날짜와 시간의 처리 방법

TO_DATE 함수 기본 개념

TO_DATE('20240514153000', 'YYYYMMDDHH24MISS')
  • 앞에 있는 문자열 '20240514153000' → 날짜와 시간 정보가 붙은 문자열
  • 뒤에 있는 포맷 'YYYYMMDDHH24MISS' → 이 문자열을 어떻게 해석할지 알려주는 형식

포맷 모델 의미

코드 의미 예시 값
YYYY 연도 (4자리) 2024
MM 월 (2자리) 05
DD 일 (2자리) 14
HH24 24시간제 시각 15 (오후 3시)
MI 분 (minute, 2자리) 30
SS 초 (second, 2자리) 00

왜 HH24를 써야 할까?

Oracle에서 시각은 두 가지 방식이 있음

코드 의미 시간 표현

HH12 12시간제 1 ~ 12 (AM/PM 필요)
HH24 24시간제 0 ~ 23

그래서 AM/PM 없이 정확한 시간 넣으려면 반드시 HH24 사용.


예시 1: HH24만 사용하는 경우

TO_DATE('2024051415', 'YYYYMMDDHH24')
  • 해석:
    • 연도: 2024
    • 월: 05
    • 일: 14
    • 시: 15시 (오후 3시)
    • 분, 초는 생략 → 자동으로 00분 00초
  • 결과:
  • → 2024-05-14 15:00:00

예시 2: HH24MI까지 사용하는 경우

TO_DATE('202405141530', 'YYYYMMDDHH24MI')

→ 2024-05-14 15:30:00


예시 3: HH24MISS까지 다 쓰는 경우

TO_DATE('20240514153045', 'YYYYMMDDHH24MISS')

→ 2024-05-14 15:30:45


주의할 점

  • 비교하는 날짜 컬럼에 시간까지 저장되어 있는 경우, 정확하게 비교하려면 MI, SS까지 같이 써야 함→ 15:00:00만 포함됨, 15:30:00은 안 잡힘
  • 예: WHERE SVC_END_DATE = TO_DATE('2024051415', 'YYYYMMDDHH24')

날짜 + 숫자 = 시간 더하기

Oracle에서는 날짜에 숫자를 더하면 하루를 1로 보는 비율로 시간 계산을 함

기본 개념 정리

더하는 값 의미
+1 1일 (24시간)
+1/24 1시간
+1/24/60 1분
+1/24/60/60 1초

정리

단위 계산 예시
1초 1/86400 + 1/(24*60*60)
1분 1/1440 + 1/(24*60)
10분 1/144 + 1/24/(60/10)

예시 1: 30분을 더할 때

30분 = 30 / (24 * 60)
     = 30 / 1440
     = 1 / 48
--------------------------     
+ 1/48
또는
+ 30/(24*60)

예시 2: 2분을 더하기

2분 = 2 / (24 * 60)
		= 2 / 1440
		= 1 / 720
-------------------------
+ 1 / 720
또는
+ 2 / (24 * 60)

예시 3: 30초 더하기

30초 = 30 /(24*60*60) 
		 = 30 / 86400
		 = 1 / 2880
------------------------
+ 1 / 2880
또는
+ 30 / (24*60*60)

CASE의 두 가지 형태 차이

SQL의 CASE 문에는 두 가지 유형이 있다

🔹 (1) Searched CASE (조건형 CASE)

CASE
  WHEN LOC = 'NEW YORK' THEN 'EAST'
  WHEN LOC = 'SEOUL' THEN 'KOREA'
  ELSE 'ETC'
END
  • WHEN 뒤에 조건식을 직접 쓴다
  • 다양한 조건 (<, =, BETWEEN, IS NULL, 등) 가능
  • 더 자유롭고 일반적인 방식

🔹 (2) Simple CASE (단순값 CASE)

CASE LOC
  WHEN 'NEW YORK' THEN 'EAST'
  WHEN 'SEOUL' THEN 'KOREA'
  ELSE 'ETC'
END
  • CASE <컬럼> 형식 → 컬럼 값을 기준으로 비교
  • WHEN에는 비교값만 쓰고, 내부적으로 LOC = 값처럼 비교
  • 간결하지만 단순한 비교만 가능 (복잡한 조건 불가)
구분 CASE WHEN LOC = ... CASE LOC WHEN ...
이름 Searched CASE Simple CASE
WHEN 뒤 조건식 비교값
조건 복잡성 복잡한 조건 가능 값 일치만 가능

 


DECODE 함수란?

Oracle에서 제공하는 간단한 조건 분기 함수. CASE 보다 짧고 빠르게 쓸 수 있지만 기능은 단순

기본 문법

DECODE(표현식, 값1, 결과1, 값2, 결과2, ..., [기본값])

 

→ "표현식이 값1이면 결과1, 값2면 결과2, 아니면 기본값"


예제

SELECT DECODE(GENDER, 'M', '남자', 'F', '여자', '기타') AS 성별표시
FROM STUDENTS;
  • GENDER = 'M' → '남자'
  • GENDER = 'F' → '여자'
  • 그 외는 '기타'

✅ DECODE vs CASE 비교

항목 DECODE CASE
Oracle 전용
ANSI SQL 표준
단순 비교
복잡한 조건
가독성 간결 유연하지만 길다

🔚 요약

  • CASE WHEN LOC = ... → Searched CASE (복잡한 조건 O)
  • CASE LOC WHEN ... → Simple CASE (간단한 값 비교만)
  • DEFAULT는 CASE에 안 쓰고, 테이블/프로시저에서 사용
  • DECODE()는 Oracle 전용의 간단한 CASE 대체 함수
반응형

'자격증 > SQL' 카테고리의 다른 글

SQL) SQL 활용  (1) 2025.05.24
오답노트 ( 관리구문 )  (2) 2025.05.22
오답노트 ( SQL 활용_2 )  (1) 2025.05.21
SQL) 데이터 모델과 SQL  (0) 2025.05.20
오답노트 ( SQL 활용_1 )  (0) 2025.05.20