일반 함수
SELECT ename, comm, nvl(comm,0) -- null만 o으로 출력됨
FROM emp;
데이터에 null값이 존재하는 경우 연산자를 이용한 결과를 출력 시, null값으로 출력됨
수정 후
SELECT ename, sal, comm, sal + nvl(comm,0)
FROM emp;
이름과 커미션을 출력하는데 커미션이 null 인 사원들은 no comm 이라는 글씨로 출력되게 하시오
select ename, nvl(comm,'no comm')
from emp; -- comm : 숫자 / 문자 <- 형이 일치하지 않아서 오류 발생 (수치가 부적합합니다.
기존의 데이터와 치환할 데이터 형이 다른 경우
기존의 데이터 형이 변경될 데이터의 형태를 인식하지 못하여 에러 발생
select ename, nvl(to_char(comm),'no comm')
from emp;
decode(컬럼명, 조건1, 변경값1, 조건2, 변경값2..., 나머지 값)
이름, 부서번호, 보너스를 출력하는데 보너스가 부서번호가 10번이면
300, 부서번호가 20번이면 400,나머지 부서번호는 0 을 출력하세요
SELECT ename, deptno, decode( deptno, 10, 300,
20, 400, 0) as 보너스
from emp;
select ename, job, decode(job, 'SALESMAN', 6000
'ANALYST', 3000
'MANAGER', 2000, 0) AS 보너스
FROM emp;
case when 컬럼명 조건1 then 변경값1 when 컬럼명 조건1 then 변경값1.. else 나머지값 end
예제 35. 직업이 SALESMAN, ANALYST 인 사원들의 이름, 직업, 월급, 보너스를 출력하는데 월급이 3000 이상이면 보너스를 500을 출력하고 월급이 2000 이상이면 보너스
를 300을 출력하고 월급이 1000 이상이면 보너스를 200을 출력하고 나머지는 0을
출력하세요
SELECT ename, job, sal, case when sal >= 3000 then 500
when sal >= 2000 then 300
when sal >= 1000 then 200 else 0 end as 보너스
FROM emp
where job in ('SALESMAN','ANALYST');
SELECT ename, sal, case when sal >= 3000 then 9000
when sal >= 2000 then 8000 else 0 end as 보너스
FROM emp;
DECODE는 EQUAL 비교만 가능, CASE는 부등호 비교까지 가능함
그룹함수 연산을 통해 단순히 하나의 값만 출력하려해도, 단일 결과가 나오기 위해서는 그룹으로 묶어야 합니다.
SELECT job, max(sal)
FROM emp
WHERE job = 'SALESMAN'
GROUP BY job; -- 여기서 group by 절이 없으면 오류 발생 <- 단일 그룹의 그룹 함수가 아닙니다
실행 순서 : from -> where -> group by -> select
max함수의 결과는 단일행이고, 직업은 다중행이기 때문에 에러발생
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'SALESMAN';
그룹 함수 연산을 통해 그룹별로 출력하려 해도 결과가 나오기 위해서는 그룹으로 묶어야 함
SELECT DEPTNO,MIN(SAL)
FROM EMP
GROUP BY DEPTNO;
실행 순서 : from -> group by -> select -> ORDER BY
직업과 직업별 평균 월급을 출력하는데 직업별 평균월급이 높은 것부터 출력
SELECT JOB, ROUND(AVG(SAL)) AS 평균
FROM EMP
GROUP BY JOB
ORDER BY 평균 DESC;
-- AS 명으로 ORDER BY 절을 실행하더라도 오류 없음
SELECT DEPTNO, TO_CHAR(ROUND(AVG(SAL)),'999,999')
FROM EMP
GROUP BY DEPTNO;
GROUP BY로 묶은 결과에 조건을 명시하는 경우에는
HAVING절을 이용해야 조건식이 적용되어 결과를 출력함 where절 X
직업과 직업별 토탈 월급을 출력하는데 직업별 토탈 월급이 6000이상인 것만 출력
SELECT job, sum(sal)
FROM emp
GROUP BY job
HAVING sum(sal) >= 6000;
SELECT 컬럼명
FROM 테이블명
WHERE 검색조건
GROUP BY 그룹핑할 컬럼명
HAVING 그룹함수로 검색조건
ORDER BY 정렬할 컬럼명
실행 순서 : FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
사원 테이블의 전체 인원수가 어떻게 되는지 출력하세요
SELECT COUNT(*)
FROM EMP;
혹은 NULL 값이 없는 칼럼을 기준으로하여 카운트 가능
<- 그룹함수라서 NULL값을 무시함
SELECT COUNT(JOB)
FROM EMP;
테이블 데이터에 NULL이 존재하면
그룹함수는 해당 값을 포함하지 않고 계산을 한다 - 계산 결과가 달라지므로 주의
커미션의 평균값을 출력
SELECT AVG(COMM)
FROM EMP; -- NULL인 행을 제외하고 계산 - 4개의 행
결과 : 550
SELECT AVG(NVL(COMM,0))
FROM EMP; -- NULL인 행을 포함하여 계산 - 14개의 행
결과 : 157
테이블 데이터를 가져온 다음 where 절로 필터링을 하면 having절로 조건을 주는 것보다 질의문을 더 효과적으로 구현이 가능함 - having절에도 일반적인 조건을 달 수 있지만, 그룹 함수에 관한 조건만 기술
select job, count()
from emp
where job != 'SALESMAN'
group by job
having count() >= 3;