본문 바로가기
💿DBMS/오라클

[20210608] 단일 행 함수2, 다중 행 함수, 그룹 함수, 키, 조인

by 캔 2021. 6. 8.

4. 일반 함수(GENERAL FUNCTION)
NVL(), DECODE(), CASE 표현식, NVL2(), NULLIF(), COALESCE() 등등...

NVL(칼럼명, 대체값): 칼럼의 NULL값을 대체

DECODE(칼럼명, 값1, 표현식1,..., 값N, 표현식N): 오라클에만 있는 함수이며, 각 케이스마다 표시할 값을 정해준다.
   예) SELECT ENAME, JOB, SAL,
        DECODE(JOB,
        'CLERK', 1.20*SAL,
        'SALESMAN', 1.10*SAL,
        'MANAGER', 0.95*SAL,
        SAL
        ) AS 연봉인상--마지막에 연산된 칼럼을 꼭 명시해야 된다.
FROM EMP
WHERE JOB IN('CLERK','SALESMAN','MANAGER')
ORDER BY JOB;

오라클을 포함한 모든 SQL에서 CASE 문을 사용하면 DECODE와 같은 효과를 줄 수 있다.
   예) SELECT ENAME, JOB, SAL,
       (CASE JOB WHEN 'CLERK' THEN 1.20*SAL
         WHEN 'SALESMAN' THEN 1.10*SAL
         WHEN 'MANAGER' THEN 0.95*SAL
         ELSE SAL END) AS 연봉인상
FROM EMP
WHERE JOB IN('CLERK', 'SALESMAN', 'MANAGER')
ORDER BY JOB;

NVL2(칼럼명, 대체값1, 대체값2) 함수 (9i부터 지원)
* 칼럼의 데이터가 존재 대체값1, 칼럼이 NULL이면 대체값2
* 대체값1, 대체값2가 같은 데이터 유형이어야 한다.

NULLIF(칼럼1, 칼럼2) 함수 (9i부터 지원)
* 칼럼 1, 칼럼2의 값이 다르면, 무조건 칼럼1을 표시하고, 두 값이 같으면 NULL을 반환한다. 칼럼2의 데이터 유형은 동일

COALESCE(칼럼exp1, 칼럼exp2,...., 칼럼 expn) 함수 (9i부터)
* 함수 내에 명시된 칼럼 값을 확인해서 최초로 NULL이 아닌 칼럼 expr의 값을 표시한다.

5. 형 변환 단일행 함수
TO_CHAR(), TO_DATE(), TO_NUMBER() 등
TO_DATE('날짜 문자열', '날짜 형식 모델'[, 'NLS_PARAM']): 날짜처럼 표시된 문자 값에 해당하는 형식 모델을 명시하여, 문자 값을 날짜 데이터 유형으로 반환한다.

TO_CHAR('날짜 또는 숫자 형식', '날짜 또는 숫자 형식 모델'[, 'NLS_PARAM']): 날짜 또는 숫자를 세션의 표시 형식이 아닌 사용자가 원하는 형식으로 표시
* 형식 모델
* 첫 번째 글자가 소문자: 전체가 소문자로 출력됨.
* 첫 번째 글자가 대문자, 두 번째 글자도 대문자: 전부 대문자 출력
* 첫 번째 글자가 대문자, 두 번째 글자는 소문자:
* 첫 글자만 대문자, 나머지 소문자
* 숫자로 표시되는 년, 월, 일, 시간, 분, 초에서 한 자리만 사용하는 경우
* 남은 자리는 0[ZERO]로 채운다.(예. 2021/06/08...)
* fm을 명시하면 0으로 채우지 않는다.
- SELECT TO_CHAR(SYSDATE, 'fmYYYY-MM-DD fmHH:MI:fmSS')
FROM DUAL;
* SP옵션(숫자를 영문으로 표시), TH옵션(숫자를 영어의 th형태로 표시)
- EX) SELECT TO_CHAR(SYSDATE, 'yYyySP-Mmspth-DDspth')
FROM DUAL;
* 칼럼 값에 $ 또는 원화로 숫자 천 단위에 ',' 표시
- SELECT ENAME, SAL , TO_CHAR(SAL , '$9,999.99'),
        TO_CHAR(SAL*1200, 'L9,999,999')
FROM EMP;
* MI(음수일 때 '-'를 뒤에 표시), PR(음수를 <>로 감싼다)
* MI, PR 동시 사용 불가.
- SELECT TO_CHAR(0-SAL , '99,999.99MI') AS MINUS1,
       TO_CHAR(0-SAL , '99,999.99PR') AS MINUS2
FROM EMP
WHERE EMPNO=7839;
* 9, 0 형식 모델 사용 시 표시 결과의 차이: 0을 넣으면 비어있는 자릿수는 0으로 채운다.
* 9로 지정한 자릿수보다 작으면 '########'로 표시됨.
단일 행 함수는 제한 없이 여러 번 중첩하여 사용이 가능하다.

다중행 함수 또는 그룹 함수(MULTIPLE-ROW FUNCTION, GROUP FUNCTION)

SUM(), AVG() , MAX(), MIN(), COUNT()
SUM(): 총합계
AVG(): 평균
MAX(): 최댓값
MIN(): 최솟값
COUNT(): 개수

그룹 함수와 같이 사용하는 SELECT 문의 키워드: GROUP BY 절과 HAVING 절
그룹 함수를 사용할 때는 그룹 함수 외 나머지 칼럼명을 GROUP 함수에 넣어줘야 한다.(상수는 제외)
그룹 함수의 중첩은 2번까지만 가능하다.
그룹 함수를 포함한 조건은 WHERE 절에 사용이 불가하다. 그룹 함수를 포함한 조건은 HAVING 절을 이용한다.

키의 종류

1. 기본키: 테이블을 대표하는 키
2. 외래키: 다른 테이블의 기본키
3. 슈퍼키: 유일한 성질을 갖는 PRIMARY KEY 후보.

조인

조인: 조건을 기준으로 두 테이블의 가 행들을 합친 후, 원하는 데이터 레코드를 가져오는 방법
1. INNER JOIN: EQUI-INNER JOIN, NON-EQUI INNER JOIN
EQUI-INNER JOIN: 조인할 칼럼명을 명시적으로 적어줘야
* 첫 번째 방법
SELECT
E.EMPNO, E.ENAME, D.DNAME, E.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
* 두 번째 방법
SELECT
E.EMPNO, E.ENAME, D.DNAME, E.DEPTNO
FROM EMP E INNER JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO);
NON-EQUI INNER JOIN: 조인할 칼럼명을 추정할 수 있으면 가능 EX) 계급으로 구분된 칼럼(1등급은 100~200, 2등급은 2200~300 등으로 구분된 테이블에서 등급명을 조인 대상 테이블의 칼럼명과 일치하지 않아도 비교 연산자를 이용해서 조인 가능 - 아래 예시 참조.)
* 첫 번째 방법
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL >= S.LOSAL AND E.SAL <= S.HISAL;
* 두 번째 방법
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
SELECT *
FROM SALGRADE;
- 참고: 위 예에서 SALGRADE 테이블에는 GRADE, LOGRADE, HIGRADE 속성(칼럼)이 존재. LOGRADE와 HIGRADE는 각 GRADE의 상한값과 하한값을 나타내는 속성들.

'💿DBMS > 오라클' 카테고리의 다른 글

프로시저 vs. 함수  (0) 2021.07.26
[20210610] DDL, DCL, 오라클 자료형, PL/SQL  (0) 2021.06.10
[20210609] 조인2, 서브쿼리, DML, TCL  (0) 2021.06.09
[20210607] 단일 행 함수  (0) 2021.06.07
[20210531] DB, SQL 기초, DQL  (0) 2021.05.31