본문 바로가기

언어/SQL

[기본] SQLD 2과목 1장 공부 정리 6 (문자형/숫자형/날짜형 함수, DECODE/CASE문, ROWNUM/ROWID, WITH구문)

과목 Ⅱ. 데이터모델링의 이해

 

1장 SQL 기본


9절 내장형 함수

 

1. 내장형 함수

 

ex) 형변환 함수, 문자열 및 숫자형 함수, 날짜형 함수 등


2. DUAL 테이블

: Oracle DB에 의해 자동으로 생성되는 테이블 (Dummy table) #MySQL에서는 desc로 dual테이블 조회가 안되는 듯

 

#Dual 테이블 조회 - Oracle

Desc dual;

3. 내장형 함수의 종류

 

<문자열 함수>

문자열 함수 설명
SUBSTR(문자열, m, n) 문자열의 m번째 위치에서 n개를 표시
CONCAT(문자열1, 문자열2) 문자열1, 2 결합
LOWER(문자열) 영문자를 소문자로 변환
UPPER(문자열) 영문자를 대문자로 변환
LENGTH(문자열) OR LEN(문자열) 문자열의 길이를 알려줌 (공백 포함)
LTRIM(문자열, 지정문자) 왼쪽에서 지정된 문자 삭제, 지정문자 없으면 공백 삭제
RTIM(문자열, 지정문자) 오른쪽에서 지정된 문자 삭제, 지정문자 없으면 공백 삭제
TRIM(문자열, 지정문자) 왼쪽, 오른쪽에서 지정된 문자 삭제, 지정문자 없으면 공백 삭제
LPAD(문자열, 지정길이, 채울문자) ex) LPAD('1', 8, 0) = 00000001 출력

※ Oracle은 length, len함수 모두 사용가능 but MySQL은 length함수만 사용 가능

#문자열 함수 적용
select substr('abc', 1, 2), length('a bc'), ltrim('_abc'),
length(ltrim(' abc'))
from dual;

 

substr, length, ltrim 기능을 사용


<날짜형 함수> - Oracle 기준

날짜형 함수 설명
SYSDATE 오늘의 날짜를 날짜형으로 알려줌
EXTRACT('YEAR'| 'MONTH' | 'DAY' from dual) 날짜에서 년, 월, 일을 조회
#연도, 월, 일 추출하기 - Oracle 기준

select sysdate
, extract(year from sysdate) as "연도"
, extract(month from sysdate) as "월"
, extract(day from sysdate) as "일"
from dual;

#연도, 월, 일 추출하기 - MySQL 기준

select current_timestamp()
, extract(year from current_timestamp()) as "연도"
, extract(month from current_timestamp()) as "월"
, extract(day from current_timestamp()) as "일"
from dual;

여기서 주목할 점은 월이나 일을 출력할 때 앞에 0을 출력하지 않음

※ 날짜와 날짜 연산 가능


<숫자형 함수>

숫자형 함수 설명
ABS(숫자) 절댓값 반환
SIGN(숫자) 양수(1), 음수(-1), 0 반환
MOD(숫자1, 숫자2) 숫자1/숫자2의 나머지 반환
CEIL(숫자) OR CEILING(숫자) 숫자보다 크거나 같은 최소의 정수 반환
FLOOR(숫자) 숫자보다 작거나 같은 최대의 정수 반환
ROUND(숫자, m) 소수점 m자리에서 반올림
TRUNC(숫자, m) 소수점 m자리에서 절삭
#숫자형 함수 적용

select abs(-1), sign(10), mod(4,3), ceil(10.9), floor(10.9), round(10.222, 1)
from dual;

절댓값, 부호, 나머지, ceil, floor, 반올림해서 반환


10절 DECODE문과 CASE문

 

1. DECODE (Oracle 기준)

 

Oracle에서는 DECODE문으로 IF문을 구현 (MySQL에서는 If문 사용)

 

SELECT DECODE(A, B, 값1, 값2) FROM 테이블; -- Oracle

SELECT If(조건, 값1, 값2) from 테이블 -- MySQL

 

A=B이면 값1 출력, A != B이면 값2 출력

#DECODE문 - Oracle

SELECT DECODE(EMPNO, 100, 'TRUE', 'FALSE') AS "100번 사원" FROM EMP;

#MySQL의 Decode문은 If문

select if(empno = 100, 'TRUE', 'FALSE') AS "100번 사원" FROM EMP; #오라클보다 입력값이 하나 적음

empno = 100인 사원 한 명만 true 출력


2. CASE문

 

IF ~ THEN ~ ELSE ~ END와 같은 조건문

 

<구조>

CASE [표현]

WHEN 조건1 THEN 결과1

WHEN 조건2 THEN 결과2

...

WHEN 조건n THEN 결과n

ELSE 결과

END

 

<예시>

#CASE문

SELECT CASE
WHEN EMPNO = 100 THEN 'A' #조건1 : 사원번호가 100번이면 # 결과1: A 출력
WHEN EMPNO = 101 THEN 'B' #조건2 : 사원번호가 101번이면 # 결과2: B 출력
ELSE 'C'                  #조건3 : 나머지의 경우는 # 결과3: C 출력
END
AS "구분"      #칼럼명은 '구분'으로 지정
FROM EMP;

CASE문


11절 ROWNUM과 ROWID

 

1. ROWNUM - (Oracle만 가능)

: Oracle DB의 select문 결과에 대해 논리적인 일련번호를 부여한다.

 

- 조회되는 행 수를 제한할 때 ROWNUM을 많이 사용한다.

- 페이지 단위 출력을 위해서는 INLINE VIEW를 사용한다. (페이지 단위 출력이란게 여러 행 출력을 말하는 듯?)

 

※ INLINE VIEW(인라인 뷰): SELECT문에서 FROM절에 사용되는 SELECT문(서브쿼리)을 말함

#ROWNUM 활용 - Oracle만 사용

SELECT * FROM EMP
WHERE ROWNUM<=1; #그냥 rownum문만 사용하면 하나의 행만 조회할 수 있다고 한다.

#ROWNUUM 인라인뷰로 조회 (rownum을 사용해서 여러 행 조회)

select * from (select rownum list, ename from emp) #from문에 괄호로 select문을 사용한 것을 인라인뷰라고 함
where list <= 5; # 5건을 조회하려면 인라인뷰를 사용해야한다.

MySQL에서는 LIMIT문으로 ROWNUM처럼 조회할 수 있다.

#MySQL에서 ROWNUM활용 -> LIMIT

SELECT * FROM EMP LIMIT 5;


2. ROWID - (Oracle만 가능)

: Oracle DB 내에서 데티어를 구분할 수 있는 유일한 값 (18자리)

 

SELECT ROWID FROM 테이블;


12절. WITH구문

 

- WITH구문은 서브쿼리를 사용해 임시테이블이나 뷰처럼 사용할 수 있는 구문이다.

 

- 서브쿼리 블록에 별칭을 지정할 수 있다.

 

- 옵티마이저는 SQL을 인라인 뷰나 임시테이블로 판단한다.

 

#WITH 구문을 사용해 임시테이블 만들기

WITH viewData AS #viewData라는 이름의 임시테이블을 만듦
(SELECT * FROM EMP
UNION ALL
SELECT * FROM EMP) #서브쿼리로 임시테이블을 만들어줌 (같은 emp테이블을 중복되게 붙여줌)
SELECT * FROM viewData WHERE empno = 100; #viewData라는 임시테이블에서 사번이 100인 사람 조회 => 같은 사람이 두 번 나올 것을 예상할 수 있음

#위와 동일한데 where로 조건 안 한 임시테이블
WITH viewData AS
(SELECT * FROM EMP
UNION ALL
SELECT * FROM EMP)
SELECT * FROM viewData;

이런 결과를 확인할 수 있음


오늘은 DML문의 select문에서 사용가능한 내장형 함수로 문자형/숫자형/날짜형 함수와 DECODE, CASE문, ROWNUM/ROWID와 WITH구문을 알아보았다.

 

내장형 함수와 DECODE문제는 빈출문제이므로 완벽하게 숙지해두고

 

WITH구문, ROWNUM/ROWID는 기출에서 별로 다루지 않아서 우선순위에서는 제외해도 될 것 같다.

 

다음으로는 DCL, TCL문에 대해 공부할 예정이다.