본문 바로가기
공부기록/MySQL

3월 30일 (2) DB - WHERE절의 연산자, 집계함수, 기타함수

by project100 2023. 3. 30.

4.null 관련연산자

IS NULL : 컬럼의 데이터가 NULL인 행을 검색

IS NOT NULL : 컬럼의 데이터가 NULL이 아닌 행을 검색

USE dev_db;
SELECT * 
FROM emp
WHERE comm  IS NOT NULL;

 

출력 개수 제한 : LIMIT n[, m]

 n - 0번 행부터  n-1번 행까지의 행 조회

n과 m - n은 시작행 번호, m은 조회할 행 개수

USE employees;
SELECT * 
FROM employees
LIMIT 1, 10;

 

집계함수와 GROUP

집계함수

행에 대한 산술적인 연산을 수행하는 함수, 주로 숫자타입의 컬럼에 적용

1) count(컬럼명) : 전체 또는 특정 컬럼의 값이 있는 행의 개수

USE dev_db;
SELECT count(comm) `커미션 받는 사원`, count(*) `전체 사원`
FROM emp;

 

2) sum(컬럼명) : 해당 커럼의 모든 행의 값을 합산

3) avg(컬럼명) : 해당 컬럼의 모든 행의 값의 평균

4) min(컬럼명) : 해당 컬럼의 행 중 가장 작은 값

5) max(컬럼명) : 해당 컬럼의 행 중 가장 큰 값

DESC emp;
-- 이 회사의 총 급여를 구하시오.
SELECT sum(sal) `총 급여`, avg(sal) `급여 평균`,  min(sal) `최소 급여`, max(sal) `최대 급여`
FROM emp;

6) stdev(컬럼명) : 표준편차

7) var_samp(컬럼명) : 분산

 

행의 그룹화(GROUP BY)

행을 그룹으로 묶어주는 역할 키워드

집계함수를 같이 사용하여 그룹에 대한 연산을 처리할 수 있다.

-- 부서별 인원은?
SELECT count(*)
FROM emp
WHERE deptno = 30;

SELECT deptno, count(*) 인원수, sum(sal)`급여 합계`, avg(sal)`급여 평균`, max(sal), min(sal)
FROM emp
GROUP BY deptno;

 

그룹화를 위한 조건 설정 : HAVING

집계함수는 WHERE 절에서 사용불가!

즉, GROUP BY는 WHERE절로 조건을 붙일 수 없음.

HAVING은 단독으로 사용불가, 반드시 GROUP BY와 함께 사용

 

집계함수 사용불가 / having 사용

 

-- 사원 수가 5인 이상인 부서는?
SELECT deptno, count(*)
FROM emp
WHERE count(*) >= 5
GROUP BY deptno;

SELECT deptno, count(*)
FROM emp
GROUP BY deptno
HAVING count(*) >= 5;

WITH ROLLUP : 그룹의 중간 합계 및 총합

데이터 관리자가 내부 자료를 정리할 때 사용, 개발자가 사용할 일은 거의 없다.

-- WITH ROLLUP : 그룹의 중간 합계 및 총합
-- 부서와 직책별로 그룹화하여 급여 합계와 해당 인원수를 조회하시오.
SELECT deptno, job, sum(sal), count(*)
FROM emp
GROUP BY deptno, job
WITH ROLLUP;

 

-- 연습문제
-- 1. 직책별 평균 급여를 조회하시오.
SELECT job, sum(sal), count(*), avg(sal)
FROM emp 
GROUP BY job;

-- 2. 직책별 최대 급여, 최소 급여를 조회하시오.
SELECT job, max(sal), min(sal)
FROM emp 
GROUP BY job;

-- 3. 직책별 인원수를 조회하시오.
SELECT job, count(*)
FROM emp 
GROUP BY job;

-- 4. 부서별 사원수와 커미션을 받는 사람들의 수를 조회하시오.
SELECT DEPTNO, count(*), count(COMM)
FROM emp 
GROUP BY DEPTNO;

SELECT * FROM emp;