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;
     카디널리티 : 그룹 단위의 행
    1. from 문
    2. where절
    3. 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

+ Recent posts