6)REMAINDER(n,c)
7)WIDTH_BUCKET(n,min,max,b)
사용예)회원테이블에서 회원들이 보유한 마일리지(100~20000)를 10개의 구간으로 나누고
각 회원들이 그 중 어느구간에 속하는지를 조회하시오
Alias는 회원번호,회원명,마일리지,구간값
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_MILEAGE AS 마일리지,
WIDTH_BUCKET(MEM_MILEAGE,20000,100,10) AS 등급
--max값을 초과하면 b+1값, min보다 작으면 0 (등급으로 하려면 max와 min의 위치 바꾸기)
FROM MEMBER;
사용예)회원들의 마일리지를 (100-25000)을 3개의 구간으로 구분하고 각 회원들이 속한 구간값이 1이하이면 '새싹회원', 2 구간에 속하면
'정상활동회원', 그 이상이면 'VIP회원'을 비고난에 출력하시오
Alias는 회원번호,회원명,마일리지,구간값,비고
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_MILEAGE AS 마일리지,
WIDTH_BUCKET(MEM_MILEAGE,100,25000,3) AS 구간값,
CASE WHEN WIDTH_BUCKET(MEM_MILEAGE,100,25000,3)<=1 THEN '새싹회원'
WHEN WIDTH_BUCKET(MEM_MILEAGE,100,25000,3)=2 THEN '정상활동회원'
ELSE 'VIP회원'
END AS 비고
FROM MEMBER;
날짜함수
1)SYSDATE
날짜타입은 LIKE연산자 쓰지말고 BETWEEN연산자를 쓰는 게 좋음.
ROUND(MONTHS_BETWEEN(SYSDATE,MEM_BIR)/12) -- 나이를 구할 수 있음
2)ADD_MONTHS(d, n)
사용예)사원테이블에서 입사일자가(HIRE_DATE)수습시작일이라 가정하고 정식 발령일자(3개월 후)를 조회하여
이번달에 입사한 사원을 조회하시오.
Alias는 사원번호,사원명,수습일자,발령일
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
HIRE_DATE AS 수습일자,
ADD_MONTHS(HIRE_DATE,3) AS 발령일
FROM EMP
WHERE EXTRACT(MONTH FROM ADD_MONTHS(HIRE_DATE,3)) = EXTRACT(MONTH FROM SYSDATE);
3)NEXT_DAY(d, c), LAST_DAY(d)
사용예)2005년 2월 제품별 매입합계를 조회하시오 --날짜가 요구사항에 있을 때 :조건이 됨
상품코드,상품명,매입수량합계,매입금액합계
SELECT A.BUY_PROD AS 상품코드,
B.PROD_NAME AS 상품명,
SUM(A.BUY_QTY) AS 매입수량합계,
SUM(A.BUY_QTY*A.BUY_COST) AS 매입금액합계
FROM BUYPROD A, PROD B
WHERE B.PROD_ID=A.BUY_PROD --조인조건
AND A.BUY_DATE BETWEEN TO_DATE('20050201') AND
LAST_DAY(TO_DATE('20050201'))
GROUP BY A.BUY_PROD, B.PROD_NAME
--상품코드가 같은 것끼리 모아라 / GROUP BY는 GROUP BY 다음에 나오는 컬럼의 같은 값끼리 모으는 것
ORDER BY 1;
4)MONTHS_BETWEEN(d1,d2)
사용예)회원테이블에서 회원들의 생년월일을 이용하여 경과된 개월 수를 조회하시오
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_BIR AS 생년월일,
ROUND(MONTHS_BETWEEN(SYSDATE,MEM_BIR)) AS 월수 -- /12하면 나이를 구할 수 있음
FROM MEMBER;
UPDATE 테이블명 SET 바꿀 컬럼명
5)EXTRACT(fmt FROM d)
** MEMBER 테이블에서 다음 자료를 수정하시오.
회원번호 : 'i001'
이름 : '최지현'
MEM_REGNO1 : '741220'=>'011220'
MEM_REGNO2 : '2384719'=>'4384719'
MEM_BIR : '1974/12/20'=>'2001/12/20'
UPDATE MEMBER
SET MEM_REGNO1='011220',
MEM_REGNO2='4384719',
MEM_BIR=TO_DATE('2001/12/20')
WHERE MEM_ID='i001';
SELECT MEM_ID,MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_BIR
FROM MEMBER
WHERE MEM_ID='i001';
회원번호 : 't001'
이름 : '성원태'
MEM_REGNO1 : '760506'=>'000506'
MEM_REGNO2 : '1454731'=>'3454731'
MEM_BIR : '1976/05/06'=>'2000/05/06'
UPDATE MEMBER
SET MEM_REGNO1='000506',
MEM_REGNO2='3454731',
MEM_BIR=TO_DATE('2000/05/06')
WHERE MEM_ID='t001';
SELECT MEM_ID,MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_BIR
FROM MEMBER
WHERE MEM_ID='t001';
회원번호 : 'e001'
이름 : '이혜나'
MEM_REGNO1 : '750501'=>'020501'
MEM_REGNO2 : '2406017'=>'4406017'
MEM_BIR : '1975/05/01'=>'2002/05/01'
UPDATE MEMBER
SET MEM_REGNO1='020501',
MEM_REGNO2='4406017',
MEM_BIR=TO_DATE('2002/05/01')
WHERE MEM_ID='e001';
SELECT MEM_ID,MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_BIR
FROM MEMBER
WHERE MEM_ID='e001';
COMMIT;
사용예)회원테이블에서 이번달 생일인 회원을 추출하시오
Alias는 회원번호,회원명,생년월일,마일리지
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_BIR AS 생년월일,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE EXTRACT(MONTH FROM MEM_BIR) = EXTRACT(MONTH FROM SYSDATE)+1 --다음달이 생일인 사람
사용예)사원테이블에서 근속년수를 계산하여 근속년수가 20년 이상인 사원을 조회하시오
Alias는 사원번호,사원명,입사일,근속년수이다
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
HIRE_DATE AS 입사일,
EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM HIRE_DATE) AS 근속년수
FROM EMP
WHERE EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM HIRE_DATE)>=20;
변환함수
정의된 자료의 형을 일시적으로 변환하여 반환
CAST,TO_NUMBER,TO_DATE,TO_CHAR이 제공됨
1)CAST(expr AS 타입)
사용예)
SELECT PROD_ID,
PROD_NAME,
PROD_COST,
CAST(PROD_PRICE AS VARCHAR2(10)) --숫자 오른쪽정렬, 문자 왼쪽정렬
FROM PROD
WHERE PROD_COST>=100000;
2)TO_CHAR(data[,fmt])
data는 문자열(CHAR,CLOB=>VARCHAR2),숫자,날짜 타입의 자료 --문자열에서 문자열은 VARCHAR2형식으로 바꾸는 데 사용됨
'fmt'는 변환하려는 형식지정 문자열
(1)날짜타입 형식지정 문자열
--------------------------------------------------------------------------
형식지정문자열 의미 사용예
--------------------------------------------------------------------------
AD,BC,CC 서기,세기 SELECT TO_CHAR(SYSDATE,'BC CC') FROM DUAL;
YYYY,YYY,YY,Y 년도 SELECT TO_CHAR(SYSDATE,'BC YYYY') FROM DUAL;
SELECT TO_CHAR(SYSDATE,'BC YYY') FROM DUAL; --오른쪽에서 세자리만
SELECT TO_CHAR(SYSDATE,'BC Y') FROM DUAL; --오른쪽에서 한자리
Q 분기 SELECT TO_CHAR(SYSDATE,'Q"분기"') FROM DUAL; --문자열 안에 쌍따옴표로 문자 추가 가능
MM,RM 월 SELECT TO_CHAR(SYSDATE,'YYYYMM RM') FROM DUAL; --RM : 로마식표현법
MONTH, MON SELECT TO_CHAR(SYSDATE,'YYYY MON') FROM DUAL;
W,WW,IW 주차 SELECT TO_CHAR(SYSDATE,'W WW IW') FROM DUAL;
--W는 주차(이번주에서 오늘이 몇 번째 날인지) / WW는 올해 첫 주부터 오늘이 몇 번째 주인지
DD,DDD,J 일 SELECT TO_CHAR(SYSDATE,'DD DDD J') FROM DUAL;
--DD는 해당 달 1일부터 지금까지 며칠이 경과되었는지 /DDD는 2021년에서 오늘까지 며칠이 경과되었는지 /
J는 기원전4712년부터 지금까지 경과된 일자
D,DY,DAY 주의 요일 SELECT TO_CHAR(SYSDATE,'D DY DAY') FROM DUAL;
--D는 일요일을 기준으로 오늘이 몇번째 날인지 /DY는 요일의 약자 /DAY는 요일의 FULL NAME
AM,PM,A.M.,P.M. 오전,오후 SELECT TO_CHAR(SYSDATE,'AM PM') FROM DUAL;
--주어진 날짜를 기준으로 지금이 오전인지 오후인지 나타냄
HH,HH12,HH24 시 SELECT TO_CHAR(SYSDATE,'HH HH24') FROM DUAL; --HH24는 24시간표시형식
MI 분 SELECT TO_CHAR(SYSDATE,'HH24:MI') FROM DUAL;
SS,SSSSS 초 SELECT TO_CHAR(SYSDATE,'HH24:MI:SS SSSSS') FROM DUAL;
--SSSSS는 오늘 0시0분0초부터 지금까지 경과된 시간을 초단위로 나타냄
" " 기타 사용자 정의
SELECT TO_CHAR(SYSDATE,'YYYY"년" MM"월" DD"일" HH24:MI:SS')
--''안에서 ""안의 값이 문자열로 반환되어 출력
FROM DUAL;
----------------------------------------------------------------------------