JAVA 웹개발 과정 국비 17일차 정리

17일차

※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!


1 Oracle 내장 함수 (Function) 이어서…

1) 문자열 관련 함수

① SUBSTR(‘문자열’,시작위치,길이) : CHAR or NUMBER

길이는 생략 가능한 파라미터로, default 값은 문자열의 끝이다.
숫자로 된 문자열을 잘라내서 숫자로 대소 비교 가능하다.

-- wise 출력
SELECT SUBSTR('A wise man will', 3, 4) FROM dual;
-- employee 테이블에서 직원들의 이름과 성만 출력해보세요
SELECT SUBSTR(emp_name,1,1)  FROM employee ORDER BY 1;
-- employee 테이블에서 남자만 사원번호, 사원명을 나타내세요
SELECT emp_id, emp_name FROM employee WHERE SUBSTR(emp_no,8,1) = 1;

② REPLACE(‘대상문자열’, ‘교체문자열’,’바꿔질문자열’) : CHAR

문자열 내에서 특정 문자열을 다른 문자열로 교체(대체)

-- employee 테이블에서 직원의 이름과 이메일을 출력하되, 이메일은 kh.or.kr 에서
-- iei.or.kr로 변경해서 출력하세요.
SELECT emp_name, REPLACE(email,'kh','iei') FROM employee;

2) 숫자 관련 함수

① ROUND(실수형, 소수점 몇번째까지 반올림) : NUMBER

실수형을 받아 소수점 지정 자리까지 반올림하여 리턴하는 함수
음수값도 사용 가능하다.

-- 126.5 출력
SELECT ROUND(126.456, 1) FROM dual;
-- 100 출력
SELECT ROUND(126.456, -2) FROM dual;

② FLOOR(소수점) : NUMBER

소수점을 버리는 함수. 정수형으로 출력된다.
정수형도 파라미터로 입력 가능하다.

-- 126 출력
SELECT FLOOR(126.456) FROM dual;
SELECT FLOOR(126) FROM dual;

③ TRUNC(실수형, 원하는 소수점자리) : NUMBER

원하는 소수점 자리까지 출력하며 나머지를 버린다.
음수값도 사용 가능하다.

-- 123.4 출력
SELECT TRUNC(123.456, 1) FROM dual;
-- 120 출력
SELECT TRUNC(123.456, -1) FROM dual;

④ CEIL(실수형) : NUMBER

소수점을 올림하여 정수형으로 출력하는 함수.
FLOOR 함수와 마찬가지로 정수형도 사용은 가능하다.

-- 123 출력
SELECT CEIL(123.456) FROM dual;
-- 123 출력
SELECT CEIL(123) FROM dual;

⑤ ABS(숫자) : NUMBER

파라미터 값을 절대값으로 반환해주는 함수.

-- 123 출력
SELECT ABS(-123) FROM dual;
-- 123.123 출력
SELECT ABS(-123.123) FROM dual;

3) 날짜 관련 함수

날짜타입을 파라미터로 받으며, 숫자는 불가능하다.

① SYSDATE

이전에 정리한 것처럼, 현재 날짜까지 보여주며 객체 자체는 초 데이터까지 가지고 있다.

-- 현재 날짜를 년/월/일 로 출력
SELECT SYSDATE FROM dual;

② LOCALTIMESTAMP

SYSDATE와 같은 기능이지만 시,분,초,밀리초 데이터까지 보여준다.

-- 현재 날짜&시간을 년/월/일 시:분:초.밀리초 로 출력
SELECT LOCALTIMESTAMP FROM dual;

③ MONTHS_BETWEEN(날짜,날짜) : NUMBER

파라미터로 전달되는 두개의 날짜 사이의 개월수를 리턴하는 함수

-- 기본적으로 실수형으로 출력된다. (딱 떨어지지 않는 한)
SELECT MONTHS_BETWEEN(SYSDATE,hire_date) FROM employee;

④ ADD_MONTHS(날짜, 숫자) : NUMBER

파라미터로 전달받는 날짜에 숫자만큼의 개월을 더해서 리턴하는 함수

-- 21/10/29 출력
SELECT ADD_MONTHS(SYSDATE, 1) FROM dual;

⑤ NEXT_DAY(날짜, ‘월~일요일’) : DATE

파라미터 날짜로부터 가장 가까운 두번째 파라미터에 해당하는 요일의 날짜를 리턴하는 함수

-- 21/09/29 출력, 21/10/04 출력
SELECT SYSDATE, NEXT_DAY(SYSDATE, '월요일') FROM dual;

⑥ LAST_DAY(날짜) : DATE

파라미터로 전달받은 날짜가 속한 달의 마지막 날짜를 리턴하는 함수

-- 다음달(10월) 마지막 날짜는 며칠일까요?
SELECT LAST_DAY(ADD_MONTHS(SYSDATE,1)) FROM dual;

⑦ EXTRACT(YEAR/MONTH/DAY FROM 날짜) : DATE

파라미터로 전달된 날짜로부터 연/월/일 값을 추출해서 리턴하는 함수

-- 2021 출력
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual;

4) 형 변환 함수

날짜 -> 숫자 변환 함수는 존재하지 않는다.

① TO_CHAR(날짜, ‘문자열’) : CHAR

두번째 파라미터인 문자열에 아무렇게나 넣을 수는 없고, 정해진 양식을 맞추어야 한다.
사용자 방식대로 출력하고 싶다면 “ “(큰 따옴표)로 감싸주면 가능하다.
숫자/날짜 타입을 문자열로 변경하여 리턴하는 함수

-- 2021-09-29 출력
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;
-- 2021-09-29 수요일 출력
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DAY') FROM dual;
-- 2021-09-29(수) 출력
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD(DY)') FROM dual;
-- 2021-09-29 09:11:50 출력
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM dual;
-- 2021년09월29일 09:12:10 출력
SELECT TO_CHAR(SYSDATE, 'YYYY"년"MM"월"DD"일" HH:MI:SS') FROM dual;
-- 008,000,000 출력 (빈자리도 0으로 표기됨)
SELECT emp_name, TO_CHAR(salary,'000,000,000') FROM employee;
-- 8,000,000 출력 (빈자리 0 표기 안됨, 주로 씀)
SELECT emp_name, TO_CHAR(salary,'999,999,999') FROM employee;
-- ₩8,000,000 출력 (local 통화(한국-원))
SELECT emp_name, TO_CHAR(salary,'L999,999,999') FROM employee;

② TO_DATE(‘문자열’/숫자,날짜) : DATE

문자 또는 숫자를 날짜로 형변환 시켜 리턴하는 함수
출력하고 싶은 형식이 아닌, 날짜로 바꾸고 싶은 형식을 두번째 파라미터에 써주어야 한다. 헷갈리지 말 것.
아래 3번째 예제를 보면, 날짜 형식을 ‘YYYYMMDD’로 표기했는데도 불구하고 출력 시에는 20/09/05로 나온다.

-- 20/09/05 출력 (default 동작 8글자, 6글자)
SELECT TO_DATE(20200905) FROM dual;
SELECT TO_DATE(200905) FROM dual;
-- 20/09/05 출력 (출력하고 싶은 형식 X , 날짜로 바꾸고 싶은 형식 O)
SELECT TO_DATE(20200905, 'YYYYMMDD') FROM dual;
SELECT TO_DATE('20200905', 'YYYYMMDD') FROM dual;
-- 2030년 12월 25일은 무슨 요일일까요?
SELECT TO_CHAR(TO_DATE(20301225),'DAY') FROM dual;

③ TO_NUMBER(‘문자열’,숫자) : NUMBER

문자를 숫자로 바꿔서 리턴하는 함수
오라클은 문법 맥락을 분석하여 숫자와 문자열의 자동 형변환을 지원하기 때문에 굳이 쓸일이 없다고 한다.

-- 15 출력  
SELECT '10' + 5 FROM dual;
SELECT to_number('10') + 5 FROM dual;

5) 선택 함수

① DECODE(비교할 데이터, 조건, 동작, 조건, 동작, … , DEFAULT)

자바의 switch 문과 동일하게 동작한다.
== 비교를 통한 분기점을 생성한다.
조건 & 동작이 짝으로 파라미터에 들어가야 하며, 동작 하나만 파라미터로 받을 경우 default 값이 된다. (파라미터가 가변인자이다)

-- 주민등록번호로 성별을 '남','여','없음' 으로 구분 
SELECT emp_name, DECODE(substr(emp_no,8,1),1,'남',2,'여','없음') 
FROM employee;

② CASE/WHEN/THEN/ELSE/END

자바의 if 문과 동일하게 동작한다.
<= >= > < == 비교를 통한 분기점을 생성한다.
CASE/END 안에 WHEN 조건절 THEN 동작 쿼리 를 각각 넣어주며, ELSE로 default 값을 적어줄 수 있다.

-- 주민등록번호로 성별을 '남','여','없음' 으로 구분 
SELECT 
    CASE
        WHEN SUBSTR(emp_no,8,1) = 1 THEN '남'
        WHEN SUBSTR (emp_no,8,1) = 2 THEN '여'
        ELSE '없음'
    END 성별
FROM employee;

6) 그룹 함수

① 합계함수 SUM

그룹함수끼리는 사용할 수 있지만, SELECT문에 그룹함수와 단일 행 함수를 같이 쓰게되면 오류가 난다.

SELECT SUM(salary) FROM employee;
-- SELECT emp_name, SUM(salary) FROM employee; ---> 오류

② 평균함수 AVG

SELECT AVG(salary) FROM employee;

③ COUNT 함수

개수를 측정하는 함수
NULL 값은 포함하지 않는다.

SELECT COUNT(emp_name) FROM employee;
-- 행 개수를 COUNT 하고 싶을 때
SELECT COUNT(*) FROM employee;
-- 남직원의 수를 출력해보세요.
SELECT COUNT(*) FROM employee WHERE SUBSTR(emp_no,8,1)=1;

④ MIN / MAX 함수

SELECT MIN(salary), MAX(salary) FROM employee;
-- D5부서에서 급여가 가장 높은 직원의 salary 값을 출력해보세요.
SELECT MAX(salary) FROM employee WHERE dept_code = 'D5';

2. 그 외..

  • DISTINCT
    • 간단하고 가벼운 중복 제거 키워드
    • 가장 앞쪽 컬럼에만 (SELECT 바로 뒤에만) 사용 가능
    • DISTINCT 후 다음 여러 값이 출력되는 컬럼을 SELECT 한다면 중복 제거가 되지 않으니 주의해서 사용해야 한다.

댓글남기기