DUAL 테이블
한 행으로 결과를 출력하기 위한 테이블이다.산술 연산이나 가상 컬럼 등의 값
을 한번만 출력하고 싶을 때 많이 사용한다.오라클에서 [24*60]을 실행해보자.
알 수 없는 명령어라면서 오류 메시지가 뜰 것이다. 그럼 어떻게 해야 할까?
[SELECT 24*60 FROM EMP; ]을 실행해보면 한번만 출력되면 될것이 emp테이블
이 갖고있는 로우의 수 만큼 결과값이 출력된다. 이때 DUAL 테이블을 사용한다.
산술 연산의 결과를 한 줄로 얻기 위해서 오라클에서 제공하는 테이블이다.
-
SQL> SELECT 24*60 FROM DUAL; 그럼 DUAL이라는 테이블은 어떻게 구성이 되어있을까? DESC 명령어를 통해서 알아보자.
-
SQL> DESC DUAL;
-
그럼 DUMMY 컬럼에는 어떤 값이 저장되어 있는 것인가?
SQL> SELECT * FROM DUAL; X라는 값이 들어 있는데 이 X는 아무 의미 없는 값이다. 단 하나의 로우를 구성하고 있을 뿐이다.
-
그럼 DUAL 테이블이 쓰이는 적절한 예는 현재 날짜를 구할때이다.
- 예) 현재 날짜는 구하는 쿼리문
SQL> SELECT SYSDATE FROM DUAL;
문자함수
UPPER 대문자 변환 함수
SQL> SELECT 'Welcome to Oracle' "적용전", UPPER('Welcome to Oracle') "UPPER적용후" FROM DUAL;
LOWER : 소문자 변환 함수
소문자로 변환하는 함수이다.
SQL> SELECT 'Welcome to Oracle' "적용전", LOWER('Welcome to Oracle') "LOWER적용후" FROM DUAL;
INITCAP : 첫글자 대문자, 나머지 소문자 전환
이니셜만 대문자로 변환하는 함수이다.
SQL> SELECT 'WELCOME TO ORACLE' "적용전", INITCAP('WELCOME TO ORACLE') "INITCAP적용후" FROM DUAL;
문자 길이 반환함수
LENGTH 문자의 길이 반환 (한글 1Byte)
LENGTH 는 문자 데이터가 몇개의 문자로 구성되어있는지 길이를 알려준다.
SQL> SELECT LENGTH('Oracle'), LENGTH('오라클') FROM DUAL;
LENGTHB 문자의 길이 반환 (한글 2Byte)
위와는 달리 바이트수를 알려주는 함수
SQL> SELECT LENGTHB('Oracle'), LENGTHB('오라클') FROM DUAL;
문자 조작 함수
CONCAT : 문자의 값을 연결
SUBSTR : 문자를 잘라 추출(한글 1Byte)
SUBSTRB :문자를 잘라 추출(한글 2Byte)
INSTR : 특정문자의 위치 값을 반환 (한글 1Byte)
INSTRB : 특정문자의 위치 값을 반환(한글 2Byte)
LPAD,RPAD : 입력받은 문자열과 기호를 정렬하여 특정길이의 문자열로 반환한다.
TRIM : 잘라내고 남은 문자를 표시한다.
ABS : 절대값 반환
예) -10에 대한 절대값을 구하는 쿼리문
SQL> SELECT -10, ABS(-10) FROM DUAL;
FLOOT : 소수점 아래를 자름
예) 34.5432를 FLOOR 함수에 적용하는 쿼리문
SQL> SELECT 34.5432, FLOOR(34.5432) FROM DUAL;
ROUND : 특정 자릿수에서 반올림
예) 34.5678을 반올림하는 쿼리문
SQL> SELECT 34.5678, ROUND(34.5678) FROM DUAL;
-
예) 특정 자릿수에서 34.5678을 반올림하는 쿼리문
SQL> SELECT 34.5678, ROUND(34.5678, 2) FROM DUAL;
-
특정 자릿수가 음수일 경우 일단위→십단위→백단위 순으로 반올림 한다.
- 예) 특정 자릿수가 음수일 경우 34.5678을 반올림하는 쿼리문
SQL> SELECT 34.5678, ROUND(34.5678, -1) FROM DUAL;
TRUNC : 특정 자릿수에서 자름
- 두번째 인자값이 2인 경우 : 소수점 이하 세번째 자리에서 버림 연산을 수행한다.
- 두번째 인자값이 0인 경우 : 소수점 자리에서 버림 연산을 수행한다.
- 두번째 인자값이 -1인 경우 : 일의 자리에서 버림 연산을 수행한다.
- 두번째 인자값이 없는 경우 : 소수점 자리에서 버림 연산을 수행한다.
SQL> SELECT TRUNC(34.5678, 2), TRUNC(34.5678, -1), TRUNC(34.5678), TRUNC(34.5678, 0) FROM DUAL;
MOD 입력받은 수를 나눈 나머지 값을 반환
나누기 연산을 한 후 나머지를 결과로 되돌려주는 함수이다.
SQL> SELECT MOD(27, 2), MOD(27, 5), MOD(27, 7) FROM DUAL;
날짜 함수
기본적으로 DATE형에 사용하는 함수 결과값으로 날짜, 기간이 나온다,.
SYSDATE
시스템에 저장된 현재 날짜를 반환
- 현재 날짜를 반환하는 함수이다.
- 시스템에서 현재 날짜를 읽어 와서 출력하는 쿼리문
SQL> SELECT SYSDATE FROM DUAL;
- 날짜 연산
- 날짜 + 숫자 : 그 날짜로부터 그 기간만큼 지난 날짜를 계산한다.
- 날짜 - 숫자 : 그 날짜로부터 그 기간만큼 이전 날짜를 구한다.
- 날짜 - 날짜 : 두 날짜 사이의 기간을 계산한다.
- SYSDATE + 1은 내일의 날짜를 구한다.
- SYSDATE - 1은 어제 날짜를 구한다.
SQL> SELECT SYSDATE-1 어제, SYSDATE 오늘, SYSDATE+1 내일 FROM DUAL;
MONTHS_BETWEEN
날짜와 날짜 사이의 개월수를 구하는 함수
- 두 날짜 사이의 개월수를 구하는 함수이다.
- 예) 각 직원들이 근무한 개월 수를 수하는 쿼리문
SQL> SELECT ENAME, SYSDATE, HIREDATE, MONTHS_BETWEEN(SYSDATE, HIREDATE) 근무개월수 FROM EMP; 소수점 이하 자리가 있다는 뜻은 아직 한 달이 되지 않았기 때문이다. 이때 사용할 수 있는 함수가 숫자함수에서 배웠던 ROUND 또는 TRUNC 함수이다. SQL> SELECT ENAME, SYSDATE, HIREDATE, TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) 근무개월수 FROM EMP;
ADD_MONTHS
특정 개월수를 더한 날짜를 구하는 함수
- 예) 입사 날짜에서 4개월을 추가한 결과값을 나타내는 쿼리문
SQL> SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE, 4) FROM EMP;
NEXT_DAY
지정요일에 해당되는 날짜를 반환하는데 해당 날짜를 기준으로 가장 빨리 다가오는 날짜를 반환.
예) 오늘을 기준으로 가장 가까운 다음 수요일은 언제인지 알아보는 쿼리문
SQL> SELECT SYSDATE, NEXT_DAY(SYSDATE, '수요일') FROM DUAL; 두번째 인자값이 한글일 경우는 일, 월, 화, 수, 목 등으로 표시하고, 영문판인 경우는 SUN, MON, TUE 등으로 표시한다. 문자대신 요일을 숫자로 표현하는 경우는 일요일은 7, 월요일은 1, 화요일은 2 식으로 1부터 7까지의 숫자만 표현 가능하다. 만약 두번째 인자값에 '금'이라 작성했는데 오류가 날 경우는 [ALTER SESSION SETNLS_LANGUAGE=Korean;]의 명령문을 실행한다.
LAST_DAY
해당 날짜가 속한 달의 마지막 날짜를 반환
예) 입사한 달의 마지막 날을 구하는 쿼리문
SQL> SELECT HIREDATE, LAST_DAY(HIREDATE) FROM EMP;
변환함수
숫자, 문자, 날짜의 데이터형을 다른 데이터형으로 변환하는 함수이다. 함수를 보기 전에 출력 형식의 종류부터 알아보자.
TO_CHAR
숫자, 날짜 형태의 데이터를 문자형으로 변환하는 함수
- 예) 현재 날짜를 문자형으로 변환하여 출력하는 쿼리문
SQL> SELECT SYSDATE, TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
- 예) 사원들의 입사일을 출력하되, 요일까지 함께 출력하는 쿼리문
SQL> SELECT HIREDATE, TO_CHAR(HIREDATE, 'YYYY/MM/DD DAY') FROM EMP;
- 예) 현재 날짜와 시간을 출력하는 쿼리문
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS') FROM DUAL;
- 각 지역별 통화 기호를 앞에 붙이고 천 단위마다 콤마를 붙여서 출력하는 쿼리문(예: ₩1,230,000)
SQL> SELECT ENAME, SAL, TO_CHAR(SAL, 'L999,999') FROM EMP;
- 자릿수가 맞지 않을 경우 0은 0으로 채우고 9는 채우지 않는다.
SQL> SELECT TO_CHAR(123456, '000000000'), TO_CHAR(123456, '999,999,999') FROM DUAL;
TO_DATE
숫자형, 문자형 데이터를 날짜형으로 변환하는 함수
날짜형은 세기, 연도, 월, 일, 시간, 분, 초와 같은 날짜와 시간에 대한 정보를 저장한다.
기본 날짜 형식은 'YY/MM/DD' 형식으로 '년/월/일'을 나타낸다.
1981년 2월 20일에 입사한 사원을 검색하는 쿼리문[SELECT ENAME, HIREDATE FROM EMP WHERE HIREDATE=19810220;] 쿼리문을 실행하면 오류가 발생한다.
그 이유는 입사일 컬럼의 데이터 형은 DATE이므로 WHERE절에 숫자형으로 기술하면 데이터형이 일치하지 않기 때문에 요류가 발생한다.
오류가 발생하지 않게 하려면, 비교할 두 데이터의 자료 형태를 맞추어야 한다.
SQL> SELECT ENAME, HIREDATE FROM EMP WHERE HIREDATE=TO_DATE(19810220, 'YYYYMMDD');
- 올해 며칠이 지났는지 현재 날짜에서 2016/01/01을 뺀 결과를 출력하는 쿼리문
SQL> SELECT TRUNC(SYSDATE-TO_DATE('2016/01/01', 'YYYY/MM/DD')) FROM DUAL;
TO_NUMBER
특정 데이터를 숫자형으로 변환해 주는 함수
예) '20,000'과 '10,000'의 차이를 알아보기 위해서 빼기(-)연산을 구하는 쿼리문
[SELECT '20,000'-'10,000' FROM DUAL;]을 실행하면 오류가 발생한다.
그 이유는 '10,000'과'20,000'은 문자형이기 때문에 산술 연산을 수행하지 못하기 때문이다.
따라서 산술 연산을 하려면 문자형을 숫자형으로 변환한 다음에 연산을 실행해야 한다.
SQL> SELECT TO_NUMBER('20,000', '99,999')-TO_NUMBER('10,000', '99,999') FROM DUAL;
일반함수
NVL
NULL값을 0혹은 다른 값으로 변환하기 위한 함수
예) 연봉 계산을 하는 쿼리문
SQL> SELECT ENAME, SAL, COMM, JOB FROM EMP ORDER BY JOB; 여기서 영엽사원이 아닌 사원들의 커미션은 NULL로 지정이 되어 있기 때문에 연봉을 구하는 산술 연산을 수행할 시 결과가 NULL값이 되기 때문에 연봉 계산이 제대로 되지 않는다. 고로 NULL인 커미션은 NVL함수를 통해 0으로 변환해야 한다. SQL> SELECT ENAME, SAL, COMM, SAL12+COMM, NVL(COMM, 0), SAL12+NVL(COMM, 0) FROM EMP ORDER BY JOB;
DECODE
switch case와 같은 기능을 가진 함수 여러가지 경우에 대해 선택할수 있도록 한다.
예) 사원의 부서 번호를 이름으로 설정하는 쿼리문
SQL> SELECT DEPTNO FROM EMP ORDER BY DEPTNO;
SQL> SELECT DEPTNO, DECODE(DEPTNO, 10, 'A', 20, 'B', 'DEFAULT') FROM EMP ORDER BY DEPTNO; 위의 부서번호를 이름으로 나타내는 부분이 함수로 되어 있어 이것을 DNAME로 바꿔 보자
SQL> SELECT ENAME, DEPTNO, DECODE(DEPTNO, 10, 'ACCOUNTING', 20, 'RESEARCH', 30, 'SALES', 40, 'OPERATIONS') AS DNAME FROM EMP;
CASE
여러가지 경우에따라 하나를 선택하는 함수, DECODE함수는 조건이 일치 하는 경우에만 적용되지만 CASE는 다양한 비교연산자를 사용할수있으므로 조건을 다양하게 지정가능하다.
- DECODE 함수는 조건이 일지(=비교 연산자)하는 경우에 대해서만 적용하지만 CASE 함수는 다양한 비교 연산자를 이용하여 조건 제시 및 범위 지정할 수 있다는 점이 이 둘의 차이점이다.
- '중첩 'IF ELSE'와 유사한 구조이다.
- 예) 부서 번호에 해당하는 부서명을 구하는 쿼리문
SQL> SELECT ENAME, DEPTNO, CASE WHEN DEPTNO=10 THEN 'ACCOUNTING' WHEN DEPTNO=20 THEN 'RESEARCH' WHEN DEPTNO=30 THEN 'SALES' WHEN DEPTNO=40 THEN 'OPERATIONS' END AS ENAME FROM EMP;
'Oracle' 카테고리의 다른 글
PL / SQL (0) | 2018.04.23 |
---|---|
파티션 테이블 (0) | 2018.04.23 |
5.SQL*PLUS명령어 (0) | 2018.04.22 |
4.데이터 구축을 위한 구문들 (0) | 2018.04.22 |
3.SQL로그인, 데이터 타입 (0) | 2018.04.22 |