9월 10일 SQL 수업 정리 - 함수

 그룹함수 : 여러개의 행을 입력으로 받아 하나의 행으로 결과를 반환하는 함수 



*많이 쓰이는 함수, 잘 알아두자 ( 개념적으로 혼돈하지 말고 잘 정리하자 - select 절에 올 수 있는 컬럼에 대해 잘 정리 )  

오라클 제공 그룹함수 


MIN (컬럼 | 익스프레션 ) : 그룹중에 최솟값을 반환 / 문자열은 가장 먼저 오는 알파벳? 인듯 

MAX (컬럼 | 익스프레션 ) : 그룹중에 최대값을 반환 

AVG( 컬럼| 익스프레션 ) : 그룹의 평균값을 반환 

SUM (컬럼 | 익스프레선) : 그룹의 합계값을 반환 

COUNT ( 컬럼 | 익스프레션 | * ) : 그룹핑된 행의 갯수 


SELECT 행을 묶을 컬럼, 그룹함수 ( *그룹함수가 select 자리에 오는구나 !!! ) 

FROM 테이블명 

[WHERE] 

GROUP BY 행을 묶을 컬럼; 



SELECT * 

FROM emp 

ORDER BY deptno; 


SELECT deptno, MIN(enam) , count(*) , MIN(sal ), MAX(sal), SUM(sal), AVG(sal) 

FROM emp 

GROUP BY deptno ; 


* 오류를 해결하는 법 : 부서이름에 함수를 적용해주면 됨 

그룹함수에서 많이 어려워 하는 부분 

SELECT 절에 기술할 수 있는 컬럼의 구분 : GROUP BY 절에 나오지 않은 컬럼이 SELECT 절에 나오면 에러  


- 전체 행을 대상으로 그룹핑을 할경우 즉 전체행을 그룹으로 묶으면 전체행이 그룹이 되지 않게 중복되지 않는 값이기 때문에 13행이면 그룹핑하면 13행이 나옴. 즉 이말을 잘 이해할 필요가 있다. 

전체 행을 대상으로 그룹핑을 할경우 GROUP BY 절을 기술하지 않는다. 



SELECT MAX (sal) 

FROM emp; 


* 그룹핑할경우 전체 직원중에 가장 큰 급여 값을 알 수는 있지만 해당 급여를 받는 사람이 누군지는 그룹함수만 이용해서는 구할 수 없다. -> 추후진행  (그룹핑을 GROUP BY SAL로 하면 sal각각 사람이아니라 sal금액에 해당하는 사람들이 1행으로 묶이기 때문에 )




-COUNT 함수 * 인자


* : 행의 개수를 반환

컬럼 | 익스프레션 : NULL 값이 아닌 행의 개수 

그러니까 숫자를 세는데 NULL값을 빼고 세는 것임 

다른함수에서는 *는 못쓰지만 COUNT 함수에서만 쓸 수 있음 


SELECT * 

FROM emp; 


SELECT COUNT(*), COUNT(mgr), COUNT(COMM) 

FROM emp; 



그룹함수의 특징 : NULL값을 무시 

NULL 연산의 특징 : 결과 항상 NULL이다. 


그룹함수에서 계산을 할때 NULL값을 가진 애들을 빼버리고 계산 


EX) COMM 함수에 4개 뺴고 NULL이다 그러면 SUMM함수를 쓰면 연산해서 NULL이 나올거 같지만 NULL을 빼고 나머지를 합해서 씀 



SELECT SUM (sal + comm), SUM(sal) + SUM(comm) 

FROM emp; 


했을때 


그룹함수 특징 2 : 그룹화와 관련없는 상수들은 SELECT 절에 기술할 수 있다. 

그룹화와 관련있는 상수는 쓸 수 있네.


SELECT deptno, SYSDATE, 'TEST' , 1, COUNT(*) 

FROM emp 

GROUP BY deptno; 


그룹함수 특징 3 

 single row 함수의 경우 where 에 기술하는 것이 가능하다. 


ex) SELECT * 

FROM emp 

WHERE ename = UPPER('smith') ; 



그룹함수의 경우 where 에서 사용하는 것이 불가능하다. 

-> HAVING 절에서 그룹함수에 대한 조건을 기술하여 행을 제한 할 수 있다. 


그룹함수는 where 절에 사용 불가 

SELECT deptno, COUNT(*) 

FROM emp

WHERE count(*) > = 5 

GROUP BY deptno; 

------> 여기에 where 절을 넣으면 안된다. 


SELECT deptno, COUNT(*) 

FROM emp 

GROUP BY deptno 

HAVING COUNT(*) >= 5 ; 

--> WHERE 절은 못쓰니까 HAVING 절을 쓴다. 






기본 뼈대 정리 

SELECT 행을 묶을 컬럼, 그룹함수 

FROM 테이블명 

[WHERE]

[GROUP BY ] 행을 묶을 컬럼 

[HAVING] 

[ORDER BY] 



* HAVING 과 WHERE 는 같이 못쓴다. 

둘은 사용가능해 그렇지만 GROUP BY 에 대상이 되는 행들을 




SELECT deptno, count(*) 

FROM emp 

WHERE sal > 1000 

GROUP BY deptno

얘는 사용이 가능하다 



GROUP FUNCTION 실습 grp1 

SELECT MAX ( SAL ) max_sal , MIN(sal) min_sal, ROUND ( ( AVG(sal) ) , 2 ) avg_sal, 

SUM(sal) sum_sal, COUNT(sal) count_sal, COUNT(mgr) count_mgr, COUNT(*) count_all

FROM emp 


Function ( group function 실습 grp2) 


SELECT deptno, MAX(sal) max_sal , MIN(sal) min_sal,  ROUND (AVG(sal) , 2  ) avg_sal, 

SUM (sal) sum_sal , COUNT(sal) count_sal,  count(mar) count_mgr , count(*) count_all 

FROM emp

GROUB BY deptno 확인해보기 



** group by 절에 기술한 컬럼이 select 절에 오지 않아도 실행에는 문제는 없다. 




Function ( group function 실습 grp3) 



SELECT 

CASE

WHEN deptno = 10 THEN 'ACCOUNTING' 

WHEN deptno = 20 THEN 'RESEARCH' 

WHEN deptno = 30 THEN 'SALES' 

ELSE null 

END dname , MAX(sal) max_sal , MIN(sal) min_sal,  ROUND ( (AVG(sal)) , 2  ) avg_sal, 

SUM (sal) sum_sal , COUNT(sal) count_sal,  count(mar) count_mgr , count(*) count_all 

FROM emp

GROUP BY deptno; 


GROUB BY deptno



Function ( group function 실습 grp4 ) 



SELECT TO_CHAR( hiredate, 'YYYYMM') hire_yyyymm , COUNT( TO_CHAR( hiredate, 'YYYYMM') ) cnt

FROM emp

GROUP BY  TO_CHAR( hiredate, 'YYYYMM')  ; 











































댓글