과목 Ⅱ. 데이터모델링의 이해
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;
<날짜형 함수> - 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;
※ 날짜와 날짜 연산 가능
<숫자형 함수>
숫자형 함수 | 설명 |
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;
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; #오라클보다 입력값이 하나 적음
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;
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문에 대해 공부할 예정이다.