GROUP BY
- 모든 단위는 그룹 단위로 나옴
- group by 안 써도 집계 함수 쓸 수 있다.
- 주로 쓰이는 게 group by라서 그렇지
- 기준이 됐던 칼럼 명 나타내 줘야 함 옆에 - 보기 좋음
- 그룹핑해서 select절에 올 수 있는 행이 제한되어있다.
- ename(일반 컬럼) 같은 거 못 옴
- 그룹핑하는데 기준이 된 칼럼,칼럼에 대한 식, 집계함수집계 함수만 올 수 있음
- 열 단위로 카디널리티 개수가 같아야 해서
- ORDER BY 안 해도 됨 -> 원래 정렬되어 있음
SELECT deptno, avg(sal) from emp GROUP BY deptno;
부서가 정해지지 않은 사람들도 그룹으로 - is not null
select deptno, sum(sal) from emp where deptno is not null group by deptno;
카디널리티 : 그룹 단위의 행
- from 문
- where절
- group by 절
- count
- count(*) -> 행의 개수 (null 상관없이 개수 세기)
- count(특정 칼럼 명) -> null이 아닌 얘들 개수 세줌
- 뒤에 올 수록 서브 칼럼
20번 일하는 직원 중 'CLERK' job인 직원은 1명이다. select deptno, job, count(*) from emp where deptno is not null group by deptno, job;
Having절
- 어떤 조건을 충족하지 못하는 건 제외
- 행 단위로 읽어올 때 -> where절 (행에 대한 조건, from 다음에 실행)
- 그룹으로 나눈 다음에 그룹에 대한 조건 -> having (그룹에 대한 조건, 그룹 다음에 실행)
ROLLUP
- 각 그룹 단위의 총합계 내줌
- 소 합계 -> 총합계
select ifnull(job,'합계') 직무, sum(sal) '급여' from emp group by job with rollup;
select job, sum(sal) '급여' from emp group by job with rollup;
- 소 합계 -> 총합계
- 보충
select ifnull(job,"직원 별 합계") 잡, ifnull(deptno,"부서 별 합계"), count(*) from emp where deptno is not NULL group by job, DEPTNO with rollup;
부서가 null이 아닌 직원, 부서별 합계
Set
union | 모두 포함 (중복 한번만) |
union all | 모두 포함 (중복 결과 모두 표현) |
intersect | 모두 포함한 행만 표현 |
minus | 쿼리 1 - 쿼리 2 |
- intersect, minus는 mysql에서 지원 안 함.
- 추출되는 컬럼의 개수가 같아야함
- select 순서를 다르게 하면, 에러는 안 나지만 논리적 문제가 발생함 (자동으로 안 바꿔줌)
- union
select ename, hiredate from emp where year(hiredate) = 1981 UNION select ename, hiredate from emp where deptno = 30;
- union all
select ename, hiredate from emp where year(hiredate) = 1981 UNION all select ename, hiredate from emp where deptno = 30;
'study > JAVA 전문가' 카테고리의 다른 글
조인 (0) | 2021.12.17 |
---|---|
mysql 3 - 연습문제 (0) | 2021.12.17 |
DBMS (0) | 2021.12.15 |
inner (0) | 2021.12.10 |
자료구조 2 - 복습 (0) | 2021.12.10 |