Loading...

DB/Oracle / / 2022. 2. 9. 17:50

DB 30강. GROUP BY

반응형

GROUP BY는 세로 연산이다.

세로 연산에는

sum, avg, count, max, min등이 있었다.

-- 이건 전체 sum
SELECT sum(sal)
FROM emp;

 

SELECT sum(sal), job
FROM emp;

행의 길이가 맞지않다는 것이다.

 

오류를 읽어도 이해가 안간다면

왼쪽 상단 코드를 복사해서

구글링해보면 된다!

 

-- 전체 sum이 아닌 직업별 sum
-- job이 DISTINCT 중복이 제거가 됨
SELECT sum(sal), job
FROM emp
GROUP BY job;

GROUP BY job, ename

직업과 이름으로 그룹을 만들면

하면 제대로 그룹핑이 안된다.

 

직업과 이름이 같은 사람이

없기 때문이다.

 

세로연산을 하는 5가지 함수를 그룹 함수라고 하는데

그룹 함수를 테이블에 적고, 옆에 다른 컬럼을 적고싶을때

GROUP BY를 써준다.

 

행의 개수가 맞지 않으니까

찌그려트려서 맞춰주는 것이다.

 

ORDER BY가 쿼리 실행 순서의

맨 마지막이라서 SELECT의 별칭을 인식하지만,

GROUP BY는 SELECT보다 먼저 실행되기 때문에

별칭을 인식하지 못한다.

 

오라클 쿼리 실행 순서

 

1. FROM : SQL 테이블 최우선 확인

2. WHERE : 테이블에서 주어진 조건에 맞는 레코드 추출

3. GROUP BY : 공통적인 데이터끼리 그룹 생성

4. SELECT : 최종적으로 추출된 프로젝션 조회

5. ORDER BY : 추출된 데이터 정렬

 

그래서 인라인뷰를 사용해

서브쿼리를 만들어준다.

서브쿼리에서 별칭을 만들면

메인쿼리에서도 사용이 가능하다!

 

-- 같은 나이별(substr, 인라인뷰) 그룹으로 묶어서 키의 평균 구하기
SELECT year, avg(height)
FROM (
    SELECT substr(jumin, 1, 2) year, height
    FROM student
)
GROUP BY year
ORDER BY year;

 

 

 

-- 같은 지역별 최고 키 (인라인 뷰 활용) : student 테이블
SELECT 지역, max(height)
FROM (
    SELECT substr(tel, 1, instr(tel, ')')-1) 지역, height
    FROM student
)
GROUP BY 지역;

 

 

-- 순서대로 5명씩 끊어서 포인트의 평균을 구해주세요 : gogak 테이블
SELECT avg(point), team+1
FROM(
    SELECT gname, point, TRUNC((rownum-1)/5) team
    FROM gogak
)
GROUP BY team+1
ORDER BY team+1;

 

 

-- GOGAK 테이블에서 짝수, 홀수로 그룹핑하여 포인트의 합을 구하시오.
SELECT sum(point), "group"
FROM (
    SELECT gname, point, mod(rownum, 2) "group"
    FROM gogak
)
GROUP BY "group"
ORDER BY "group";

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형