회원번호, 이름, A항목점수, B항목점수, 성별, 가입일자가 있는 테이블 PERSON이 있다.
그룹을 나눌때는 기준이 필요하다. 그룹을 묶을때, 성별, 연도, 점수 등 여러가지 기준으로 나눌 수 있다.
SELECT * FROM PERSON;
성별로 조회하는 방법은 다음과 같다.
SELECT GENDER FROM PERSON;
이렇게 하면 1.남자, 2.남자, 3.여자, 4.남자, 5.여자 와 같은 방식으로 쭉 나온다.(회원 번호와 성별이 표시됨)
다른 방법으로는
SELECT DISTINCT GENDER FROM PERSON; -> 중복제거
SELECT GENDER FROM PERSON GROUP BY GENDER;
이렇게 하면 각종 항목을 추가할 수 있고, 여자와 남자라는 GENDER로만 출력된다.
그렇다면 여기서 항목추가로 몇명인지 집계함수를 추가할 수 있다.
SELECT GENDER, COUNT(*) FROM PERSON GROUP BY GENDER;
이 식은 COUNT(*) 집계함수를 사용하여 개수를 셀 수있다. 즉 지금상황에선 남자가 몇명인지 여자가 몇명인지
성별을 기준으로 개수를 셀 수 있다는 것이다.
또한 성별기준으로 최고점수를 출력하고 싶을때는,
SELECT GENDER, COUNT(*), MAX(ASCORE) FORM PERSON GROUP BY GENDER;
라고 하면 남자 A항목 최고점수, 여자 A항목 최고점수를 출력할 수 있다.
평균을 구하고 싶다면,
SELECT GENDER, AVG(ASCORE), AVG(BSCORE) FROM PERSON GROUP BY GENDER;
라고 하면 평균점수가 나오게 된다.
GENDER가 아닌 다른쪽으로 기준을 잡고싶다면, 예를들어 연도별로 등록한 회원들의 인원수를 구하여 출력한다면
SELECT
EXTRACT(YEAR FROM REGIST_DATE), COUNT(*) -> 연도별 + 개수 함수(3)
FROM PERSON -> PERSON 테이블에서(1)
GROUP BY EXTRACT(YEAR FROM REGIST_DATE); -> 연도로 그룹나누기(2)
ORDER BY EXTRACT(YEAR FROM REGIST_DATE) ASC; -> 연도 정렬해주기.(4)
(1)-(2)-(3)-(4) 순으로 작동된다.
SELECT 연도, COUNT(*) FROM ( -> (4)
SELECT PERSON.*, EXTRACT(YEAR FROM REGIST_DATE) 연도 FROM PERSON -> 연도로 정렬조회. (1)
GROUP BY 연도 -> (2)
ORDER BY 연도; -> (3)
라고 나타낼 수도 있다. (1)~(4) 순으로 진행되는데, (1)에서 별칭을 사용하였기에 (2), (3) 에서도 사용할 수 있는것이다.
별칭은 조회할때만 새로 만들 수 있다.
이에 따라 알 수있듯, 이와같이 그룹조회는 집계합수를 이용하여 그룹별로 집계한 값을 확인하는 것이 목표이다.
예제 )
성씨별로 인원수, 성씨별 전체평균 조회 후 가나다 순 정렬 후 출력
SELECT
SUBSTR(PERSON_NAME, 1, 1) || '씨', COUNT(*),
AVG((ASCORE+BSCORE)/2)
FROM PERSON
GROUP BY SUBSTR(PERSON_NAME, 1, 1)
ORDER BY SUBSTR(PERSON_NAME, 1, 1) ASC;
예제 )
성시별로 인원수와
'Database SQL > Oracle' 카테고리의 다른 글
[DB#21] (0) | 2020.11.30 |
---|---|
[DB#19] 함수 및 서브쿼리 점검 문제 (0) | 2020.11.26 |
[DB#18] 오라클 함수 (0) | 2020.11.26 |
[DB#17] 정렬(SELECT) 데이터를 정렬해보자!(ASC, DESC) (0) | 2020.11.26 |
[DB#16] 조회(SELECT) (0) | 2020.11.25 |