그룹 함수
* N개의 값을 읽어서 1개의 결과를 반환(하나의 그룹별로 함수 실행 결과를 반환함)
* 통계, 집계 등을 작성할 때 유용함.
SUM
* SUM(숫자타입의컬럼명) : 해당 컬럼값들의 합계를 구해서 반환
SELECT SALARY
FROM EMPLOYEE;
SELECT SUM(SALARY)
FROM EMPLOYEE;
SELECT SUM(SALARY)
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
SELECT SUM(SALARY)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1) IN ('1','3');
AVG
* AVG(숫자타입의컬럼명) : 해당 컬럼값들의 평균값을 구해서 반환
SELECT AVG(SALARY)
FROM EMPLOYEE;
SELECT '대략 ' || ROUND(AVG(SALARY),-4) || '원' "평균 급여"
FROM EMPLOYEE;
MIN
* MIN(아무타입컬럼명) : 해당 컬럼값 중에서 가장 작은 값을 반환
SELECT MIN(SALARY), MIN(EMP_NAME), MIN(EMAIL), MIN(HIRE_DATE)
FROM EMPLOYEE;
SELECT SALARY, EMP_NAME, EMAIL, HIRE_DATE
FROM EMPLOYEE
ORDER BY HIRE_DATE;
MAX
* MAX(아무타입컬럼명) : 해당 컬럼값 중에서 가장 큰 값을 반환
SELECT MAX(SALARY), MAX(EMP_NAME), MAX(EMAIL), MAX(HIRE_DATE)
FROM EMPLOYEE;
SELECT SALARY, EMP_NAME, EMAIL, HIRE_DATE
FROM EMPLOYEE
ORDER BY HIRE_DATE DESC;
COUNT
* COUNT(*/컬럼명 / DISTINCT 컬럼명) : 조회된 행의 개수를 세서 반환함.
* COUNT(*) : 조회 결과에 해당하는 모든 행의 개수를 세서 반환
* => NULL을 포함함
* COUNT(컬럼명) : 내가 제시한 해당 컬럼값의 행의 개수로 세서 반환
* => NULL은 포함하지 않음.
* COUNT(DISTINCT 컬럼명) : 내가 제시한 컬럼값이 중복인 경우, 하나로만 세서 행의 개수로 반환
* => NULL은 포함하지 않음.
SELECT COUNT(*)
FROM EMPLOYEE;
SELECT COUNT(EMP_ID)
FROM EMPLOYEE;
SELECT COUNT(*)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1) IN('2','4');
SELECT COUNT(*)
FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL;
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;
SELECT COUNT(*)
FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL AND SUBSTR(EMP_NO,8,1) IN('2','4');
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1) IN ('2','4');
SELECT COUNT(*)
FROM EMPLOYEE
WHERE MANAGER_ID IS NOT NULL;
SELECT COUNT(MANAGER_ID)
FROM EMPLOYEE;
SELECT COUNT(DISTINCT DEPT_CODE)
FROM EMPLOYEE;
SELECT COUNT(*)
FROM DEPARTMENT;
GROUP BY절
* 그룹을 묶어줄 기준을 제시할 수 있는 구문
* 해당 제시된 기준별로 그룹을 묶을 수 있음
* 여러개의 컬럼값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용
SELECT SUM(SALARY)
FROM EMPLOYEE;
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
SELECT SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
SELECT COUNT(*)
FROM EMPLOYEE;
SELECT DEPT_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE ASC NULLS FIRST;
SELECT JOB_CODE, "직급코드"
SUM(SALARY) "총 급여의 합",
COUNT(*) "사원수",
COUNT(BONUS) "보너스 받는 사원 수",
COUNT(MANAGER_ID) "사수가 있는 사원 수"
FROM EMPLOYEE
GROUP BY JOB_CODE;
SELECT
DEPT_CODE "부서코드",
COUNT(*) "사원 수",
SUM(SALARY) "총급여합",
ROUND(AVG(SALARY)) "평균급여",
MAX(SALARY) "최고급여",
MIN(SALARY) "최소급여"
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE;
SELECT SUBSTR(EMP_NO, 8, 1) "성별", COUNT(*)
FROM EMPLOYEE
GROUP BY SUBSTR(EMP_NO,8,1);
SELECT DECODE(SUBSTR(EMP_NO, 8, 1),'1','남','2','여')"성별", COUNT(*)
FROM EMPLOYEE
GROUP BY SUBSTR(EMP_NO,8,1);
HAVING절
* "그룹함수"에 대한 조건을 제시하고자 할 때 사용하는 구문
* 주로 그룹함수를 가지고 조건을 제시함
SELECT DEPT_CODE, ROUND(AVG(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE;
SELECT DEPT_CODE, ROUND(AVG(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING ROUND(AVG(SALARY))>=3000000;
SELECT JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING SUM(SALARY) >= 10000000;
SELECT DEPT_CODE, COUNT(BONUS)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING COUNT(BONUS) = 0;
실행순서
각 절의 작성 순서대로 필기
5. SELECT * / 조회하고자하는컬럼명 / 리터럴 / 산술연산식 / 함수식 AS "별칭"
1. FROM 조회하고자하는테이블명 / DUAL(가상테이블)
2. WHERE 조건식(주의사항 : 조건식에 그룹함수는 포함하면 안됨)
3. GROUP BY 그룹기준에맞는컬럼명 / 함수식
4. HAVING 그룹함수식을포함한조건식
6. ORDER BY 정렬기준에맞는컬럼명 / 별칭 / 순번 [ASC/DESC] [NULLS FIRST/ NULLS LAST]
집합 연산자(SET OPERATOR)
* 여러 개의 쿼리문을 가지고, 하나의 쿼리문으로 만드는 연산자
* 수학에서 사용하는 집합의 개념과 같음.
* - UNION : 합집합(두 쿼리문을 수행한 결과값을 모두 더한 후, 중복된 부분은 한번 뺀 개념) => OR
* - INTERSECT : 교집합(두 쿼리문을 수행한 결과값의 중복된 결과값 부분) => AND
* - UNION ALL : 합집합 결과에 교집합이 더해진 개념 (두 쿼리문을 합치고 중복제거를 하지 않음)
* - MINUS : 차집합(선행 쿼리문 결과값 - 후행 쿼리문 결과값의 결과)
* 특이사항 : UNION보다 UNION ALL이 속도가 더 빠름
* 주의사항 : 항상 SELECT절이 동일해야 함.
UNION
* 합집합
* 두 쿼리문을 수행한 결과값을 모두 더한 후,
* 중복된 부분은 한번 뺀 개념 => OR
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE ='D5';
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE ='D5'
UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
INTERSECT
* 교집합
* 여러 쿼리 결과의 중복된 결과만을 조회 => AND
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE ='D5' AND SALARY > 3000000;
UNION ALL
* 합집합 + 교집합
* 두 쿼리문을 수행한 결과값을 더하지만,
* 중복된 결과를 두번 조회함
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE ='D5'
UNION ALL
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
MINUS
* 차집합
* 선행쿼리문의 결과값에서 후행쿼리문의 결과값을 쳐냄
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND SALARY <=3000000;