함수의 종류
-
single row 함수 - 값을 하나 받아서 하나의 결과를 출력, 각 row에 대해서 각각 결과가 나옴
예 : select abs(sal) from emp;
- SQL> SELECT ABS(sal) FROM emp;
- ABS(SAL)
----------
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300 - 14 rows selected.
- multi row 함수(Aggregate) - 여러 값을 받아서 하나의 결과를 출력
- SQL> SELECT SUM(sal) FROM emp;
- SUM(SAL)
----------
29025
Aggregate Function (P5-1)
- SQL> SELECT SUM(sal) FROM emp
2 GROUP BY deptno; - SUM(SAL)
----------
8750
10875
9400
Aggregate Function(cont.) (P5-3)
- COUNT() 함수의 차이
// (*) -> 모든 컬럼의 갯수 카운트
SELECT count(*) FROM s_emp;
// (컬럼명) -> 해당 컬럼에서 null 값인 경우는 카운트에서 제외
SELECT count(sommission_pct) FROM s_emp;
// (DISTINCT 컬럼명) -> null 값 제외해서 카운트한 것중 중복된 것까지 카운트에서 제외
SELECT count(DISTINCT commission_pct) FROM s_emp;
- AVG() 함수 - (1, 3번이 동일한 결과)
(1) SELECT avg(commission_pct) FROM emp;
(2) SELECT sum(commission_pct) / count(*) FROM s_emp;
(3) SELECT sum(commission_pct) / count(commission_pct) FROM s_emp;
GROUP BY Clause (P5-4)
- 직종별 최대봉급과 최소봉급(job으로 그룹화하고 각 그룹의 max, min 급여 출력)
- SQL> SELECT job, MAX(sal), MIN(sal)
2 FROM emp
3 GROUP BY job; - JOB MAX(SAL) MIN(SAL)
--------- ---------- ----------
ANALYST 3000 3000
CLERK 1300 800
MANAGER 2975 2450
PRESIDENT 5000 5000
SALESMAN 1600 1250
- GROUP BY 절은 WHERE절 뒤에 나와야함
- ORDER BY 절은 가장 마지작에 나와야함
- ORDER BY 2 = 2번째 컬럼을 기준으로 정렬
- SELECT문에서 Alias를 주면 ORDER BY절에서 해당 Alias 사용가능
- SQL> SELECT deptno, SUM(sal), AVG(sal)
2 FROM emp
3 WHERE hiredate >'81/01/01'
4 GROUP BY deptno
5 ORDER BY 2; - DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
10 8750 2916.66667
30 9400 1566.66667
20 10075 2518.75
- GROUP BY 절을 쓸때 SELECT절에는 Aggregation 함수나 GROUP BY 절에서 쓰인 컬럼만 쓸 수 있음(P5-6)
- deptno로 그룹화 하고 그 그룹에서 ename를 출력하려고 한다면 그룹화된 사원중 어떤 사원의 이름을 출력해야하는지 모름, 그래서 오류~
- // SELECT절에서 ename은 쓸수 없으므로 오류~
- SQL> SELECT ename, deptno, MAX(sal)
2 FROM emp
3 GROUP BY deptno;
SELECT ename, deptno, MAX(sal)
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
HAVING Clause (P5-7)
- 그룹화 전에 select할 조건이랑 그룹화 후에 select할 조건을 구분해야함
- where절에는 그룹화전에 select할 조건을 쓰고, having절에는 그룹화 후에 selet할 조건을 입력한다.
- 부서번호 10, 20인 사원의 직종별 봉급 총합이 5000 이상인 직종출력, 직종별 평균급여 출력 (P5-8)
- SQL> SELECT job, AVG(sal) PAYROLL
2 FROM emp
3 WHERE deptno IN(10, 20)
4 GROUP BY job
5 HAVING SUM(sal) > 5000
6 ORDER BY AVG(sal); - JOB PAYROLL
--------- ----------
MANAGER 2712.5
ANALYST 3000
- 직종이 's'문자로 시작하는 사원들의 부서별 평균급여가 1000이상인 부서번호와 평균급여 출력
- SQL> SELECT deptno, AVG(sal) as 평균급여
2 FROM emp
3 WHERE job LIKE 'S%'
4 GROUP BY deptno
5 HAVING AVG(sal) >= 1000
6 ORDER BY AVG(sal); - DEPTNO 평균급여
---------- ----------
30 1400 - // JOIN문을 이용해서 부서이름 출력~
- SQL> SELECT dept.deptno, avg(sal) as 평균급여, dept.dname 부서이름
2 FROM emp, dept
3 WHERE job like 'S%' AND emp.deptno = dept.deptno
4 GROUP BY dept.deptno, dept.dname
5 HAVING avg(sal) >= 1000; - DEPTNO 평균급여 부서이름
---------- ---------- --------------
30 1400 SALES
이 글은 스프링노트에서 작성되었습니다.