COUNT(범위)
데이터 개수 count
: select count( * ) from 테이블명 조건
where 컬럼명=데이터;
dual(산술연산 결과를 출력하기 위한 dummy 테이블)
=> 변수 같은 개념, select절의 결과값을 잠시 확인 하고싶을때 사용
ex)
select * from dual;
select 24*60 from dual;
select SYSDATE from dual;
SQL> select 24*60 from dual;
24*60
----------
1440
=> 간단한 연산 결과를 확인하는 테이블
절대값을 구하는 ABS
: select-10, ABS(-10) from dual;
소수점 아래 버리기 FLOOR
: select 34.5678, FLOOR(34.5678) from dual;
특정 자릿수에서 반올림하는 ROUND
-> *원본데이터만 사용가능
: select34.5678, ROUND(34.5678) from dual;
select 34.5678,ROUND(34.5678,2) from dual;
select 34.5678, ROUND(34.5678,-1) from dual;
특정 자리수에서 잘라내는 TRUNC
=> floor의 단점을 보안한 trunc
: select trunc(34.5678,2), trunc(34.5678,-1), trunc(34.5678) from dual;
SQL> select TO_CHAR(TRUNC(hiredate,'MONTH'),'YYYY/MM') 입사월 from emp;
=> trunc(date,format)
입사월
--------------
2007/03
2007/04
2005/02
나머지 구하는 MOD
: select MOD(27,2),MOD(27,5) from dual;
문자 처리 함수
대소문자 변환 함수
UPPER : 대문자 변환
LOWER : 소문자 변환
INITCAP : 첫글자만 대문자로 나머지는 소문자
SQL> select 'Welcome to Oracle',
2 UPPER('Welcome to Oracle'),
3 LOWER('Welcome to Oracle'),
4 INITCAP('Welcome to Oracle')
5 from dual;
'WELCOMETOORACLE' => Welcome to Oracle
UPPER('WELCOMETOORACLE') => WELCOME TO ORACLE
LOWER('WELCOMETOORACLE') => welcome to oracle
INITCAP('WELCOMETOORACLE') => Welcome To Oracle
LENGTH : 문자의 길이를 반환(한글1byte)
SQL> select LENGTH('Oracle'), LENGTH('오라클')
2 from dual;
LENGTH('ORACLE') LENGTH('오라클')
---------------- ----------------
6 3
LENGTHB : 문자의 길이를 반환 (한글 3byte)
SQL> select LENGTHB('Oracle'), LENGTHB('오라클')
2 from dual;
LENGTHB('ORACLE') LENGTHB('오라클')
----------------- -----------------
6 9
문자 조작 함수
concat : 문자의 값을 연결 (concat은 2개 밖에 안됨)
SQL> select concat('aaa','bbb') from dual;
CONCAT('AAA'
------------
aaabbb
SUBSTR(대상,시작,개수) : 문자 일부분 출력
SQL> select SUBSTR('Welcome to oracle',4,3) from dual;
SUBSTR
------
com
-> 4번 인덱스에서 시작해서 3개까지 출력
SUBSTR(-시작번호, 개수)
SQL> select SUBSTR('Welcome to oracle',-4,3) from dual;
SUBSTR
------
acl
** 오라클에서 글자의 첫번째는 1, 맨 마지막 자리수는 -1부터 (자바는 0)
SUBSTRB(시작번호,개수) // SUBSTRB(대상,시작,개수)
=> 바이트 수를 기준으로 문자열의 일부만 추출
SQL> select SUBSTR('한글테스트',4,3),SUBSTRB('한글테스트',4,3) from dual;
123 456 789 101112 131415
한 글 테 스 트
=> 한글을 3byte로 읽기 때문에 4번째 byte부터
SUBSTR('한글 SUBSTR
------------ ------
스트 글
** 영어는 같은 값이 나온다.(한글만 바이트를 다르게 읽기 때문에)
INSTR(대상,찾을문자,시작위치,몇번째발견) : 특정 문자의 위치값을 반환
SQL> select INSTR('Welcome to Oracle','o') from dual;
INSTR('WELCOMETOORACLE','O')
----------------------------
5
INSTRB(대상, 찾을문자,시작위치,몇번째발견) : 바이트 수를 기준으로 특정 문자의 위치값을 반환
SQL> select INSTR('데이터베이스','이',4,1), INSTRB('데이터베이스','이',4,1) from dual;
INSTR('데이터베이스','이',4,1) INSTRB('데이터베이스','이',4,1)
------------------------------ -------------------------------
5 4
LPAD,RPAD : 비어 있는 공간을 특정 기호로 채움
SQL> select LPAD('Hi',5,'#') from dual;
-> HI라는 문자열을 포함하여 5개의 자리수를 사용하는데 빈 공간을 #으로 채운다.( 채울 문자는 띄어쓰기도 가능)
LPAD('HI',
----------
###Hi
SQL> select RPAD('Hi',5,'#') from dual;
RPAD('HI',
----------
Hi###
형변환
TO_CHAR : 문자형으로 변환
-> 날짜를 문자형으로 TO_CHAR(날짜데이터,'출력양식')
SQL> select SYSDATE, TO_CHAR(SYSDATE,'YYYY-MM-DD') from dual;
SYSDATE TO_CHAR(SYSDATE,'YYY
-------- --------------------
21/04/13 2021-04-13
TO_DATE('문자','포맷') : 날짜형으로 변환
오류발생 코드)
select ename,hiredate from emp
2 where hiredate=20070402;
where hiredate=20070402
*
ERROR at line 2:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
=> 타입이 맞지 않기 때문에(테이블의 타입은 date타입, 명령한 타입은 number타입)
SQL> select ename,hiredate from emp
2 where hiredate=TO_DATE(20070402,'YYYY-MM-DD');
ENAME HIREDATE
-------------------- --------
한예슬 07/04/02
TO_NUMBER : 문자를 숫자형으로 변환
오류발생 코드)
select '20,000'-'10,000' from dual
*
ERROR at line 1:
ORA-01722: invalid number
SQL> select TO_NUMBER('20,000','99,999')-TO_NUMBER('10,000','99,999') from dual;
=> (숫자로 표현된 문자형,자리수에 가질수 있는 최대값)
TO_NUMBER('20,000','99,999')-TO_NUMBER('10,000','99,999')
---------------------------------------------------------
10000
MONTHS_BETWEEN(date1,date2) : 두 날짜 사이의 간격을 구하는 함수
SQL> select ename,SYSDATE 오늘,
2 TO_CHAR(hiredate,'YYYY/MM/DD') 입사일,
3 TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)) 근무달수
4 from emp;
ENAME 오늘 입사일 근무달수
-------------------- -------- -------------------- ----------
김사랑 21/04/13 2007/03/01 169
한예슬 21/04/13 2007/04/02 168
오지호 21/04/13 2005/02/10 194
ADD_MONTHS(date,number) : 개월 수를 더하는 함수
SQL> select ename,
2 TO_CHAR(hiredate,'YYYY/MM/DD') 입사일,
3 TO_CHAR(ADD_MONTHS(hiredate,6), 'YYYY/MM/DD') "입사 6개월 후"
4 from emp;
ENAME 입사일 입사 6개월 후
-------------------- -------------------- --------------------
김사랑 2007/03/01 2007/09/01
한예슬 2007/04/02 2007/10/02
오지호 2005/02/10 2005/08/10
LAST_DAY(date) : 해당 달의 마지막 날짜를 반환
SQL> select ename,
2 TO_CHAR(hiredate,'YYYY/MM/DD') 입사일,
3 TO_CHAR(LAST_DAY(hiredate),'YYYY/MM/DD')"마지막 날짜"
4 from emp;
ENAME 입사일 마지막 날짜
-------------------- -------------------- --------------------
김사랑 2007/03/01 2007/03/31
한예슬 2007/04/02 2007/04/30
오지호 2005/02/10 2005/02/28
NULL을 변환
예를 위한 데이터)
ENAME SAL COMM DEPTNO
-------------------- ---------- ---------- ----------
이문세 520 10
이병헌 500 10
조인성 250 10
이병헌 600 20
안성기 1000 20
박중훈 560 20
김사랑 300 20
강혜정 300 20
오지호 500 100 30
한예슬 250 80 30
감우성 500 0 30
=> comm 부분의 빈값은 NULL로 처리 되어있다.
/* 연봉 : 월급여 * 12 + 커미션 : sal * 12 + comm */
SQL> select ename,sal,comm,deptno, sal*12+comm
2 from emp
3 order by deptno;
ENAME SAL COMM DEPTNO SAL*12+COMM
-------------------- ---------- ---------- ---------- -----------
이문세 520 10
이병헌 500 10
조인성 250 10
이병헌 600 20
안성기 1000 20
박중훈 560 20
김사랑 300 20
강혜정 300 20
오지호 500 100 30 6100
한예슬 250 80 30 3080
감우성 500 0 30 6000
=> comm부분이 NULL로 되어있어서 연산이 안된 부분들이 있다.
연산을 하기 위해서는 NULL->0으로 바꿔줘야한다.
NVL(expr1,expr2) : null을 다른 값으로 변환
수치 데이터를 사용한 NVL(comm,0)
날짜 데이터를 사용한 NVL(hiredate,TO_DATE('2015/03/10','YYYY-MM-DD')
문자 데이터를 사용한 NVL(job,'매니저')
SQL> select ename,sal,NVL(comm,0),sal*12+NVL(comm,0)
2 from emp
3 order by deptno;
=> 위에 코드에서 NULL->0으로 변환
ENAME SAL NVL(COMM,0) SAL*12+NVL(COMM,0)
-------------------- ---------- ----------- ------------------
이문세 520 0 6240
이병헌 500 0 6000
조인성 250 0 3000
이병헌 600 0 7200
안성기 1000 0 12000
박중훈 560 0 6720
김사랑 300 0 3600
강혜정 300 0 3600
오지호 500 100 6100
한예슬 250 80 3080
감우성 500 0 6000
조향기 280 0 3360
장동건 480 0 5760
신동협 450 200 5600
=> NULL값이 0으로 바뀌면서 연산 가능
NVL2(expr1, expr2, expr3)
expr1의 결과가 null이 아니면 expr2 반환
expr1의 결과가 null이면 expr3 반환
SQL> select ename, sal, comm, NVL2(comm, sal*12+comm,sal*12) from emp order by deptno;
=> 모든 null을 0으로 바꾸는것이 아니고 필요에 따라 조건을 실행 시키기 때문에 처리속도가 약간 더 빠름
DECODE(표현식, 조건1, 결과1,
조건2, 결과2,
조건3, 결과3,
기본결과);
=> 기본결과값은 안써도 무관
SQL> select ename, deptno,
2 decode(deptno,10,'인사부',
3 20,'영업부',
4 30,'개발부',
5 '수습'
6 ) from emp;
ENAME DEPTNO DECODE(DEPTNO,10,'
-------------------- ---------- ------------------
김사랑 20 영업부
한예슬 30 개발부
오지호 30 개발부
이병헌 20 영업부
신동협 30 개발부
장동건 30 개발부
'DataBase' 카테고리의 다른 글
관계형 데이터베이스 (0) | 2021.04.08 |
---|---|
데이터와 데이터베이스 (0) | 2021.04.08 |
데이터베이스 - 제약조건 (0) | 2021.04.08 |
[Oracle] SQL 명령어 (0) | 2021.04.05 |
[MySQL] (0) | 2021.02.23 |