1. NVL
: null 값 대신 다른 데이터를 출력하는 명령어
1) 사용문법
nvl (컬럼명, 변경값)
2) 문제
> 이름과 커미션을 출력하는데 커미션이 null인 사원은 no comm으로 출력되게 하세요
select ename, nvl(comm, 'no comm') from emp;
내가 처음에 쓴 답 : 에러 ORA-01722: invalid number
select ename, nvl(to_char(comm), 'no comm') from emp;
고친 답 : 정답
처음 쓴 답은 기존의 데이터 comm과 치환할 데이터 'no comm'의 유형이 다르기 때문에 에러가 난다.
comm을 문자형으로 변환하는 to_char를 사용해준다.
> 모든 사원들에게 커미션을 200씩 추가하여 사원 이름, 커미션 값을 출력하세요.
select ename, nvl(comm, 0)+200 from emp;
> 사원번호, 사원이름, 총 급여를 출력하세요.
select empno, ename, sal+nvl(comm,0) from emp;
2. COUNT
: 건 갯수 출력하기
count는 group 함수기 때문에 null 값을 포함하지 않고 계산한다.
1) 사용문법
count (대상)
2) 문제
> 직업과 직업별 인원수를 출력하는데 직업이 SALESMAN인 사람은 제외하고, 직업별 인원수가 3명 이상인 경우만 출력하세요.
select job, count(*) from emp
where job!='SALESMAN'
group by job
having count(*)>=3;
> 부서별 평가등급이 'B등급'인 사람의 수를 출력하세요.
select count(*)
from emp e, hr h, dept d
where e.empno = h.emp.no
and d.deptno = e.deptno
and h.grade = 'B';
3. SUM
: 토탈값 출력하기
1) 사용문법
sum(대상)
2) 문제
> 직업과 직업별 토탈 월급을 출력하는데 토탈 월급이 6000 이상인 경우만 출력하세요.
select job, sum(sal) from emp where sum(sal)>=6000 group by job;
내가 처음에 쓴 답 : 에러
select job, sum(sal) from emp
group by job
having sum(sal)>=6000;
고친 답 : 정답
group 함수로 검색 조건을 줄 때는 where절이 아니라 having을 사용해야 한다.
작성법 : group by 이후 having 절로 조건을 작성해주면 된다.
4. sum+decode
: row를 column으로 출력
1) 예제
> 부서번호와 부서번호별 토탈 월급을 출력하는데 가로로 출력하세요.
*기존의 세로 출력*
select deptno, sum(sal) from emp group by deptno;
*가로로 출력*
select sum(decode(deptno, 10, sal, null)) as "10",
sum(decode(deptno, 20, sal, null)) as "20",
sum(decode(deptno, 30, sal, null)) as "30"
from emp;
0이 아니라 null 로 적은 이유 : 그룹함수는 null을 연산에서 제외하기 때문에 연산 효율이 더 좋다. 0을 쓰면 연산에 포함이 된다.
null은 생략 가능해서 다음과 같이 생략해도 결과는 같다.
select sum(decode(deptno, 10, sal)) as "10",
sum(decode(deptno, 20, sal)) as "20",
sum(decode(deptno, 30, sal)) as "30"
from emp;
참고)
10번 부서는 급여가 나오고 나머지 부서는 0으로 출력한다. 또 별칭을 숫자로 하는 경우 " "를 붙여줘야 한다.
select deptno,, decode(deptnno, 10, sal, null) as "10" from emp;
> 직업, 직업별 토탈 월급을 가로로 출력하세요.
*기존의 세로 출력*
select job, sum(sal) from emp group by job;
*가로로 출력*
select sum(decode(job, 'CLERK', sal)) as CLERK,
sum(decode(job, 'SALESMAN', sal)) as SALESMAN,
sum(decode(job, 'PRESIDENT', sal)) as PRESIDENT,
sum(decode(job, 'MANAGER', sal)) as MANAGER,
sum(decode(job, 'ANALYST')) as ANALYST
from emp;
'개발 기록 > sql' 카테고리의 다른 글
[SQL] JOIN (LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, INNER JOIN) (0) | 2024.01.18 |
---|---|
[SQL]UNION ALL, UNION (0) | 2024.01.06 |
[SQL] GROUP BY, TOP/ROWNUM, DISTINCT (0) | 2024.01.05 |
[SQL] 백엔드 개발에 필요한 명령어 정리 (0) | 2024.01.03 |
[SQL] case when then - 등급 매기기 (0) | 2023.12.04 |