1. 더미테이블

2. 단일 함수 : 값을 하나만 리턴

3. 그룹 함수 : 여러개의 값을 리턴


1. 더미 테이블

> select * from dual;

--DB를 통해서 기본적으로 제공해주는 테이블

> select sysdate from dual;

--sysdate는 컬럼명이 아닌  함수. 현재의 시간, 날짜 들을 반환해준다.  

> select '안녕하세요' as hello from dual;

--hello라는 필드는 '안녕하세요'라는 뜻을 갖게 됨

> select 1+2 as "1+2=" from dual;

> select 1+2 from dual;

> select 5/3 from dual;

--정수형으로 반환x  

--쿼리문으로 처리해서 반환받는것도 가능하지만 자원소모가 심하다


> select kor+eng+math from student;

--더미테이블을 이용하는 것은 DB가 연산작업을 하는 것이므로 자원소모가 심하다

--반드시 필요한 경우가 아니라면 사용하는 것 자제

> select no,name,kor+eng+math as sum from student;

--sum값을 데이터에 저장한다는 것은 데이터 공간을 차지한다는 의미


2. 단일함수

> select * from student;

> select sum(kor),sum(eng),sum(math) from student;

--반전체의 국어, 영어, 수학 점수

--리턴값이 하나 

> select sum(kor),sum(eng),sum(math), kor, eng, math from student;

--단일과 다중 둘다 달라고 하면 동시 수행이 되지 않는다

> select max(kor),min(eng), avg(math) from student;

--최대점수, 최소점수, 평균

--단일 점수끼리는 서로 처리가 가능

> select count(*) from student;

> select count(kor) from student;

--총 몇개인지

> select stddev(eng) from student;

--표준편차


3. 그룹함수(다중 함수)

--그룹함수는 컬럼을 주면 컬럼 내용들이 해당의 명령으로 수행되서 리턴결과를 볼 수 있다

> select 'javaWorld' from dual;

--컬럼명이 자동으로 대문자로 나옴

--오라클 명령어는 대소문자 구분x, value값은 대소문자 구분

--문자열 제어하는데 함수 제공

> select 'javaWorld', lower('javaWorld')  from dual;

--소문자로 리턴

> select 'JavaWorld',lower('JavaWorld'),upper('JavaWorld') from dual;

--대문자로 리턴

> select 'JavaWorld',lower('JavaWorld'),upper('JavaWorld'), initcap('JavaWorld') from dual;

--첫글자만 대문자로 반환

> select 'JavaWorld', length('JavaWorld'),length('자바') from dual;

--길이 반환(9,2)

> select 'JavaWorld', lengthb('JavaWorld'),lengthb('자바') from dual;

--lengthb는 실제 메모리에 할당되는 갯수이다(결과:9,6)

--영문자는 1byte,한글은 3byte. 디폴트값으로 영문자 외의 것들을 3byte이다

--오라클은 세계 모든 문자를 사용하기 위해 4byte를 사용


/* 

> desc student; 해서 보면 

name값으로 20byte를 할당

글자 하나당 한국어3byte라서 21이 아니기에 오류가 날 수 있다. 

> insert into student values(5, 10, 20, 30, '이사람은사람임');

넣는 순간 -> 값이 너무 큼(실제:21, 최대값 20)

*/




그룹함수(다중 함수)

==문자열==

--substr

> select 'JavaWorld',substr('JavaWorld', 1,4) from dual;

--1번째부터 4번째

--주의: 인덱스 0번부터가 아니라 1번부터

> select 'JavaWorld',substr('JavaWorld', -5,5) from dual;

--끝에서부터 5번째인 W부터 5개 d까지 나온다: World가 나옴. 

> select 'JavaWorld',substrb('JavaWorld', 1,4) from dual;

> select 'JavaWorld',substrb('자바월드', 1,6) from dual;

--한글자당 3byte므로 자바까지 나오려면 6byte필요 

> select 'JavaWorld',substrb('자바월드', -6,6) from dual;

--값은 월드


--instr

> select 'JavaWorld',instr('JavaWorld', 'W') from dual;

--특정위치에서 찾아서 반환할때 (대소문자 구분)

--a라면 첫번째 위치인 2개 추출됨

--두번째 a를 구하려면

> select 'JavaWorld',instr('JavaWorld', 'a',3) from dual;

--3부터 'a'를 구하는 것을 시작하겠다

> select 'JavaWorld',instr('JavaWorld', 'a',1,2) from dual;

--첫번째부터 시작하지만 2번째값을 얻겠다

> select 'JavaWorld',instr('한글로 자바를 자바라 칭함', '자바') from dual;

> select 'JavaWorld',instr('한글로 자바를 자바라 칭함', '자바',1,2) from dual;

--9가 나옴. 띄어쓰기 포함

> select 'JavaWorld',instrb('한글로 자바를 자바라 칭함', '자바') from dual;

--instrb-> 띄어쓰기값 1 포함(값 11)


--trim 

> select 'JavaWorld',trim('      한글로 자바를 자바라 칭함    ') from dual;

--앞뒤 공백 자르기. 자원을 관리하기 위해 

> select 'JavaWorld',trim('a' from 'aaaaaa한글로 자바를 자바라 칭함aaaaa') from dual;

--그냥 trim은 공백자르기. 'a' from을 쓰면 a문자를 잘라준다. 

> select '###100' from dual;

> select trim('#' from '###100') from dual;


--lpad,rpad

> select lpad('100', 6,'0') from dual;

--총 6개의 문자로 만들고 부족한 것은 앞(left)에 0으로 채워라 

> select rpad('100', 6,'#') from dual;

--뒤(right)에 채워라


--concat,replace

> select concat('java','world')from dual;

-- +

> select replace('javaworld','w','W')from dual;

--문자열 치환(대상, 바꿀내용)

> select replace('javaworld','w','')from dual;

--삭제



==숫자==

> select 1 from dual;

> select 1+3 from dual;

> select 1-3 from dual;

> select abs(1-3) from dual;

--절대값으로 반환 


> select 5/3 from dual;

> select floor(5/3) from dual;

--소수점 이하 절삭


> select round(5/3,1) from dual;

--반올림. 소수첫째자리까지 

> select round(5/3,0) from dual;

--반올림. 정수로만

> select round(12345)from dual;

> select round(12345,-1)from dual;

--첫째자리 반올림

> select round(12345,-3)from dual;

--셋째자리 반올림

> select trunc(155555,2)from dual;

--절삭하고 싶다면 

> select trunc(15,55555,1)from dual;


--나머지 함수

> select mod(5,3)from dual;

--나머지 2

> select * from student where mod(kor+eng+math,2)=0;

--* 기억해두기! 전체에서 찾는 의미

--성적의 합이 짝수인 학생


* 연산이 수월할지 IO로  일일이 쏘는것이 더 수월할지 생각해야한다. 


==날짜==

> select sysdate from dual;

> select sysdate-1 from dual;

--(+1: 내일 날짜,-1: 어제 날짜)

> select ename,sysdate-hiredate from emp;

--입사한 날로부터 얼마나 지났는지.소숫점은 시간기준 , 소수점 절삭하면 지나온 날짜 

> select next_day(sysdate,'금') from dual;

--금요일 날짜 

> select next_day(sysdate,5) from dual;

--1: 일요일 2: 월요일 3: 화요일 4: 수요일 5: 금요일 6.토요일

> select last_day(sysdate) from dual;

--해당의 마지막 날짜 (16/8/31출력)

> select round(sysdate,'MONTH') from dual;

--반올림처리(8/1출력)

> select TRUNC(sysdate,'MONTH') from dual;

--버림 //항상 1일 얻어냄. 

> select substr(sysdate,1,2) from dual;

--1~2글자를 가져옴으로 년도출력

> select replace(sysdate,'/','.') from dual;

--치환 (/ -> .)

--타입이 문자열타입이 아니다

> select sysdate,to_char(sysdate,'YYYY-MM-DD') from dual;

--포맷을 원하는 모양으로 바꿀 수 있다. 

> select sysdate,to_char(sysdate,'YY-MON-DD DY') from dual;

--요일도 알 수 있다

> select sysdate,to_char(sysdate,'YY-MM-DD DY,HH:MI:SS') from dual;

--현재 시간

> select sysdate,to_char(sysdate,'YY-MM-DD DY,HH24:MI:SS') from dual;

--24시간 형태로

> select sysdate,to_char(sysdate,'YY-MM-DD DY, PM:MI:SS') from dual;

--AM 이나 PM 둘중 하나로 쓰면 된다. 상관없음

> select 1000, to_char(1000,'9,999') from dual;

--실제로 숫자는 그대로 넣되, 콤마로 표현(값 1,000) 

> select 1000.00, to_char(100000,'L999,999,999') from dual;

--소수점으로 해봤을때. 마찬가지로 동일한 퍼포먼스 나옴.

--L 원

> select 1000.00, to_char(100000,'$999,999,999') from dual;

--$ 달러

> select ename,hiredate from emp where hiredate='80/12/17';

--입사날짜가 80/12/17인

> select ename,hiredate from emp where hiredate='801217';

--오류

> select ename,hiredate from emp where hiredate=to_date(19801217,'YYYYMMDD');

> select sysdate-'2016/01/01' from dual;

> select sysdate-to_date('2016/01/01','YYYY/MM/DD') from dual;

--날짜 데이터로 변환 to_date // 포맷 설정

> select trunc(sysdate-to_date('2016/01/01','YYYY/MM/DD')) from dual;

--시간알고 싶지 않으면. 절삭. 

> select '1,000'+'5,000' from dual;

--오류 

> select to_number('1,000','999,999')+to_number('5,000','999,999') from dual;

> select to_char(to_number('1,000','999,999')+to_number('5,000','999,999')) from dual;

'* DB > Oracle' 카테고리의 다른 글

LPAD, RPAD 함수  (0) 2018.08.17
테이블 이름이 존재하는지 확인하기  (0) 2016.08.24
nul(), decode(), case then  (0) 2016.08.18
Table 조작  (0) 2016.08.18
오라클(기본)  (0) 2016.08.11

+ Recent posts