한번에 하나의 데이터를 처리
데이터의 타입에 맞는 함수를 사용해야 합니다.(return type)
함수를 중첩으로 사용가능
엄청 많이 있으니 찾아보고 쓸것
오라클에서 날짜 연산규칙
날짜 연산 | 설명 | 반환값 |
---|---|---|
Date + Number | 날짜에 일수를 더한다. | Date |
Date - Number | 날짜에서 일수를 뺀다. | Date |
Date - Date | 날짜에서 날짜를 뺀다. | 일수 |
Date + Number / 24 | 날짜에 시간을 더할 때는 시간을 24로 나누어서 날짜에 더한다. | Date |
CHAR, VARCHAR, NUMBER, DATE, CLOB, BLOB ... 이 정도만 알아도 될듯
자동 형변환 유형
FROM | TO |
---|---|
VARCHAR2 or CHAR | NUMBER |
VARCHAR2 or CHAR | DATE |
NUMBER | VARCHAR2 |
DATE | VARVHAR2 |
ex) SELECT 1 + '2' FROM dual; >> 이건 숫자로 치환되서 알아서 3이라고 출력
성능과 안정성을 위해서 수동형변환을 하는걸 권장합니다.
함수 | 설명 |
---|---|
TO_CHAR | 지정형식에 따라서 숫자(ex. HH24MISS), 문자, 날짜(ex. YYYYMMDD) 값을 VARCHAR2 타입으로 변환한다. |
TO_NUMBER | 문자를 숫자 타입으로 변환한다. |
TO_DATE | 날짜를 나타내는 문자열을 지정 형식(ex. YYYYMMDDHH24MISS)의 날짜 타입으로 변환한다. |
NVL(열이름, 치환값)
not null 처리
DECODE(열이름, 조건, 치환값, 기본값)
CASE WHEN ELSE
CASE
WHEN 조건1 THEN 출력1
...
ELSE 출력
END
DECODE를 많이 쓴다는데
CASE로 표현을 제일 많이 하지않나?
c, java를 하다보니 CASE가 젤 보기 편한듯?
순위매기기
함수 | 설명 |
---|---|
RANK | 동일한 값이면 중복 순위를 부여하고, 다음 순위는 해당 개수만큼 건너뛰고 반환한다. RANK() OVER([PARTITION BY 열이름] ORDER BY 열이름) |
DENSE_RANK | 동일한 값이면 중복 순위를 부여하고, 다음 순위는 중복 순위와 상관없이 순차적으로 반환한다. |
ROW_NUMBER | 중복 관계없이 순차적으로 순위를 반환한다. |
다건을 동시처리 -> 결과는 하나임
GROUP BY 로 묶기 그룹에 조건이 필요하다면 HAVING절을 이용
SELECT 그룹함수(열 이름) FROM ~
COUNT, SUM, AVG, MAX, MIN ...
COUNT는 NULL값도 개수로 쳐서 계산 나머지는 NULL은 제외하고 계산
GROUP BY
그룹화하지않고 그룹함수를 쓰면 무조건 전체건수를 기준으로 계산한다
그룹화를 하면 그룹별로 계산이 가능
ex) type이라는 열이 있으면 GROUP BY type으로 하면
type | cnt |
---|---|
1 | 13 |
2 | 54 |
3 | 32 |
4 | 25 |
이런식으로 구분지어서 집계가 가능
HAVING
그룹화된 값에 조건식을 적용
GROUP BY 절 다음에 기술
모든 요소가 있다면 SELECT ~ FROM ~ WHRE ~ GROUP BY ~ HAVING ~ ORDER BY ~
이런식으로 쿼리가 펼쳐진다.
WHERE랑 HAVING을 헷갈리는 경우가 많은데 WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.