ORDER BY 절
- 정렬
ASC
|
오름차순
|
생략 가능하다.
SELECT * FROM emp ORDER BY sal ASC; SELECT * FROM emp ORDER BY sal; |
|
DESC
|
내림차순
|
SELECT * FROM emp ORDER BY sal DESC;
|
2차 정렬 >
- 1차 정렬 후 급여로 내림차순 하고 2차 정렬로 중복된 부분도 내림차순 해준다.
- 쉼표로 구분해서 작성
SELECT * FROM emp ORDER BY sal DESC, ename DESC;
SELECT * FROM emp ORDER BY job ASC, ename DESC;
<날짜 정렬>
내림차순 =>
SELECT ename,job,deptno,hiredate FROM emp ORDER BY hiredate DESC;

열 알리아스를 기준으로 정렬
SELECT empno,ename,sal*12 annsal FROM emp ORDER BY annsal; -- 오름차순 정렬
열의 숫자 위치를 사용하여 정렬
※순서는 1번부터 시작한다.
--열 순서: 1 2 3 4
SELECT ename,job,deptno,hiredate FROM emp ORDER BY 3;

*을 사용할 경우 테이블 생성시 명시한 컬럼 순으로 번호 부여
SELECT * FROM emp ORDER BY 2;

NULL 을 정렬했을 때 >>
오름차순 -
SELECT * FROM emp ORDER BY comm;

내림차순

내림차순 하면 NULL이 맨 위로 올라가는데, 강제로 아래로 내리고 싶을 때 NULLS LAST 사용
SELECT * FROM emp ORDER BY comm DESC NULLS LAST; --내림차순 정렬, NULL 값은 마지막에 정렬

오름차순 하면 NULL 이 맨 아래에 있는데, 강제로 위로 올리고 싶으면 NULLS FIRST 사용
SELECT * FROM emp ORDER BY comm ASC NULLS FIRST; -- 오름차순 정렬, NULL 값은 처음에 정렬

SELECT * FROM emp ORDER BY comm ASC NULLS FIRST, ename DESC;
=> NULL 정렬 후 , 중복된 값이 있다면 ename 내림차순
[실습문제]
1)emp테이블에서 사원번호,사원이름,입사일을 출력하는데 입사일이 빠른 사람순으로 정렬하시오.
2)emp 테이블에서 사원이름, 급여,연봉을 구하고 연봉이 많은 순으로 정렬하시오.
3) 10번 부서 또는 20번 부서에서 근무하고 있는 사원의 이름과 부서번호를 출력하는데 이름을 영문자순으로 표시하시오.
4) 커미션 계약을 맺은 모든 사원의 이름,급여,커미션을 출력하는데 커미션을 기준으로 내림차순 정렬하시오.
SELECT empno,ename,hiredate FROM emp ORDER BY hiredate ASC;
SELECT ename,sal,sal*12 annsal FROM emp ORDER BY annsal DESC;
SELECT ename,deptno FROM emp WHERE deptno IN (10,20) ORDER BY ename ASC;
SELECT ename,sal,comm FROM emp WHERE comm IS NOT NULL ORDER BY comm DESC;
함수
1) 문자함수
① 대소문자 조작 함수 : LOWER,UPPER,INITCAP
LOWER --소문자로 변환
SELECT LOWER('HELLO') FROM dual;

UPPER
SELECT UPPER('welcome') FROM dual;

INITCAP
SELECT INITCAP('hello wORLD') FROM dual;

문자함수
|
|
대소문자 조작 함수
|
LOWER,UPPER,INITCAP
|
LOWER
|
소문자로 변환
|
UPPER
|
대문자로 변환
|
INITCAP
|
문장의 첫글자를 대문자로 변환
|
② 문자 조작 함수 : CONCAT, SUBSTR,LENGTH, INSTR, LPAD, RPAD,TRIM, REPLACE
1) CONCAT
CONCAT(문자열1,문자열2) : 문자열1과 문자열2를 연결하여 하나의 문자열로 반환
SELECT CONCAT('Hello','World') FROM dual;
SELECT CONCAT(ename,job) FROM emp;


2) SUBSTR
SUBSTR(대상문자열,인덱스) : 대상문자열에서 지정한 인덱스부터 문자열을 추출
-- 주의 : 인덱스 1부터 시작
SUBSTR('Hello World',3)
|
3번째 인덱스부터 문자열 추출
|
SUBSTR('Hello World',3,3)
|
지정한 인덱스부터 3개만 추출
|
('Hello World',-3)
|
뒤에서 세번째부터 끝까지 추출
|
SUBSTR('Hello World',-3,2)
|
뒤에서 세번째부터 2개만 추출
|
SELECT SUBSTR('Hello World',3) FROM dual;
SELECT SUBSTR('Hello World',3,3) FROM dual;
SELECT SUBSTR('Hello World',-3) FROM dual;
SELECT SUBSTR('Hello World',-3,2) FROM dual;

3) LENGTH
LEGNTH(문자열) : 문자열 길이
SELECT LENGTH('Hello World') FROM dual;

4) INSTR
- INSTR(대상문자열,검색문자) : 검색문자의 위치값 검색
- 검색 문자가 없을 경우 0 반환
INSTR('Hello World','o',6)
|
(대상문자열,검색문자,검색인덱스 : 해당위치부터 검색)
|
INSTR('Hello World','o',1,2)
|
(대상문자열,검색문자,검색인덱스,반복횟수)
|
SELECT INSTR('Hello World','e') FROM dual;

검색문자가 없을 경우 0
SELECT INSTR('Hello World','E') FROM dual;

SELECT INSTR('Hello World','o',6) FROM dual;
SELECT INSTR('Hello World','o',1,2) FROM dual;
5) LPAD
LPAD(대상문자열,총길이,문자) : 지정한 길이에 문자열을 출력하는데 공백은 왼쪽에 지정한 문자로 채움
SELECT LPAD('Hello',10,'*') FROM dual;
6) RPAD
RPAD(대상문자열,총길이,문자) : 지정한 길이에 문자열을 출력하는데 공백은 오른쪽에 지정한 문자로 채움
SELECT RPAD('Hello',10,'~') FROM dual;
7) TRIM
TRIM : 문자열에서 공백이나 특정 문자를 제거한 다음 값을 반환
방향 : 왼쪽->LEADING, 오른쪽 ->TRAILING, 양쪽->BOTH(DEFAULT)
SELECT TRIM(LEADING 'h' FROM 'habchh') FROM dual;
SELECT TRIM(BOTH 'h' FROM 'habchh') FROM dual;
8) REPLACE
REPLACE(대상문자열,old,new) : 대상문자열에서 old문자를 new문자로 대체
SELECT REPLACE('010.1234.5678','.','-') FROM dual;

CONCAT(문자열1,문자열2)
|
문자열1과 문자열2를 연결하여 하나의 문자열로 반환
|
SUBSTR(대상문자열,인덱스)
|
대상문자열에서 지정한 인덱스부터 문자열을 추출
|
LEGNTH(문자열)
|
문자열 길이
|
INSTR(대상문자열,검색문자)
|
검색문자의 위치값 검색
|
LPAD(대상문자열,총길이,문자)
|
지정한 길이에 문자열을 출력하는데 공백은 왼쪽에 지정한 문자로 채움
|
RPAD(대상문자열,총길이,문자)
|
지정한 길이에 문자열을 출력하는데 공백은 오른쪽에 지정한 문자로 채움
|
TRIM
|
문자열에서 공백이나 특정 문자를 제거한 다음 값을 반환
|
REPLACE(대상문자열,old,new)
|
대상문자열에서 old문자를 new문자로 대체
|
[실습문제]
1) emp 테이블의 업무(job)을 첫글자는 대문자 나머지는 소문자로 출력하시오.
2) emp 테이블에서 사원이름 중 A가 포함된 사원이름을 구하고 그 이름 중 앞에서 3자만 추출하여 출력하시오.
3) 이름의 세번째 문자가 A인 모든 사원의 이름을 표시하시오.
4) 이름의 글자수가 6자 이상인 사원의 이름을 소문자로 이름만 출력하시오.
5) 모든 사원의 이름과 급여를 표시하는데 급여는 15자 길이로 왼쪽에 $기호가 채워진 형식으로 표기하고 열 레이블 SALARY로 지정하시오.
SELECT INITCAP(job) FROM emp;
SELECT SUBSTR(ename,1,3) FROM emp WHERE ename LIKE '%A%';
--3번 두가지 방법
SELECT ename FROM emp WHERE SUBSTR(ename,3,1)='A';
SELECT ename FROM emp WHERE ename LIKE '__A%';
--
SELECT LOWER(ename) FROM emp WHERE LENGTH(ename)>=6;
SELECT ename, LPAD(sal,15,'$') "SALARY" FROM emp;--SALARY에 큰따옴표 해도 되고 안해도 된다.
2) 숫자 함수
CEIL
CEIL(실수) : 올림 처리한 정수값을 반환
SELECT CEIL(1.4) FROM dual;
FLOOR
FLOOR(실수) : 버림 처리한 정수값을 반환
SELECT FLOOR(1.7) FROM dual;
ROUND
ROUND(대상숫자,지정자릿수) : 반올림
SELECT ROUND(45.926,2) FROM dual;
SELECT ROUND(45.926) FROM dual;
TRUNC
TRUNC(대상숫자,지정자리수) : 절삭
SELECT TRUNC(45.926,2) FROM dual;
SELECT TRUNC(45.926) FROM dual;
MOD
MOD(대상숫자,나눌숫자) : 나머지값
SELECT MOD(17,2) FROM dual;
CEIL(실수)
|
올림 처리한 정수값을 반환
|
FLOOR(실수)
|
버림 처리한 정수값을 반환
|
ROUND(대상숫자,지정자릿수)
|
반올림
|
TRUNC(대상숫자,지정자리수)
|
절삭
|
MOD(대상숫자,나눌숫자)
|
나머지값
|
3) 날짜함
SYSDATE
- ORACLE 서버의 현재 날짜와 시간을 반환
SELECT SYSDATE FROM dual;
날짜에 산술 연산자 사용
SELECT ename, (SYSDATE -hiredate)/7 AS WEEKS FROM emp WHERE deptno=10;
MONTHS_BETWEEN
MONTHS_BETWEEN(날짜1,날짜2) : 두 날짜 간의 월 수
큰 날짜는 앞에 두고, 작은 날짜는 뒤에 작성해야 음수가 아닌 양수값이 나온다.
SELECT MONTHS_BETWEEN('2023-03-23','2022-01-23') FROM dual;

SELECT ename, ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) months_worked FROM emp ORDER BY months_worked;
ADD_MONTHS
ADD_MONTHS : 특정 날짜의 월에 정수를 더한 다음 해당 날짜를 반환하는 함수
SELECT ADD_MONTHS('2023-09-10',8) FROM dual;
NEXT_DAY
NEXT_DAY : 지정된 요일의 다음 날짜
SELECT NEXT_DAY('2023-09-05','월요일') FROM dual;

1(일요일) ~ 7(토요일)
SELECT NEXT_DAY('2023-09-05',1) FROM dual;

LAST_DAY
LAST_DAY : 월의 마지막 날
SELECT LAST_DAY('2023-09-22') FROM dual;
EXTRACT
EXTRACT : 날짜 정보에서 특정한 연도,월,일,시간,분,초 등을 추출
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE), EXTRACT(DAY FROM SYSDATE) FROM dual;
SYSDATE
|
ORACLE 서버의 현재 날짜와 시간을 반환
|
MONTHS_BETWEEN(날짜1,날짜2)
|
두 날짜 간의 월 수
|
ADD_MONTHS
|
특정 날짜의 월에 정수를 더한 다음 해당 날짜를 반환하는 함수
|
NEXT_DAY
|
지정된 요일의 다음 날짜
1(일요일) ~ 7(토요일) |
LAST_DAY
|
월의 마지막 날
|
EXTRACT
|
날짜 정보에서 특정한 연도,월,일,시간,분,초 등을 추출
|
[실습]
1) 오늘부터 이번 달의 마지막날까지의 남은 날 수를 구하시오.
2) emp 테이블에서 각 사원에 대해 사원번호,이름,급여 및 15% 인상된 급여를 정수(반올림)로 표시하시오.
인상된 급여열의 레이블을 New Salary로 지정하시오.
3) 각 사원의 이름을 표시하고 근무 달 수 (입사일부터 현재까지의 달 수)을 계산하여 열레이블을 MONTHS_WORKED로 지정하시오.
결과는 정수로 반올림하여 표시하고 근무달 수 를 기준으로 오름차순 정렬
4) emp 테이블에서 이름(소문자로 표시),업무,근무연차를 출력하시오.
SELECT LAST_DAY(SYSDATE)-SYSDATE AS "남은 날 수 " FROM dual;
SELECT empno,ename,sal,ROUND(sal*1.15) "New Salary" FROM emp;
SELECT ename, ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) "MONTHS_WORKED" FROM emp ORDER BY "MONTHS_WORKED" ASC;
SELECT LOWER(ename),job,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) FROM emp;
4) 변환함수
TO_CHAR : 숫자 -> 문자, 날짜 -> 문자
TO_NUMBER : 문자 -> 숫자
TO_DATE : 문자 -> 날짜
TO_CHAR : 날짜 -> 문자
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM dual;
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual;
TO_CHAR : 숫자 -> 문자
실제 자리수와 일치 9999: 포맷문자
SELECT TO_CHAR (1234,9999) FROM dual;
SELECT TO_CHAR (1234,'9999') FROM dual;
SELECT TO_CHAR(1234,0000) FROM dual; --오류발생
SELECT TO_CHAR (1234,'0000') FROM dual;
9999를 숫자 그대로 써도 되고 작은따옴표로 감싸도 자리수로 인식한다.
0을 포맷 문자로 사용할 경우 0000은 숫자 그대로 쓰면 안되고, 작은따옴표를 꼭 넣어줘야 한다.
실제 자리수보다 자리수가 작을 경우 : 오류 발생
SELECT TO_CHAR(1234,999) FROM dual;
SELECT TO_CHAR(1234,'999') FROM dual;
SELECT TO_CHAR(1234,'000') FROM dual;
실제 자리수보다 많은 자리수 지정
SELECT TO_CHAR(1234,99999) FROM dual; -- 1234 =>맨앞에 공백이 생김
SELECT TO_CHAR(1234,'99999') FROM dual; -- 1234

SELECT TO_CHAR(1234,'00000') FROM dual; --01234

소수점 자리
SELECT TO_CHAR(1234,9999.99) FROM dual; --1234.00
SELECT TO_CHAR(1234,'9999.99') FROM dual; --1234.00
SELECT TO_CHAR(1234,'0000.00') FROM dual; --1234.00

반올림해서 소수점 둘째자리까지 표시
SELECT TO_CHAR(25.897,'99.99') FROM dual; --25.90

※ROUND는 정수 또는 실수로 인식하는데, TO_CHAR는 다 문자열로 인식한다.
통화표시
SELECT TO_CHAR(1234,'$0000') FROM dual;
각국의 통화를 표시하려면 작은따옴표 안에 L 을 넣는다.
SELECT TO_CHAR(1234,'L0000') FROM dual;
TO_DATE : 문자 -> 날짜
SELECT TO_DATE('23-09-22','YYYY-MM-DD') FROM dual;
SELECT TO_DATE('2023-09-30') FROM dual; -- 포맷형식 생략 가능
TO_NUMBER : 문자 -> 숫자
SELECT TO_NUMBER('100','999') FROM dual; -- '000'
SELECT TO_NUMBER('200') FROM dual; --포맷형식 생략
[실습문제]
1)emp 테이블에서 월급을 나눠서 4의 배수인 월급을 받는 사원의 이름과 월급을 출력하시오.
--(세자리 단위 쉼표 표시)
2) 각 사원의 이름을 표시하고 근무 달 수(입사일로부터 현재까지의 달 수)를 계산하여 표시
근무 달 수는 정수로 표시하는데 TO_CHAR를 활용해서 표시
SELECT ename,TO_CHAR(sal,'9,999') FROM emp WHERE MOD(sal,4)=0 ;
SELECT ename,TO_CHAR(MONTHS_BETWEEN(SYSDATE,hiredate),'999') AS "MONTHS_WORKED" FROM emp;
5) 일반 함수
NVL
NVL(value1, value2) : value1이 NULL이면 value2를 사용(value1과 value2의 자료형 일치)
※주의 !!!!!
SELECT ename,sal,comm,sal+comm 실급여 FROM emp; --올바르지 못함

위 경우는 comm이 null이면 실급여가 null이 발생해서 문제가 된다.
따라서, 아래처럼
SELECT ename,sal,comm,sal+NVL(comm,0) 실급여 FROM emp;
단, NVL의 comm과 0의 자료형이 같아야 한다. 둘다 숫자.

SELECT ename,sal+NVL(comm,'No Commission')"COMM." FROM emp;
위 문장은 에러가 발생한다. 왜?
comm은 숫자이고, 'NOCommission'은 문자열이어서 자료형이 다르기 때문이다.
따라서, 아래처럼 comm에 TO_CHAR를 이용하여 숫자데이터를 문자로 만들어준다.
NVL2
NVL2(value1,value2,value3) : value1이 NULL인지 평가.
NULL이면 value3, NULL이 아니면 value2 사용. (자료형이 일치하지 않아도 됨)
SELECT ename,comm,NVL2(comm,'commission','no commission') FROM emp;
= > comm이 Null이면 no commission 이다.

NULLIF
NULLIF(value1,value2) : 두개의 값이 일치하면 NULL, 두개의 값이 일치하지 않으면 value1
SELECT NULLIF(LENGTH(ename),LENGTH(job)) "NULLIF" FROM emp;
COALESCE
COALESCE(value1,value2,value3....) : NULL값이 아닌 값을 사용(자료형 일치)
SELECT comm,mgr,sal,COALESCE(comm,mgr,sal) FROM emp;

<CASE ~ WHEN~ THEN~ ELSE>
CASE 컬럼 WHEN 비교값 THEN 결과값
WHEN THEN
WHEN THEN
(ELSE 결과값)
SELECT ename,sal, job,
CASE job WHEN 'SALESMAN' THEN sal*0.1
WHEN 'MANAGER' THEN sal*0.2
WHEN 'ANALYST' THEN sal*0.3
ELSE sal*0.4
END "Bonus"
FROM emp;

SELECT ename,sal,job,
CASE WHEN sal>=4000 AND sal<=5000 THEN 'A'
WHEN sal>=3000 AND sal<4000 THEN 'B'
WHEN sal>=2000 AND sal<3000 THEN 'C'
WHEN sal>=1000 AND sal<2000 THEN 'D'
ELSE 'F'
END "Grade"
FROM emp ORDER BY "Grade" ASC, sal DESC;

DECODE
DECODE : 오라클 전용, = 비교만 가능
SELECT ename,sal,job,
DECODE(job,'SALESMAN',sal*0.1,
'MANAGER',sal*0.2,
'ANALYST',sal*0.3,
sal*0.4) "Bonus"
FROM emp;

SELECT ename,sal,job,
DECODE(TRUNC(sal/1000),5,'A',
4,'A',
3,'B',
2,'C',
1,'D',
'F') "Grade"
FROM emp ORDER BY "Grade",sal DESC;

NVL(value1, value2)
|
value1이 NULL이면 value2를 사용(value1과 value2의 자료형 일치)
|
NVL2(value1,value2,value3)
|
value1이 NULL인지 평가.
NULL이면 value3, NULL이 아니면 value2 사용. (자료형이 일치하지 않아도 됨) |
NULLIF(value1,value2
|
두개의 값이 일치하면 NULL, 두개의 값이 일치하지 않으면 value1
|
COALESCE(value1,value2,value3....)
|
NULL값이 아닌 값을 사용(자료형 일치)
|
CASE ~ WHEN~ THEN~ ELSE
|
중요!!외우기!
|
DECODE
|
오라클 전용, = 비교만 가능
|
<총 내용>
SELECT TRIM(LEADING 'h' FROM 'habchh') FROM dual;
SELECT TRIM(BOTH 'h' FROM 'habchh') FROM dual;
REPLACE(대상문자열,old,new) : 대상문자열에서 old문자를 new문자로 대체
SELECT REPLACE('010.1234.5678','.','-') FROM dual;
함수 중첩
SELECT ename, LOWER(SUBSTR(ename,1,3)) FROM emp;
숫자함수
CEIL(실수) : 올림 처리한 정수값을 반환
SELECT CEIL(1.4) FROM dual;
FLOOR(실수) : 버림 처리한 정수값을 반환
SELECT FLOOR(1.7) FROM dual;
ROUND(대상숫자,지정자릿수) : 반올림
SELECT ROUND(45.926,2) FROM dual;
SELECT ROUND(45.926) FROM dual;
SELECT empno,ename,sal,ROUND(sal*1.15) "New Salary", ROUND(sal*1.15)-sal "INCREASE" FROM emp;
TRUNC(대상숫자,지정자리수) : 절삭
SELECT TRUNC(45.926,2) FROM dual;
SELECT TRUNC(45.926) FROM dual;
MOD(대상숫자,나눌숫자) : 나머지값
SELECT MOD(17,2) FROM dual;
날짜함수
SYSDATE : ORACLE 서버의 현재 날짜와 시간을 반환
SELECT SYSDATE FROM dual;
날짜에 산술 연산자 사용
SELECT ename, (SYSDATE -hiredate)/7 AS WEEKS FROM emp WHERE deptno=10;
MONTHS_BETWEEN(날짜1,날짜2) : 두 날짜 간의 월 수
SELECT MONTHS_BETWEEN('2023-03-23','2022-01-23') FROM dual;
SELECT ename, ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) months_worked FROM emp ORDER BY months_worked;
ADD_MONTHS : 특정 날짜의 월에 정수를 더한 다음 해당 날짜를 반환하는 함수
SELECT ADD_MONTHS('2023-09-10',8) FROM dual;
NEXT_DAY : 지정된 요일의 다음 날짜
SELECT NEXT_DAY('2023-09-05','월요일') FROM dual;
1(일요일) ~ 7(토요일)
SELECT NEXT_DAY('2023-09-05',1) FROM dual;
LAST_DAY : 월의 마지막 날
SELECT LAST_DAY('2023-09-22') FROM dual;
EXTRACT : 날짜 정보에서 특정한 연도,월,일,시간,분,초 등을 추출
SELECT EXTRACT(YEAR FROM SYSDATE), EXTRACT(MONTH FROM SYSDATE), EXTRACT(DAY FROM SYSDATE) FROM dual;
변환함수
TO_CHAR : 숫자 -> 문자, 날짜 -> 문자
TO_NUMBER : 문자 -> 숫자
TO_DATE : 문자 -> 날짜
TO_CHAR : 날짜 -> 문자
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM dual;
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual;
TO_CHAR : 숫자 -> 문자
실제 자리수와 일치 9999: 포맷문자
SELECT TO_CHAR (1234,9999) FROM dual;
SELECT TO_CHAR (1234,'9999') FROM dual;
SELECT TO_CHAR(1234,0000) FROM dual; --오류발생
SELECT TO_CHAR (1234,'0000') FROM dual;
실제 자리수보다 자리수가 작을 경우 : 오류 발생
SELECT TO_CHAR(1234,999) FROM dual;
SELECT TO_CHAR(1234,'999') FROM dual;
SELECT TO_CHAR(1234,'000') FROM dual;
실제 자리수보다 많은 자리수 지정
SELECT TO_CHAR(1234,99999) FROM dual; -- 1234
SELECT TO_CHAR(1234,'99999') FROM dual;-- 1234
SELECT TO_CHAR(1234,'00000') FROM dual;--01234
소수점 자리
SELECT TO_CHAR(1234,9999.99) FROM dual; --1234.00
SELECT TO_CHAR(1234,'9999.99') FROM dual; --1234.00
SELECT TO_CHAR(1234,'0000.00') FROM dual; --1234.00
반올림해서 소수점 둘째자리까지 표시
SELECT TO_CHAR(25.897,'99.99') FROM dual; --25.90
인상된 급여를 소수점 첫째자리까지 표시
SELECT TO_CHAR(sal*1.15,'9,999.9') FROM emp;
통화표시
SELECT TO_CHAR(1234,'$0000') FROM dual;
SELECT TO_CHAR(1234,'L0000') FROM dual;
TO_DATE : 문자 -> 날짜
SELECT TO_DATE('23-09-22','YYYY-MM-DD') FROM dual;
SELECT TO_DATE('2023-09-30') FROM dual; -- 포맷형식 생략 가능
TO_NUMBER : 문자 -> 숫자
SELECT TO_NUMBER('100','999') FROM dual; -- '000'
SELECT TO_NUMBER('200') FROM dual; --포맷형식 생략
일반 함수
--NVL(value1, value2) : value1이 NULL이면 value2를 사용(value1과 value2의 자료형 일치)
SELECT ename,sal,comm,sal+NVL(comm,0) 실급여 FROM emp;
SELECT ename,NVL(TO_CHAR(comm),'No Commission') "COMM." FROM emp;
NVL2(value1,value2,value3) : value1이 NULL인지 평가.
NULL이면 value3, NULL이 아니면 value2 사용. (자료형이 일치하지 않아도 됨)
SELECT ename,comm,NVL2(comm,'commission','no commission') FROM emp;
NULLIF(value1,value2) : 두개의 값이 일치하면 NULL, 두개의 값이 일치하지 않으면 value1
SELECT NULLIF(LENGTH(ename),LENGTH(job)) "NULLIF" FROM emp;
COALESCE(value1,value2,value3....) : NULL값이 아닌 값을 사용(자료형 일치)
SELECT comm,mgr,sal,COALESCE(comm,mgr,sal) FROM emp;
--CASE 컬럼 WHEN 비교값 THEN 결과값
-- WHEN THEN
-- WHEN THEN
-- (ELSE 결과값)
SELECT ename,sal, job,
CASE job WHEN 'SALESMAN' THEN sal*0.1
WHEN 'MANAGER' THEN sal*0.2
WHEN 'ANALYST' THEN sal*0.3
ELSE sal*0.4
END "Bonus"
FROM emp;
SELECT ename,sal,job,
CASE WHEN sal>=4000 AND sal<=5000 THEN 'A'
WHEN sal>=3000 AND sal<4000 THEN 'B'
WHEN sal>=2000 AND sal<3000 THEN 'C'
WHEN sal>=1000 AND sal<2000 THEN 'D'
ELSE 'F'
END "Grade"
FROM emp ORDER BY "Grade" ASC, sal DESC;
DECODE : 오라클 전용, = 비교만 가능
SELECT ename,sal,job,
DECODE(job,'SALESMAN',sal*0.1,
'MANAGER',sal*0.2,
'ANALYST',sal*0.3,
sal*0.4) "Bonus"
FROM emp;
SELECT ename,sal,job,
DECODE(TRUNC(sal/1000),5,'A',
4,'A',
3,'B',
2,'C',
1,'D',
'F') "Grade"
FROM emp ORDER BY "Grade",sal DESC;
'학원 > Oracle' 카테고리의 다른 글
23.10.04(수) 23일차 - PL/SQL (0) | 2023.10.04 |
---|