📌 문자함수 - 대/소문자 변환
-- 1) 문자 함수
-- 사용법) 대문자변환 : UPPER('문자열') -- 문자열 대신 컬럼명도 올 수 있음
-- 소문자변환 : LOWER('문자열')
-- 첫글자만대문자 : INITCAP('문자열')
-- 원본을 조작하지 않음(화면에만 임시로 바뀜)
SELECT 'Oracle mania'
,UPPER('Oracle mania') AS "대문자"
,LOWER('Oracle mania') AS "소문자"
,INITCAP('Oracle mania') AS "첫 글자만 대문자"
FROM DUAL;
-- 연습 1) 사원테이블에서 사원명(ENAME)을 소문자로 출력하고,
-- 직위(JOB)은 첫글자만 대문자로 출력하세요
SELECT LOWER(ENAME),
INITCAP(JOB)
FROM EMPLOYEE;
-- 연습 2) SCOTT 사원을 조회해서 사원번호(ENO), 사원명(ENAME), 부서번호(DNO) 출력하기
-- 단, SCOTT 이 대소문자 구분없이 비교된다고 가정하고 작성하세요
SELECT ENO, ENAME, DNO FROM EMPLOYEE
WHERE ENAME = UPPER('scott');
📌 문자함수 - 문자열 길이 리턴 함수
-- 1-2) 문자 길이를 RETURN 하는 함수
-- LENGTH(문자열) : 한글/영어 상관없이 문자개수를 세어서 RETRUN 하는 함수
-- 코딩 언어셋 : 영어 표현(1BYTE), 한글표현(3BYTE) [UTF-8 표현식(국제표준)]
SELECT LENGTH('Oracle mania')
,LENGTH('오라클매니아')
FROM DUAL;
-- 1-3) 문자 조작함수 : 문자열 붙이기
-- 함수 : CONCAT('문자열 1','문자열 2')
-- 기호 : '문자열1'||'문자열2'
SELECT 'Oracle'
,'mania'
,CONCAT('Oracle','mania')
,'Oracle'||'mania'
FROM DUAL;
📌 문자함수 - 문자열 자르기, 붙이기, 공백제거
-- 1-4) 문자 조작함수 : 문자열 자르기
-- SQL : 인덱스번호 1부터 시작
-- 사용법) SUBSTR('대상컬럼',시작위치,자를개수)
-- 단, 시작위치가 음수이면 뒤에서 셈
SELECT SUBSTR('Oracle mania',4,3)
,SUBSTR('Oracle mania',-1,1)
FROM DUAL;
-- 예제 3) 이름이 N으로 끝나는 사원 화면에 출력하기
-- SUBSTR 함수 사용
-- SQL 성능이 좋게 작성하는 것이 어려움
-- WHERE 왼편(함수 사용) = 오른쪽값 ==> 성능이 대폭 저하
-- WHERE 절 오른쪽값에 함수를 쓰는 것이 성능에 좋음
SELECT * FROM EMPLOYEE
WHERE SUBSTR(ENAME, -1, 1) = 'N';
-- 1-5) 문자열에서 대상 문자를 찾아서 인덱스번호를 RETURN 함수
-- SQL의 인덱스번호는 1부터 시작함
-- 사용법)
SELECT INSTR('Oracle maina','a')
,INSTR('오라클매니아','라')
FROM DUAL;
-- 1-6) 컬럼에 어떤 문자를 붙이기 함수 : LPAD, RPAD
-- LPAD 함수 : 어떤 문자를 왼쪽에 채우기 함수
-- 사용법 : LPAD(대상컬럼, 자리수, 채울문자)
-- 자리수에서 빈칸은 채울문자로 채워짐(왼쪽)
SELECT LPAD(SALARY, 10, '*')
FROM EMPLOYEE;
-- RPAD 함수
SELECT RPAD(SALARY, 10, '*')
FROM EMPLOYEE;
-- 1-7) 문자열에서 공백제거 함수 LTRIM, RTRIM, TRIM(*)
-- 사용법) LTRIM(컬럼명) : 왼쪽 공백제거
-- RTRIM(컬럼명) : 오른쪽 공백제거
-- TRIM(컬럼명) : 양쪽 공백제거
SELECT 'Oracle mania'
,LTRIM(' Oracle mania ')
,RTRIM(' Oracle mania ')
,TRIM(' Oracle mania ')
FROM DUAL;
📌 숫자함수 - 반올림, 버림, 나머지 연산
-- 1) 반올림 : ROUND()
-- 사용법) ROUND(대상컬럼, 자리수)
-- 참고) 자리수가 음수일 경우 일의 자리부터 반올림이 됨
SELECT 98.7654
,ROUND(98.7654) -- 0 자리에서 반올림
,ROUND(98.7654, 2) -- 2nd 자리에서 반올림
,ROUND(98.7654, 1) -- 1st 자리에서 반올림
,ROUND(98.7654, -1) -- 1의 자리에서 반올림
FROM DUAL;
-- 2) 버림, 내림 : TRUNC(), 특정자리수에 버림
SELECT 98.7654
,TRUNC(98.7654) -- 소수점 첫번째 자리에서 버림
,TRUNC(98.7654, 2) -- 소수점 두번째 이하 버림
,TRUNC(98.7654, -1) -- 1의 자리에서 버림
FROM DUAL;
-- 3) MOD : 나머지 연산 함수 ( == % : 나머지 연산자(JS))
-- 사용법) MOD(대상컬럼, 나눌숫자) : 결과 나머지가 RETURN 됨
SELECT MOD(31, 2)
,MOD(31, 5)
,MOD(31, 8)
FROM DUAL;
-- 연습 1) 모든 사원의 급여를 각각 500으로 나눈 나머지를 계산해서 출력하세요
SELECT MOD(SALARY, 500)
FROM EMPLOYEE;
📌 날짜함수
-- 날짜 함수
-- 1) SYSDATE : 시스템에 저장된 현재 날짜를 RETURN 하는 함수(*****)
-- DB의 자료형 : 문자열(VARCHAR2 형, CHAR 형), 숫자(NUMBER 형), 날짜(DATE 형)
-- 단, 오라클 기준
SELECT SYSDATE FROM DUAL;
-- 예제 1) 오늘, 어제 내일 날짜를 출력해보세요
SELECT SYSDATE - 1 AS 어제
,SYSDATE AS 오늘
,SYSDATE + 1 AS 내일
FROM DUAL;
-- 예제 2) 근무일수 계산하기
-- 공식 : 현재시간 - 입사일 : 근무일수
SELECT ROUND(SYSDATE - HIREDATE) AS 근무일수
FROM EMPLOYEE;
-- 2) MONTHS_BETWEEN(현재날짜, 과거날짜) : 두 날짜 사이의 개월수 리턴
-- 각 사원들이 근무한 개월 수 구하기
SELECT ENAME, SYSDATE, HIREDATE
,TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) AS 개월수
FROM EMPLOYEE;
-- 3) ADD_MONTHS(날짜컬럼, 숫자)
-- 예제 4) 입사일에서 6개월이 지난 날짜 구하기
SELECT ENAME, HIREDATE,
ADD_MONTHS(HIREDATE, 6) AS 개월수더하기
FROM EMPLOYEE;
-- 4) NEXT_DAY(날짜컬럼, '요일')
-- 날짜컬럼에서 최초로 도래하는 요일의 날짜를 RETURN 함수
-- 예제 5) 오늘을 기준으로 최초로 도래하는 토요일의 날짜 구하기
SELECT SYSDATE
,NEXT_DAY(SYSDATE, '토요일')
FROM DUAL;
-- 5) LAST_DAY(날짜 컬럼)
-- 날짜컬럼의 그 달(월)의 마지막 날의 날짜를 구해주는 함수
-- 예제 6) 입사한 날의 그 달의 마지막 날 구하기
SELECT ENAME, HIREDATE,
LAST_DAY(HIREDATE)
FROM EMPLOYEE;
📌 자료형 변환함수
-- DB 자료형 : 문자열(VARCHAR2(가변문자열), CHAR(고정문자열))
-- 숫자(NUMBER, 실수, 정수)
-- 날짜형(DATE)
-- 1) TO_CHAR : 날짜 -> 문자열로 바꾸는 함수
-- 사원 : EMPLOYEE
-- 날짜컬럼 : HIREDATE(입사일)
-- 사용법 ) TO_CHAR(컬럼명, '날짜포멧')
-- 날짜포멧 :
-- YYYY(년도(4자리)), YY(2자리) [YEAR]
-- MM(월(2자리)) [MONTH]
-- DD(일(2자리)) [DAY]
-- DAY(요일) [요일]
-- HH(1~12까지의 시간) [HOUR]
-- HH24(1~24까지의 시간)
-- MI(분(2자리)) [MINUTES]
-- SS(초(2자리)) [SECOND]
SELECT ENAME, HIREDATE,
TO_CHAR(HIREDATE, 'YY-MM') AS 단축날짜,
TO_CHAR(HIREDATE, 'YYYY-MM-DD HH24:MI:SS') AS 날짜
FROM EMPLOYEE;
-- 연습 1) 현재 날짜와 시간을 표현하세요
SELECT SYSDATE,
TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS') AS 현재날짜
FROM DUAL;
-- 2) TO_CHAR : 숫자 -> 문자로 변환
-- 사용법) TO_CHAR(숫자컬럼, '숫자포맷')
-- 예제 2) 급여를 출력하면서 통화기호를 (W, $ 등) 포함해서 출력하세요
-- 숫자포맷 : L - 각 나라별 통화 기호를 자동으로 붙여줌(W, $ 등)
-- 9 - 3자리를 잡고 자리수가 모자라도 따로 0을 채워주지 않음
-- 0 - 3자리를 잡고 자리수가 모자라면 0을 채워줌
-- , - 각 통화의 중간에 쉼표(,)를 자동으로 추가해줌
SELECT ENAME, SALARY,
TO_CHAR(SALARY, 'L999,999'),
TO_CHAR(SALARY, 'L000,000')
FROM EMPLOYEE;