1. 문자 함수 1-1) CHR 1-2) CONCAT 함수 1-3) INITCAP 함수 1-4) LOWER 함수 1-5) LPAD 함수 1-6) LTRIM 함수 1-7) NLS_INITCAP 함수 1-8) NLS_LOWER 함수 1-9) NLSSORT 함수 1-10) NLS_UPPER 함수 1-11) REPLACE 함수 1-12) RPAD 함수 1-13) RTRIM 함수 1-14) SOUNDEX 함수 1-15) SUBSTR 함수 1-16) TRANSLATE 함수 1-17) TREAT 함수 1-18) TRIM 함수 1-19) UPPER 함수 1-20) ASCII 함수 1-21) INSTR 함수 1-22) LENGTH 함수
2. 날짜 처리함수(datetime function) 2-1) ADD_MONTHS 함수 2-2) CURRENT_DATE 함수 2-3) URRENT_TIMESTAMP 함수 2-4) DBTIMEZONE 함수 2-5) EXTRACT(datetime) 함수 2-6) FROM_TZ 함수 2-7) LAST_DAY 함수 2-8) LOCALTIMESTAMP 함수 2-9) MONTHS_BETWEEN 함수 2-10) NEW_TIME 함수 2-11) NEXT_DAY 함수 2-12) NUMTODSINTERVAL 함수 2-13) NUMTOYMINTERVAL 함수 2-14) ROUND(date) 함수 2-15) SESSIONTIMEZONE 함수 2-16) SYS_EXTRACT_UTC 함수 2-17) SYSDATE 함수 2-18) SYSTIMESTAMP 함수 2-19) TO_DSINTERVAL 함수 2-20) TO_TIMESTAMP 함수 2-21) TO_TIMESTAMP_TZ 함수 2-22) TO_YMINTERVAL 함수 2-23) TRUNC(date) 함수 2-24) TZ_OFFSET 함수
3.데이터 형 변환 함수(conversion function) 3-1) ASCIISTR 함수 3-2) BIN_TO_NUM 함수 3-3) CAST 함수 3-4) CHARTOROWID 함수 3-5) COMPOSE 함수 3-6) CONVERT 함수 3-7) HEXTORAW 함수 3-8) NUMTODSINTERVAL 함수 3-9) NUMTOYMINTERVAL 함수 3-10) RAWTOHEX 함수 3-11) RAWTONHEX 함수 3-12) ROWIDTOCHAR 함수 3-13) ROWIDTONCHAR 함수 3-14) TO_CHAR(character) 함수 3-15) TO_CLOB 함수 3-16) TO_DSINTERVAL 함수 3-17) TO_LOB 함수 3-18) TO_MULTI_BYTE 함수 3-19) TO_NCHAR(character) 함수 3-20) TO_NCHAR(datetime) 함수 3-21) TO_NCHAR(number) 함수 3-22) TO_NCLOB 함수 3-23) TO_NUMBER 함수 3-24) TO_SINGLE_BYTE 함수 3-25) TO_YMINTERVAL 함수 3-26) TRANSLATE ... USING 함수 3-27) UNISTR 함수
4. 기타함수(miscellaneous single row function) 4-1) BFILENAME 함수 4-2) COALESCE 함수 4-3) DECODE 함수 4-4) DEPTH 함수 4-5) DUMP 함수 4-6) EMPTY_BLOB 함수 4-7) EMPTY_CLOB 함수 4-8) EXISTSNODE 함수 4-9) EXTRACT(XML) 함수 4-10) EXTRACTVALUE 함수 4-11) GREATEST 함수 4-12) LEAST 함수 4-13) NLS_CHARSET_DECL_LEN 함수 4-14) NLS_CHARSET_ID 함수 4-15) NLS_CHARSET_NAME 함수 4-16) NULLIF 함수 4-17) NVL2 함수 4-18) PATH 함수 4-19) SYS_CONNECT_BY_PATH 함수 4-20) SYS_CONTEXT 함수 4-21) SYS_DBURIGEN 함수 4-22) SYS_EXTRACT_UTC 함수 4-23) SYS_GUID 함수 4-24) SYS_XMLAGG 함수 4-25) SYS_XMLGEN 함수 4-26) UID 함수 4-27) USER 함수 4-28) USERENV 함수 4-29) VSIZE 함수 4-30) XMLAGG 함수 4-31) XMLCOLATTVAL 함수 4-32) XMLCONCAT 함수 4-33) XMLFOREST 함수 4-34) XMLELEMENT 함수
5.그룹함수 Aggregate 함수 5-1) AVG* 함수 5-2) CORR* CORR* 함수 5-3) COUNT* 함수 5-4) COVAR_POP 함수 5-5) COVAR_SAMP 함수 5-6) CUME_DIST 함수 5-7) DENSE_RANK 함수 5-8) FIRST 함수 5-9) GROUP_ID 함수 5-10) Grouping 함수 5-11) GROUPING_ID 함수 5-12) LAST 함수 5-13) MAX 함수 5-14) MIN 함수 5-15) PERCENTILE_CONT 함수 5-16) PERCENTILE_DISC 함수 5-17) PERCENT_RANK 함수 5-18) RANK 함수 5-19) REGR_(linear regression) function* 함수 5-20) STDDEV 함수 5-21) STDDEV_POP 함수 5-22) STDDEV_SAMP 함수 5-23) SUM 함수 5-24) VAR_POP 함수 5-25) VAR_SAMP 함수 5-26) VARIANCE 함수 5-27) Grouping sets 함수
6. Analytic 함수 6-1) AVG* 함수 6-2) CORR* CORR* 함수 6-3) COUNT* 함수 6-4) COVAR_SAMP 함수 6-5) CUME_DIST 함수 6-6) DENSE_RANK 함수 6-7) FIRST 함수 6-8) FIRST_VALUE 함수 6-9) LAG 함수 6-10) LAST_VALUE 함수 6-11) LEAD 함수 6-12) NTILE 함수 6-13) RATIO_TO_REPORT 함수 6-14) ROW_NUMBER 함수
7. 객체 참조 함수 7-1) REF 타입
8. PseudoColumn을 의미하는 것 8-1) ROWID 컬럼 8-2) ROWNUM 컬럼
1-1) CHR 함수 --------------------------------------------------------------------------------
입력된 수의 바이너리 코드에 해당하는 문자를 반환한다.
【예제】 SQL> select chr(75)||chr(79)||chr(82)||chr(69)||chr(65) 2 from dual;
CHR(7 ----- KOREA
SQL>
1-2) CONCAT 함수 --------------------------------------------------------------------------------
입력되는 두 문자열을 연결하여 반환한다. 입력되는 두 문자열의 타입이 다를 경우 다음과 같이 반환된다.
첫 번째 문자열 타입 두 번째 문자열 타입 반환되는 문자열 타입 CLOB NCLOB NCLOB NCLOB NCHAR NCLOB NCLOB CHAR NCLOB NCHAR CLOB NCLOB
【예제】 SQL> select concat('Republic of',' KOREA') from dual;
CONCAT('REPUBLICO ----------------- Republic of KOREA
SQL>
1-3) INITCAP 함수 --------------------------------------------------------------------------------
initcap('string‘) 함수는 입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다
【예제】 SQL> select initcap('beautiful corea') from dual;
INITCAP('BEAUTI --------------- Beautiful Corea
SQL>
1-4) LOWER 함수 --------------------------------------------------------------------------------
lower(string) 함수는 입력된 문자열을 소문자로 반환한다.
【예제】 SQL> select lower('Beautiful COREA') from dual;
LOWER('BEAUTIFU --------------- beautiful corea
SQL>
1-5) LPAD 함수 --------------------------------------------------------------------------------
lpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고 남은 공간은 왼쪽부터 char2로 채워서 출력한다.
【형식】 lpad (char1, n [, char2] )
【예제】 SQL> select lpad ('Corea', 12, '*') from dual;
LPAD('COREA' ------------ *******Corea
SQL>
1-6) LTRIM 함수 --------------------------------------------------------------------------------
LTRIM(문자열, 문자)함수는 문자열중 좌측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.
【형식】 ltrim(char [,set] )
【예제】 SQL> select LTRIM('xyxXxyLAST WORD','xy') from dual;
LTRIM('XYXXX ------------ XxyLAST WORD
SQL>
1-7) NLS_INITCAP 함수 --------------------------------------------------------------------------------
nls_initcap(‘string’) 함수는 입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_initcap ( char [,'nlsparam'] )
【예제】 SQL> select nls_initcap('beautiful corea', 'nls_sort=binary') 2 from dual;
NLS_INITCAP('BE --------------- Beautiful Corea
SQL> select nls_initcap('beautiful corea','nls_sort=XDutch') 2 from dual;
NLS_INITCAP('BE --------------- Beautiful Corea
SQL>
1-8) NLS_LOWER 함수 --------------------------------------------------------------------------------
nls_lower(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_lower ( char [,'nlsparam'] )
【예제】 SQL> select nls_lower('CITTA''','nls_sort=XGerman') from dual;
NLS_LO ------ citta'
SQL>
1-9) NLSSORT 함수 --------------------------------------------------------------------------------
nlssort(‘string’) 함수는 입력 문자열을 소팅하여 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nlssort ( char [,'nlsparam'] )
【예제】 SQL> select * from emp 2 order by nlssort(name, 'nls_sort=XDanish');
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1104 jijoe 220 100 1103 kim 250 100
SQL>
1-10) NLS_UPPER 함수 --------------------------------------------------------------------------------
nls_upper(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다. nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며, 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.
【형식】 nls_upper ( char [,'nlsparam'] )
【예제】 SQL> select nls_upper('gro?e') from dual;
NLS_U ----- gro?e
SQL> select nls_upper('gro?e','nls_sort=XGerman') 2 from dual;
NLS_UP ------ grosse
SQL>
1-11) REPLACE 함수 --------------------------------------------------------------------------------
이 함수는 문자열에서 지정한 문자를 다른 문자로 치환한다. 치환될 문자를 지정하지 않으면 해당 문자를 삭제한다.
【예제】 SQL> select replace('aaabb','a','b') from dual;
REPLA ----- bbbbb
SQL> select replace('aaabb','a') from dual;
RE -- bb
SQL>
1-12) RPAD 함수 --------------------------------------------------------------------------------
rpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고 남은 공간은 오른쪽부터 char2로 채워서 출력한다.
【형식】 rpad (char1, n [, char2] )
【예제】 SQL> select rpad('Corea',12,'*') from dual;
RPAD('COREA' ------------ Corea*******
SQL>
1-13) RTRIM 함수 --------------------------------------------------------------------------------
RTRIM(문자열, 문자)함수는 문자열중 우측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.
【형식】 rtrim(char [,set] )
【예제】 SQL> select RTRIM('BROWINGyxXxy','xy') "RTRIM example" from dual;
RTRIM exam ---------- BROWINGyxX
SQL>
1-14) SOUNDEX 함수 --------------------------------------------------------------------------------
soundex(‘char’) 함수는 char과 같은 발음의 이름을 표현한다.
【예제】 SQL> select name from emp;
NAME ---------- Cho Joe kim jijoe
SQL> select name from emp 2 where soundex(name) = soundex('jo');
NAME ---------- Joe
SQL>
1-15) SUBSTR 함수 --------------------------------------------------------------------------------
substr(str,m,n) 함수는 문자열 str 중에서 특정 위치 m으로부터 특정 길이n 만큼의 문자를 출력한다. m이 0이나 1이면 문자열의 첫글자를 의미하고, n이 생략되면 문자열의 끝까지를 의미한다. m이 음수이면 뒤쪽으로부터의 위치를 의미한다.
SUBSTRB는 character 대신 byte를 사용하고, SUBSTDC는 unicode를 사용하며, SUBSTR2는 UCS2 codepoint를 사용하고, SUBSTR4는 UCS4 codepoint를 사용한다.
【형식】 {SUBSTR|SUBSTRB|SUBSTRC|SUNBSTD2|SUBSTR4} ( string, position [,substring_length] )
【예제】 SQL> select substr('abcdesfg', 3,2) from dual;
SU -- cd
SQL> select substr('abcdefg',3) from dual;
SUBST ----- cdefg
SQL> select substr('abcdefg', -3,2) from dual; ☜ 뒤에서 3번째부터 2글자를 의미한다. SU -- ef
SQL>
1-16) TRANSLATE 함수 --------------------------------------------------------------------------------
TRANSLATE (‘char’,‘from_string’,‘to_string’) 함수는 char 내에 포함된 문자중 from_string에 지정한 모든 각각의 문자를 to_string문자로 각각 변경한다.
【형식】 TRANSLATE ('char','from_string','to_string')
【예제】 SQL> select translate('ababccc','c','d') from dual;
TRANSLA ------- ababddd
SQL> select translate('2KRW229', 2 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 3 '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') from dual;
TRANSLA ------- 9XXX999
SQL> select translate('2KRW229', 2 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789') 3 from dual;
TRAN ---- 2229
SQL>
1-17) TREAT 함수 --------------------------------------------------------------------------------
TREAT 함수는 선언된 타입을 변경함으로써, 수퍼타입을 서브타입인 것처럼 처리할 수 있도록 한다.
【형식】 TREAT ( expr AS [ REF] [schema . ] type )
【예제】 SQL> select x.p.empno from person_table p; select x.p.empno from person_table p * ERROR at line 1: ORA-00904: "X"."P"."EMPNO": invalid identifier SQL> select treat(x.p as employee).empno empno, 2 x.p.last_name last_name 3 from person_table x; EMPNO LAST_NAME ---------- -------------------- Seoul 1234 Inchon 5678 Arirang SQL>
【예제】 SQL> select name, TREAT(VALUE(p) AS employee_t).salary salary 2 FROM person p;
NAME SALARY ---------------------- --------- Bob Joe 100000 Tim 1000
SQL>
1-18) TRIM 함수 --------------------------------------------------------------------------------
이 함수는 LTRIM과 RTRIM 함수를 결합한 형태로 문자값의 왼쪽 또는 오른쪽 부분에 정의한 문자를 절삭하여 출력한다. LEADING은 LTRIM처럼 문자열 왼쪽의 문자를 지정하여 절삭하고, TRAILING은 RTRIM처럼 문자열 오른쪽 문자를 지정하여 절삭한다. BOTH는 왼쪽과 오른쪽 문자를 지정하여 절삭한다.
【형식】 TRIM ([{{{LEADING|TRAILING|BOTH} [trim_char] } | trim_char} FROM] trim_source )
【예제】 SQL> select trim (0 from 000123400) from dual;
TRIM ---- 1234
SQL> select trim(trailing 'a' from 'abca') from dual;
TRI --- abc
SQL> select trim(leading 'a' from 'abca') from dual;
TRI --- bca
SQL> select trim(both 'a' from 'abca') from dual;
TR -- bc
SQL>
1-19) UPPER 함수 --------------------------------------------------------------------------------
upper(string) 함수는 입력된 문자열을 대문자로 반환한다.
【예제】 SQL> select upper('Beautiful COREA') from dual;
UPPER('BEAUTIFU --------------- BEAUTIFUL COREA
SQL>
1-20) ASCII 함수 --------------------------------------------------------------------------------
ASCII ascii(‘char’) 함수는 주어진 char의 첫 글자의 아스키 값을 반환한다. char의 타입은 char, varchar2, nchar, nvarchar2중의 하나이어야 한다.
【예제】 SQL> select ascii('Korea') from dual;
ASCII('KOREA') -------------- 75
SQL> select ascii('K') from dual;
ASCII('K') ---------- 75
SQL>
1-21) INSTR 함수 --------------------------------------------------------------------------------
이 함수는 문자 스트링 중에서 지정한 문자가 가장 처음 나타나는 위치를 숫자로 출력한다.
【형식】 {INSTR|INSTRB|INSTRC|INSTR2|INSTR4} ( string, substring [, position [,occurrence] ] )
【예제】 SQL> select instr('Corea','e') from dual;
INSTR('COREA','E') ------------------ 4
SQL> select instr('corporate floor','or',3,2) from dual;
1-22) LENGTH 함수 --------------------------------------------------------------------------------
LENGTH(char) 함수는 char의 길이를 반환한다. LENGTHB는 character 대신 byte를 사용하고, LENGTHC는 unicode를 사용하며, LENGTH2는 UCS2 codepoint를 사용하고, LENGTH4는 UCS4 codepoint를 사용한다.
2-3) URRENT_TIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 현재 session의 날짜와 시간 정보를 반환한다. current_timestamp는 time zone까지 출력되지만, localtimestamp는 time zone은 출력되지 않는다. 【예제】 SQL> select current_timestamp, localtimestamp, 2 current_date from dual;
CURRENT_TIMESTAMP -------------------------------------------------------------------------- LOCALTIMESTAMP -------------------------------------------------------------------------- CURRENT_D --------- 04-AUG-04 11.17.40.768776 AM +09:00 04-AUG-04 11.17.40.768776 AM 04-AUG-04
SQL>
2-4) DBTIMEZONE 함수 --------------------------------------------------------------------------------
데이터베이스 timezone을 반환한다. 【예제】 SQL> select dbtimezone from dual;
SYSDATE last day Days Left --------- --------- ---------- 04-AUG-04 31-AUG-04 27
SQL>
2-8) LOCALTIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 timestamp의 현재 날짜와 시각을 출력한다. current_timestamp는 time zone까지 출력되지만, localtimestamp는 time zone은 출력되지 않는다.
【형식】 localtimestamp [(timestamp_precision)]
【예제】 SQL> select current_timestamp, localtimestamp, 2 current_date from dual;
CURRENT_TIMESTAMP -------------------------------------------------------------------------- LOCALTIMESTAMP -------------------------------------------------------------------------- CURRENT_D --------- 04-AUG-04 11.17.40.768776 AM +09:00 04-AUG-04 11.17.40.768776 AM 04-AUG-04
SQL>
【예제】오류가 발생하는 이유를 잘 이해하자. SQL> CREATE TABLE local_test(col1 TIMESTAMP WITH LOCAL TIME ZONE);
Table created.
SQL> INSERT INTO local_test VALUES 2 (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF')); (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF')) * ERROR at line 2: ORA-01830: date format picture ends before converting entire input string
SQL> INSERT INTO local_test VALUES 2 (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));
1 row created.
SQL> select * from local_test;
COL1 -------------------------------------------------------------------------- 04-AUG-04 11.33.58.183398 AM
SQL>
2-9) MONTHS_BETWEEN 함수 --------------------------------------------------------------------------------
MONTHS_BETWEEN(date1,date2) 함수는 date1과 date로 나타내는 날짜와 날짜 사이의 개월 수를 출력한다.
2-10) NEW_TIME 함수 --------------------------------------------------------------------------------
NEW_TIME(date,zone1,zone2) 함수는 date, zone1 시간대를 zone2 시간대로 출력한다. 여기서 사용되는 zone은 다음 중의 하나이다.
AST,ADT : Atlantic Standard or Daylight Time BST,BDT : Bering Standard or Daylight Time CST,CDT : Central Standard or Daylight Time EST,EDT : Eastern Standard or Daylight Time GMT : Greenwich Mean Time HST,HDT : Alaska-Hawaii Standard or Daylight Time MST,MDT : Mountain Standard or Daylight Time NST : Newfoundland Standard Time PST,PDT : Pacific Standard or Daylight Time YST,YDT : Yukon Standard or Daylight Time
【예제】 SQL> alter session set nls_date_format = 2 'DD-MON-YYYY HH24:MI:SS';
ENAME HIREDATE NUMTODSIN ---------- --------- --------- SMITH 17-DEC-80 27-MAR-81 ALLEN 20-FEB-81 31-MAY-81 WARD 22-FEB-81 02-JUN-81 JONES 02-APR-81 11-JUL-81 MARTIN 28-SEP-81 06-JAN-82 BLAKE 01-MAY-81 09-AUG-81 CLARK 09-JUN-81 17-SEP-81 SCOTT 19-APR-87 28-JUL-87 KING 17-NOV-81 25-FEB-82 TURNER 08-SEP-81 17-DEC-81 ADAMS 23-MAY-87 31-AUG-87 JAMES 03-DEC-81 13-MAR-82 FORD 03-DEC-81 13-MAR-82 MILLER 23-JAN-82 03-MAY-82
14 rows selected.
SQL>
2-13) NUMTOYMINTERVAL 함수 --------------------------------------------------------------------------------
NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘YEAR’ ‘MONTH’
【예제】 SQL> select numtoyminterval(30,'month') from dual;
ENAME HIREDATE NUMTOYMIN ---------- --------- --------- SMITH 17-DEC-80 17-JUN-83 ALLEN 20-FEB-81 20-AUG-83 WARD 22-FEB-81 22-AUG-83 JONES 02-APR-81 02-OCT-83 MARTIN 28-SEP-81 28-MAR-84 BLAKE 01-MAY-81 01-NOV-83 CLARK 09-JUN-81 09-DEC-83 SCOTT 19-APR-87 19-OCT-89 KING 17-NOV-81 17-MAY-84 TURNER 08-SEP-81 08-MAR-84 ADAMS 23-MAY-87 23-NOV-89 JAMES 03-DEC-81 03-JUN-84 FORD 03-DEC-81 03-JUN-84 MILLER 23-JAN-82 23-JUL-84
14 rows selected.
SQL>
2-14) ROUND(date) 함수 --------------------------------------------------------------------------------
이 함수는 날짜를 주어진 형식으로 반올림하는 함수이다. 날짜 형식이 없으면 가장 가까운 날을 출력한다.
【형식】 ROUND( date [,fmt] )
【예제】 SQL> select localtimestamp, round(sysdate,'year') from dual;
2-20) TO_TIMESTAMP 함수 --------------------------------------------------------------------------------
이 함수는 문자열을 timestamp 형식으로 변환하여 출력한다
【형식】 to_timestamp ( char [,fmt ['nlsparam'] ] )
【예제】 SQL> select to_timestamp('2004-8-20 1:30:00', 'YYYY-MM-DD HH:MI:SS') 2 from dual;
TO_TIMESTAMP('2004-8-201:30:00','YYYY-MM-DDHH:MI:SS') -------------------------------------------------------------------------- 20-AUG-04 01.30.00.000000000 AM
SQL>
2-21) TO_TIMESTAMP_TZ 함수 --------------------------------------------------------------------------------
이 함수는 문자열을 timestamp with time zone 형식으로 변환하여 출력한다.
3-4) CHARTOROWID 함수 --------------------------------------------------------------------------------
이 함수는 char, varchar2, nchar, ncharvar2형 데이터 타입을 rowid 형 데이터 타입으로 변경한다. 【예제】 SQL> select name from emp 2 where rowid = chartorowid('AAAHZ+AABAAAMWiAAF');
NAME ---------- jijoe
SQL> select rowid,name from emp;
ROWID NAME ------------------ ---------- AAAHZ+AABAAAMWiAAA Cho AAAHZ+AABAAAMWiAAB Joe AAAHZ+AABAAAMWiAAC kim AAAHZ+AABAAAMWiAAF jijoe
SQL>
여기서 rowid의 의미는 다음과 같다. AAAHZ+ AAB AAAMWi AAA 객체번호 테이블스페이스번호 블록번호 행번호
3-5) COMPOSE 함수 --------------------------------------------------------------------------------
입력된 스트링을 unicode로 나타낸다.
【예제】 SQL> select compose('aa' || unistr('308') ) from dual;
CO -- aa
SQL>
3-6) CONVERT 함수 --------------------------------------------------------------------------------
입력된 문자열을 지정한 코드로 변환한다. 공용 문자셋은 살펴보자. US7ASCII US 7-bit ASCII 문자 WE8DEC 서유럽 8비트 문자 WE8HP HP 서유럽 레이져젯 8비트 문자 F7DEC DEC 프랑스 7비트 문자 WE8EBCDIC500 IBM 서유럽 EBCDIC 코드 페이지 500 WE8PC850 IBM PC 코드 페이지 850 WE8ISO8859P1 ISO 8859 서유럽 8비트 문자
【예제】 SQL> select convert('arirang','we8pc850') from dual;
CONVERT ------- arirang
SQL>
3-7) HEXTORAW 함수 --------------------------------------------------------------------------------
HEXTORAW(char) 함수는 char, varchar2, nchar, nvarchar2 따위의 문자로 주어지는 hexadecimal digit을 raw 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL>
3-8) NUMTODSINTERVAL 함수 --------------------------------------------------------------------------------
NUMTODSINTERVAL(n,'char_expr') 함수는 n을 interval day to second로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘DAY’ ‘HOUR’ ‘MINUTE’ ‘SECOND’
【예제】 SQL> select numtodsinterval(100,'MINUTE') from dual;
ENAME HIREDATE NUMTODSIN ---------- --------- --------- SMITH 17-DEC-80 27-MAR-81 ALLEN 20-FEB-81 31-MAY-81 WARD 22-FEB-81 02-JUN-81 JONES 02-APR-81 11-JUL-81 MARTIN 28-SEP-81 06-JAN-82 BLAKE 01-MAY-81 09-AUG-81 CLARK 09-JUN-81 17-SEP-81 SCOTT 19-APR-87 28-JUL-87 KING 17-NOV-81 25-FEB-82 TURNER 08-SEP-81 17-DEC-81 ADAMS 23-MAY-87 31-AUG-87 JAMES 03-DEC-81 13-MAR-82 FORD 03-DEC-81 13-MAR-82 MILLER 23-JAN-82 03-MAY-82
14 rows selected.
SQL>
3-9) NUMTOYMINTERVAL 함수 --------------------------------------------------------------------------------
NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다. char_expr은 다음 중의 하나이다. ‘YEAR’ ‘MONTH’
【예제】 SQL> select numtoyminterval(30,'month') from dual;
ENAME HIREDATE NUMTOYMIN ---------- --------- --------- SMITH 17-DEC-80 17-JUN-83 ALLEN 20-FEB-81 20-AUG-83 WARD 22-FEB-81 22-AUG-83 JONES 02-APR-81 02-OCT-83 MARTIN 28-SEP-81 28-MAR-84 BLAKE 01-MAY-81 01-NOV-83 CLARK 09-JUN-81 09-DEC-83 SCOTT 19-APR-87 19-OCT-89 KING 17-NOV-81 17-MAY-84 TURNER 08-SEP-81 08-MAR-84 ADAMS 23-MAY-87 23-NOV-89 JAMES 03-DEC-81 03-JUN-84 FORD 03-DEC-81 03-JUN-84 MILLER 23-JAN-82 23-JUL-84
14 rows selected.
SQL>
3-10) RAWTOHEX 함수 --------------------------------------------------------------------------------
RAWTOHEX(raw) 함수는 raw 값을 hexadecimal 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL> select rawtohex(raw_col) from test;
RAWTOHEX(RAW_COL) -------------------- 7D
SQL>
3-11) RAWTONHEX 함수 --------------------------------------------------------------------------------
RAWTONHEX(raw) 함수는 raw 값을 nvarchar2형 hexadecimal 값으로 변환한다.
【예제】 SQL> create table test(raw_col RAW(10));
Table created.
SQL> insert into test VALUES (HEXTORAW('7D'));
1 row created.
SQL> select * from test;
RAW_COL -------------------- 7D
SQL> select rawtonhex(raw_col) from test;
RAWTONHEX(RAW_COL) -------------------- 7D
SQL>
3-12) ROWIDTOCHAR 함수 --------------------------------------------------------------------------------
RAWIDTOCHAR(rowid) 함수는 rowid 값을 varchar2 형식의 데이터로 변환한다.
【예제】 SQL> select rowid from test;
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select rowid from test 2 where rowidtochar(rowid) like '%AABAA%';
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL>
여기서 rowid의 의미는 다음과 같다. AAAHbH AAB AAAMXC AAA 객체번호 테이블스페이스번호 블록번호 행번호
3-13) ROWIDTONCHAR 함수 --------------------------------------------------------------------------------
RAWIDTONCHAR(rowid) 함수는 rowid 값을 nvarchar2 형식의 데이터로 변환한다.
【예제】 SQL> select rowid from test;
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select rowid from test 2 where rowidtochar(rowid) like '%AABAA%';
ROWID ------------------ AAAHbHAABAAAMXCAAA
SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid) 2 from test;
3-20) TO_NCHAR(datetime) 함수 --------------------------------------------------------------------------------
이 함수는 date, timestamp, timestamp with time zone, timestamp with local time zone, interval month to year, interval day to second 형식의 데이터를 nchar 형식의 데이터로 변환한다.
3-26) TRANSLATE ... USING 함수 --------------------------------------------------------------------------------
이 함수는 텍스트 형식의 데이터를 지정한 문자 형식의 데이터로 변환한다.
【형식】 TRANSLATE ( text USING {CHAR_CS|NCHAR_CS} )
【예제】 SQL> select translate('Corea' USING char_cs) from dual;
TRANS ----- Corea
SQL> select to_nchar('Corea') from dual;
TO_NC ----- Corea
SQL>
3-27) UNISTR 함수 --------------------------------------------------------------------------------
UNISTR('string') 함수는 스트링 형식의 데이터를 nchar 형식의 데이터로 변환한다.
【예제】 SQL> select unistr('abc0e50f10f6') from dual;
UNISTR ------ abc??o
SQL> select unistr('Corea') from dual;
UNIST ----- Corea
SQL>
4-1) BFILENAME 함수 --------------------------------------------------------------------------------
서버 파일 시스템 상에 실제로 위치한 LOB 바이너리 파일의 위치한 BFILE locator를 반환한다. 【형식】 bfilename ('디렉토리‘,’파일이름‘)
【예제】BFILE을 insert하는 예 SQL> connect system/manager
SQL> host mkdir /export/home/oracle/bfile
SQL> create directory bfile_dir as '/export/home/oracle/bfile';
Directory created.
SQL> grant read on directory bfile_dir to jijoe;
Grant succeeded.
SQL> connect jijoe/joe_password
SQL> create table bfile_doc (id number, doc bfile);
SQL> insert into bfile_doc
1 values(1111,bfilename('bfile_dir','unix.hwp'));
1 row created.
SQL>
4-2) COALESCE 함수 --------------------------------------------------------------------------------
이 함수는 나열된 값 중에서 NULL이 아닌 첫 번째 값을 반환한다.
【예제】 SQL> select coalesce('','','arirang','kunsan') from dual;
COALESC ------- arirang
SQL>
4-3) DECODE 함수 --------------------------------------------------------------------------------
DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다. 따라서 일반 프로그래밍 언어의 IF문이 수행 할 수 있는 기능을 포함하고 있다. select시의 decode 사용은 from 절만 빼고 어디에서나 사용할 수 있다. 일반 프로그래밍과 decode 함수를 서로 비교하여 보자. IF문 Decode 함수 IF A=B THEN RETURN 'T';END IF; DECODE(A,B,'T') IF A=B THENRETURN 'T';ELSIF A=C THENRETURN 'F';ELSERETURN 'X';END IF; DECODE(A,B,'T',C,'F','X') 【형식】 DECODE(검색컬럼,조건1,결과값1, 조건2,결과값2,...,기본값);
SQL> insert into aa values(1234,'kunsan','jijoe') SQL> insert into aa values(3456,'seoul','sunny')
SQL> select * from aa;
PID ADDR NAME ---------- -------------------- ---------- 1234 kunsan jijoe 3456 seoul sunny
SQL> select decode(pid,1234,name) name from aa;
NAME ---------- jijoe
SQL> 【예제】 SQL> desc ddd Name Null? Type ----------------------------------------- -------- ---------------------------- NO NUMBER(4) NAME VARCHAR2(10) HIRDATE DATE DEPTNO NUMBER(5)
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-6) CUME_DIST 함수 --------------------------------------------------------------------------------
이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.
【형식】 CUME_DIST(expr,... WITHIN GROUP (ORDER BY expr [DESC | ASC] [NULLS {FIRST|LAST}],...) 또는 CUME_DIST() over ([query_partition_clause] order_by_clause)
【예제】 SQL> select cume_dist(230) within group 2 (order by salary ) from emp;
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-7) DENSE_RANK 함수 --------------------------------------------------------------------------------
그룹 내에서 순위를 반환한다.
【예제】 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL> select dense_rank(230, .05) within group 2 (order by salary, bonus) "Dense Rank" 3 from employees;
Dense Rank ---------- 2
SQL>
5-8) FIRST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK FIRST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-9) GROUP_ID 함수 --------------------------------------------------------------------------------
GROUP() 함수는 group by로 분리되어 복제된 번호로 복제 횟수를 구분하도록 출력한다. 번호가 0부터 시작되므로 n번 복제되었으면 n-1의 번호가 출력된다.
【예제】 SQL> select dept_no, group_id() from employees 2 group by dept_no;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-10) Grouping 함수 --------------------------------------------------------------------------------
Grouping 함수는 Rollup이나 cube 연산자랑 함께 사용하여 grouping 함수에서 기술된 컬럼이 그룹핑시 사용되었는지 보여주는 함수이다. 특별히 연산의 기능은 없으며, rollup이나 cube 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다. 즉, grouping 함수를 이용할 경우 출력되는 결과값 중 null 값이 있다면, 이 null 값이 rollup이나 cube 연산의 결과로 생성된 값인지, 원래 테이블상에 null 값으로 저장된 것인지 확인할 수 있다.
. grouping 함수는 인수로 하나의 값만을 가진다. . grouping 함수에 사용된 인수는 group by 절에 기술된 값 중에 하나와 반드시 일치해야 한다. . grouping 함수의 결과값으로 0 또는 1을 반환한다. 0은 해당인수로 쓰인 값이 rollup이나 cube 연산에 사용되었음을 나타나고, 1은 사용되지 않았음을 의미한다. 【형식】 SELECT 컬럼명,그룹함수(컬럼명), GROUPING(컬럼명) FROM 테이블명 WHERE 조건 GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명,... HAVING 그룹조건 ORDER BY 컬럼명 또는 위치번호
【예제】 SQL> select grade,deptno,sum(salary),GROUPING(deptno) 2 from aaa 3 group by rollup(grade,deptno);
5-12) LAST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK LAST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-13) MAX 함수 --------------------------------------------------------------------------------
이 함수는 최대 값을 반환한다.
【형식】 MAX ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]
【예제】 SQL> select max(salary) over (partition by dept_no) 2 from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-17) PERCENT_RANK 함수 --------------------------------------------------------------------------------
이 함수는 CUME_DIST 함수와 유사하게 percent_rank 값을 반환한다.
【형식】 PERCENT_RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}] [NULLS {FIRST|LAST}],...) 또는 PERCENT_RANK() OVER( [query_partition_clause] order_by_clause)
【예제】 SQL> select percent_rank(230,0.05) within group 2 (order by salary,bonus) from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-18) RANK 함수 --------------------------------------------------------------------------------
이 함수는 그룹 내에서 위치를 반환한다.
【형식】 RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}] [NULLS {FIRST|LAST}],...) 또는 RANK() OVER( [query_partition_clause] order_by_clause)
【예제】 SQL> select rank(230,0.05) within group 2 (order by salary,bonus) from employees;
RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS) ---------------------------------------------- 2 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
5-19) REGR_(linear regression) function* 함수 --------------------------------------------------------------------------------
선형 회귀(linear regression) 함수 ordinary-least squares regression line을 찾도록 한다. 사용되는 회귀함수는 자음 중 하나이다. REGR_SLOPE REGR_INTERCEPT REGR_COUNT REGR_R2 REGR_AVGX REGR_AVGY REGR_SXX REGR_SYY REGR_SXY
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
5-27) Grouping sets 함수 --------------------------------------------------------------------------------
Grouping sets 함수는 Group by의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러 개 기술할 수 있으며, grouping sets 함수 사용이 불가능한 이전 버전에서 복잡한 union all 연산자를 사용하여 기술하던 것을 간단하게 한 문장 안에서 해결할 수 있어 검색시 효율성이 증대 된다. 다시 말해서, grouping sets 함수를 사용하면, group by ... union all을 사용한 것보다 SQL 문이 간단해지고 또한 실행시 성능이 빨라진다. 【형식】 SELECT 컬럼명,그룹함수(컬럼명), GROUPING(컬럼명) FROM 테이블명 WHERE 조건 GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명, ... [GROUPING SETS (컬럼명,컬럼명, ...), ...] HAVING 그룹조건 ORDER BY 컬럼명 또는 위치번호
【예제】 SQL> select grade,deptno,sum(salary) 2 from aaa 3 group by grouping sets(grade,deptno);
12 rows selected. SQL> 【예제】Union all을 사용한 경우 SQL> select grade,deptno,sum(salary) 2 from aaa 3 group by grade,deptno 4 union all 5 select grade,deptno,sum(salary) 6 from aaa 7 group by grade,deptno;
composite columns란 rollup, cube, grouping sets 절과 같은 기능을 사용하면 표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이며 다음 표를 보고 이해하자. composite column 문의 경우 group by 문의 경우 group by grouping sets(a,b,c) group by a union allgroup by b union allgroup by c group by grouping sets(a,b,(b,c)) group by a union allgroup by b union allgroup by b,c group by grouping sets((a,b,c)) group by a,b,c group by grouping sets(a,(b),()) group by a union allgroup by b union allgroup by () group by grouping sets(a,rollup(b,c)) group by a union allgroup by rollup(b,c) group by rollup(a,b,c) group by (a,b,c) union allgroup by (a,b) union allgroup by (a) union allgroup by () group by cube(a,b,c) group by (a,b,c) union allgroup by (a,b) union allgroup by (a,c) union allgroup by (b,c) union allgroup by (a) union allgroup by (b) union allgroup by (c) union allgroup by ()
6-1) AVG* 함수 --------------------------------------------------------------------------------
조건을 만족하는 행(row)의 평균을 값을 반환하며, aggregate 함수나 analytic 함수로 사용된다.
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
6-5) CUME_DIST 함수 --------------------------------------------------------------------------------
이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.
【형식】 CUME_DIST(expr,... WITHIN GROUP (ORDER BY expr [DESC | ASC] [NULLS {FIRST|LAST}],...) 또는 CUME_DIST() over ([query_partition_clause] order_by_clause)
【예제】 SQL> select cume_dist(230) within group 2 (order by salary ) from emp;
ID NAME SALARY BONUS ---------- ---------- ---------- ---------- 1101 Cho 250 125 1102 Joe 240 100 1103 kim 250 100 1104 jijoe 220 100
SQL>
6-6) DENSE_RANK 함수 --------------------------------------------------------------------------------
그룹 내에서 순위를 반환한다.
【예제】 SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL> select dense_rank(230, .05) within group 2 (order by salary, bonus) "Dense Rank" 3 from employees;
Dense Rank ---------- 2
SQL>
6-7) FIRST 함수 --------------------------------------------------------------------------------
first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다. 【형식】 집합함수 KEEP ( DENSE_RANK FIRST ORDER BY expr [DESC|ASC][NULL{FIRST|LAST}],...) 【예제】 SQL> select 2 min(salary) keep (dense_rank first order by salary) "Worst", 3 max(salary) keep (dense_rank last order by salary) "Best" 4 from employees 5 order by id;
Worst Best ---------- ---------- 220 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-8) FIRST_VALUE 함수 --------------------------------------------------------------------------------
이 함수는 서열화된 값에서 첫 번째를 출력한다.
【형식】 FIRST_VALUE ( expr ) OVER ( analytic_절)
【예제】 SQL> select salary,first_value(name) 2 over (order by salary asc) 3 from (select * from employees 4 where dept_no = 20 5 order by salary);
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-9) LAG 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.
【형식】 LAG ( value_expr [,offset] [,default] ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,LAG(salary,1,0) 2 OVER (ORDER BY salary) FROM employees;
NAME SALARY LAG(SALARY,1,0)OVER(ORDERBYSALARY) ---------- ---------- ---------------------------------- jijoe 220 0 Joe 240 220 Cho 250 240 kim 250 250
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-10) LAST_VALUE 함수 --------------------------------------------------------------------------------
이 함수는 서열화된 값에서 마지막 번째를 출력한다.
【형식】 LAST_VALUE ( expr ) OVER ( analytic_절)
【예제】 SQL> select salary,last_value(name) 2 over (order by salary asc) 3 from (select * from employees 4 where dept_no = 20 5 order by salary);
SALARY LAST_VALUE ---------- ---------- 220 jijoe 240 Joe
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-11) LEAD 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.
【형식】 LEAD ( value_expr [,offset] [,default] ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,LEAD(salary,1,0) 2 OVER (ORDER BY salary) FROM employees;
NAME SALARY LEAD(SALARY,1,0)OVER(ORDERBYSALARY) ---------- ---------- ----------------------------------- jijoe 220 240 Joe 240 250 Cho 250 250 kim 250 0
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-12) NTILE 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 데이터를 주어진 bucket 수 expr로 분리한다.
【형식】 NTILE ( expr ) OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> select name,salary,NTILE(3) OVER (ORDER BY salary DESC) 2 FROM employees;
NAME SALARY NTILE(3)OVER(ORDERBYSALARYDESC) ---------- ---------- ------------------------------- Cho 250 1 kim 250 1 Joe 240 2 jijoe 220 3
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-13) RATIO_TO_REPORT 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 데이터 합에 대한 구성비를 계산한다.
【형식】 RATIO_TO_REPORT ( expr ) OVER ([query_partition_clause])
【예제】 SQL> select name,salary,RATIO_TO_REPORT(salary) OVER () 2 FROM employees;
NAME SALARY RATIO_TO_REPORT(SALARY)OVER() ---------- ---------- ----------------------------- Cho 250 .260416667 Joe 240 .25 kim 250 .260416667 jijoe 220 .229166667
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
6-14) ROW_NUMBER 함수 --------------------------------------------------------------------------------
이 함수는 analytic 함수로서, 각 행(row)에 unique 번호를 부여한다.
【형식】 ROW_NUMBER () OVER ([query_partition_clause] order_by_clause )
【예제】 SQL> SELECT ROW_NUMBER() OVER (ORDER BY salary DESC),name 2 FROM employees;
ROW_NUMBER()OVER(ORDERBYSALARYDESC) NAME ----------------------------------- ---------- 1 Cho 2 kim 3 Joe 4 jijoe
SQL> select * from employees;
ID DEPT_NO NAME SALARY BONUS ---------- ---------- ---------- ---------- ---------- 1101 10 Cho 250 125 1102 20 Joe 240 100 1103 10 kim 250 100 1104 20 jijoe 220 100
SQL>
7-1) REF 타입 -------------------------------------------------------------------------------- 테이블의 어떤 컬럼이 독립된 다른 객체 테이블을 참조하는 데이터 타입을 의미한다. 일반적으로 테이블을 만들때 사용하는 외부키(foreign-key)를 이용한 참조관계와 유사하다. REF 타입의 컬럼 데이터를 읽을 때는 반드시 DEREF 함수를 사용한다. REF 타입으로 정의된 컬럼에는 실제 데이터가 저장되는 것이 아니고 참조되는 객체가 존재하는 포인트정보만 가지고 있기 때문에 객체가 삭제 된다면, 해당 컬러은 정상적으로 검색되지 못한다. 이러한 현상을 REF의 Dangling 현상이고 한다. 이러한 dangling 현상을 방지하기 위해서는 삭제된 객체 정보를 참조하는 행의 컬럼 정보를 analyze 명령어를 이용하여 null 값으로 변경해 주어야 한다. 【예제】 SQL> connect jijoe/jijoe_password connected
SQL> create type person_type as object( 2 first_name varchar2(10), 3 last_name varchar2(10), 4 phone varchar(12), 5 birthday varchar2(12)); 6 /
Type created.
SQL> create type emp_type as object ( 2 empno number, 3 emp person_type); 4 /
Type created.
SQL> create table emp2 of emp_type 2 oidindex emp_oid;
Table created.
SQL> insert into emp2 values( 2 emp_type(1000,person_type('junik','joe','123-1234','20-jul-04')));
1. 카티시안 곱 (Cartesial Product) - 조인 조건이 부적합하거나 조인 조건을 완전히 생략한 경우 행의 모든 조합을 표시하는 카티시안 곱이 생성된다. 첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인된다. 카티시안 곱은 너무 많은 행을 생성하므로 결과가 유용하게 사용되지 않는다. 특별히 모든 테이블에 있는 모든 행을 조합해야 하는 경우가 아니라면 where절에 유효한 조인 조건을 포함시켜야 한다. 적정 양의 데이터를 시뮬레이션하기 위해 많은 수의 행을 생성해야 하는 경우 등 일부 테스트에서는 유용하게 사용된다.
SQL> select last_name, department_name 2 from employees, departments;
2. 등가 조인 (equi join) - 단순 조인 or 내부 조인(inner join)이라고도 함 - 주로 Primary Key와 Foreign Key를 보조 수단으로 사용하여 조인 - departments 테이블과 employees 테이블은 department_id를 공통된 컬럼으로 가지고 있다. 따라서 이 컬럼을 where절에서 조건으로 지정해 준다면 등가 조인을 할 수 있다. - 등가 조인의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다.
SQL> select e.employee_id, e.last_name, d.department_id, d.location_id 2 from employees e, departments d 3 where e.department_id = d.department_id;
3. 비등가 조인 (non-equi join) - 동등 연산자(=)가 아닌 연산자를 포함하는 조인 - between and, is null, is not null, in, not in - ex) employees 테이블의 급여는 jobs 테이블의 min_salary와 max_salary 사이에 있어야 한다.
SQL> select e.last_name, e.salary, j.job_title 2 from employees e, jobs j 3 where e.salary between min_salary and max_salary;
4. 포괄 조인 (outer join) - outer join은 조인 조건을 만족하지 않는 행도 반환한다. - 연산자는 더하기 기호 (+) 이고, 조인시킬 값이 없는 조인측에 위치시킨다. - outer join 연산자는 표현식의 where절에서 한 편에만 올 수 있고, in, or 연산자는 사용할 수 없다. - 아래 쿼리문은 사원이 없는 부서의 테이블 이름도 반환한다.
SQL> select e.last_name, e.department_id, d.department_name 2 from employees e, departments d 3 where e.department_id(+) = d.department_id;
- 4.1 Left Outer Join : 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다. (아래의 SQL문은 같은 의미)
SQL> select e.last_name, e.department_id, d.department_name from employees e left outer join departments d on (e.department_id = d.department_id)
SQL> select e. last_name, e.department_id, d.department_name 2 from employees e, departments d 3 where d.department_id (+) = e.department_id;
- 4.2 Right Outer Join : 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다.
SQL> select e.last_name, e.department_id, d.department_name 2 from employees e 3 right outer join departments d 4 on (e.department_id = d.department_id);
SQL> select e.last_name, e.department_id, d.department_name from employees e, departments d where d.department_id = e.department_id (+)
- 4.3 Full Outer Join : 양쪽 테이블에 모두 Outer Join을 하는 것으로 Two-way Outer Join 이라고도 한다.
SQL> select e.last_name, e.department_id, d.department_name from employees e full outer join departments d on (e.department_id = d.department_id)
5. 자체 조인 (self join) - Equi Join과 동일하지만 하나의 테이블 안에서 조인이 일어난다. - 같은 테이블을 마치 2개의 테이블을 사용하는 것처럼 조인한다. - ex) 각 사원의 관리자 이름을 찾으려면 Employees 테이블을 자체 조인해야 한다. 즉, 각 사원의 매니저 ID와 사원 ID가 동일한 사원을 찾아야 한다.
SQL> select worker.last_name || ' works for ' || manager.last_name 2 from employees worker, employees manager 3 where worker.manager_id = manager.employee_id;
6. 교차 조인 (cross join) - cross join은 두 테이블의 상호간의 조합을 생성한다. - 두 테이블 사이의 카티시안 곱(cartesian product)의 결과와 동일하다.
SQL> select last_name, department_name from employees cross join departments
7. 자연 조인 (Natural Join) - 두 테이블의 하나 이상의 공통된 컬럼(데이터 타입과 이름이 일치해야함)을 기반으로 조인연산을 수행한다. - DEPARTMENTS 테이블과 LOCATIONS 테이블은 공통적으로 NUMBER(4) 타입의 LOCATION_ID 속성이 존재한다. 따라서 두 테이블은 LOCATION_ID 컬럼을 통해서 자연 조인이 가능하다. - 일반적으로 등가 조인 (equi join)과 동일하다고 보면 된다. 단지 where절로 조건을 거느냐 natural join 키워드로 조인을 거느냐의 차이? (자연 조인안에서 다시 where절로 조건을 걸수 있음)
SQL> select department_id, department_name, location_id, city 2 from departments 3 natural join locations;
- 7.1 Using절을 포함하는 조인 -- Using절을 사용하면 equi join에 사용될 열만을 지정할 수 있다. -- Using절 안에 포함되는 컬럼에 alias를 지정하면 오류가 발생한다.
SQL> select e.employee_id, e.last_name, d.location_id from employees e join departments d using (department_id)
- 7.2 On 절을 이용한 조인 -- 자연 조인의 기본 조인 조건은 기본적으로 같은 이름을 가진 모든 열의 equi join 이다. -- 임의 의 조건을 지정하거나 조인할 열을 지정하려면 on절을 사용해야 한다.
SQL> select e.last_name emp, m.last_name mgr from employees e join employees m on (e.manager_id = m.employee_id)
테이블 Alias를 사용하면 데이터베이스의 액세스 속도를 높이고, SQL 코드의 양이 작아지므로 메모리 사용이 줄어든다.