SELECT 'DataBase', LOWER('DataBase')
FROM dual; --데이터베이스에서 제공하는 가상의 테이블
SELECT SUBSTR('abcde', 2, 4)
FROM dual; --bcde
인덱스는 1부터 시작하며,
마지막 매개변수는 문자의 갯수이다.
SELECT SUBSTR(first_name, 4)
FROM employees; --인덱스 4부터 끝까지
SELECT job, SUBSTR(job, -LENGTH(job))
FROM emp;
-를 붙이면 뒤에서 N번째를 의미한다.
SELECT 'Oracle',
LPAD('Oracle', 10, '#'),
RPAD('Oracle', 10, '*')
FROM dual;
SELECT MOD(10, 3) FROM dual;
SELECT ROUND(3243.35543, 2) FROM dual;
음수가 오면 정수 부분이 3200처럼 0으로 채워짐
SELECT SYSDATE -1 --어제
FROM dual; --2021/02/17
SELECT first_name, round((sysdate-hire_date)/365, 1) as "근속년"
FROM employees;
SELECT NEXT_DAY(SYSDATE, '월요일')
FROM dual;
--오늘 날짜를 원하는 형식으로 변환
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;
--숫자를 원하는 형식으로 변환
SELECT TO_CHAR(5000000, '$999,999,999') FROM dual;
SELECT * FROM employees
WHERE TO_CHAR(hire_date, 'YY') = '07';
SELECT TO_DATE('2021-02-18', 'YYYY-MM-DD'),
TO_DATE('20210219', 'YYYY-MM-DD')
FROM dual;
SELECT employee_id, salary, NVL(commission_pct, 0)
FROM employees;
NULL이 있으면 연산이 자유롭지 못하기 때문에 0과 같은 다른 값으로 변경
SELECT job_id, DECODE(job_id, 'SA_MAN', 'Sales Dept',
'SH_CLERK', 'Sales Dept', 'Another')
FROM employees;
job_id 중 'SA_MAN', 'SH_CLERK' 값이면 'Sales Dept'로 변경, 그 외는 'Another'로 변경한다.
SELECT job_id,
CASE job_id
WHEN 'SA_MAN' THEN 'Sales Dept'
WHEN 'SH_CLERK' THEN 'Sales Dept'
ELSE 'Another'
END "CASE"
FROM employees;
위의 DECODE와 같은 기능을 CASE WHEN을 사용하면 위와 같이 표현할 수 있다.
SELECT EMPNO,
RPAD(SUBSTR(EMPNO, 1, 2), 4, '*') AS MASKING_EMPNO,
ENAME,
RPAD(SUBSTR(ENAME, 1, 1), LENGTH(ENAME), '*') AS MASKING_ENAME
FROM EMP
WHERE LENGTH(ENAME) >= 5
AND LENGTH(ENAME) < 6;
SELECT EMPNO, ENAME, TO_CHAR(hiredate, 'YYYY/MM/DD') AS HIREDATE,
TO_CHAR(NEXT_DAY(ADD_MONTHS(HIREDATE, 3), '월요일'), 'YYYY-MM-DD') AS R_JOB,
NVL(TO_CHAR(COMM), 'N/A') AS COMM
FROM EMP;
주의
SELECT EMPNO, ENAME, MGR,
CASE
WHEN MGR IS NULL THEN '0000'
WHEN SUBSTR(MGR, 1, 2) = '78' THEN '8888'
WHEN SUBSTR(MGR, 1, 2) = '77' THEN '7777'
WHEN SUBSTR(MGR, 1, 2) = '76' THEN '6666'
WHEN SUBSTR(MGR, 1, 2) = '75' THEN '5555'
ELSE TO_CHAR(MGR)
END AS CHG_MGR
FROM EMP;
주의
SELECT JOB,
COUNT(*)
FROM EMP
GROUP BY JOB
HAVING COUNT(*) >= 3;
--GROUP BY만 이용
SELECT TO_CHAR(HIREDATE, 'YYYY') AS HIRE_YEAR,
DEPTNO,
COUNT(*) AS CNT
FROM EMP
GROUP BY TO_CHAR(HIREDATE, 'YYYY'), DEPTNO;
--ROLLUP 이용
SELECT TO_CHAR(hiredate, 'YYYY') AS HIRE_YEAR,
DEPTNO,
count(*) AS CNT
FROM EMP
GROUP BY ROLLUP(TO_CHAR(HIREDATE, 'YYYY'), DEPTNO);
주의
위의 두 가지 쿼리는 거의 같지만, GROUP BY ROLLUP의 경우 첫번째 인자로 설정한 열을 기준으로 소계와 모든 그룹의 총계도 내주기 때문에, 필요없는 경우에는 그냥 GROUP BY를 사용한다.
--NVL2 사용
SELECT NVL2(COMM, 'O', 'X') AS EXIST_COMM,
COUNT(*) AS CNT
FROM EMP
GROUP BY NVL2(COMM, 'O', 'X');
--CASE문 사용
SELECT
CASE
WHEN COMM IS NULL THEN 'X'
ELSE 'O'
END "EXIST_COMM"
, COUNT(*)
FROM EMP
GROUP BY
CASE
WHEN COMM IS NULL THEN 'X'
ELSE 'O'
END;
주의
SELECT DEPTNO,
TO_CHAR(HIREDATE, 'YYYY') AS HIRE_YEAR,
COUNT(*) AS CNT,
MAX(SAL) AS MAX_SAL,
SUM(SAL) AS SUM_SAL,
AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY ROLLUP(DEPTNO, TO_CHAR(HIREDATE, 'YYYY'));
소계와 총계가 필요하기 때문에 GROUP BY ROLLUP을 사용해주었다.