[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 6강

MinHee·2023년 5월 20일
0
post-thumbnail

일반 함수

NVL : NULL 값 대신 다른 데이터 출력

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 : IF문을 SQL로 구현

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 : IF문을 SQL로 구현

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는 부등호 비교까지 가능함

그룹 함수

그룹함수 연산을 통해 단순히 하나의 값만 출력하려해도, 단일 결과가 나오기 위해서는 그룹으로 묶어야 합니다.

MAX : 최댓값 출력

SELECT job, max(sal)
FROM emp
WHERE job = 'SALESMAN'
GROUP BY job; -- 여기서 group by 절이 없으면 오류 발생 <- 단일 그룹의 그룹 함수가 아닙니다

실행 순서 : from -> where -> group by -> select

max함수의 결과는 단일행이고, 직업은 다중행이기 때문에 에러발생

MIN : 최솟값 출력

SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'SALESMAN';

그룹 함수 연산을 통해 그룹별로 출력하려 해도 결과가 나오기 위해서는 그룹으로 묶어야 함

SELECT DEPTNO,MIN(SAL)
FROM EMP
GROUP BY DEPTNO;

AVG : 평균값 출력

실행 순서 : 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;

SUM : 토탈 값 출력

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

COUNT : 건수 출력

사원 테이블의 전체 인원수가 어떻게 되는지 출력하세요

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

EMP

테이블 데이터를 가져온 다음 where 절로 필터링을 하면 having절로 조건을 주는 것보다 질의문을 더 효과적으로 구현이 가능함 - having절에도 일반적인 조건을 달 수 있지만, 그룹 함수에 관한 조건만 기술

select job, count()
from emp
where job != 'SALESMAN'
group by job
having count(
) >= 3;

profile
성장하는 개발자

0개의 댓글