본문 바로가기

DATABASE

SQL로 데이터 조회하기! group by, aggregate function, order by를 설명합니다~! 그룹별로 원하는 통계를 순서대로 조회해 보세요 :) (5)

728x90
반응형
SMALL

이 글은 다음 유튜브 영상을 참조해 작성하였습니다.

https://youtu.be/rG8yQ7yKGTE

ORDER BY

- 조회 결과를 특정 attribute(s) 기준으로 정렬하여 가져오고 싶을 때 사용한다

- default 정렬 방식은 오름차순이다

- 오름차순 정렬은 ASC로 표기한다

- 내림차순 정렬은 DESC로 표기한다

ORDER BY 예제

- 임직원들의 정보를 연봉 순서대로 정렬해서 알고 싶다

mysql> SELECT *
    -> FROM employee
    -> ORDER BY salary;

기본 정렬 방식은 ASC오름차순 정렬이다.

내림차순 정렬 방식은 다음과 같이 위 쿼리문 마지막에 DESC키워드를 적어주면 된다.

mysql> select *
    -> from employee
    -> order by salary desc;

만약 각 부서 정보별로 연봉순으로 정렬해 조회하고 싶다면 다음과 같이 쿼리문을 작성하면 된다.

mysql> SELECT * FROM employee ORDER BY dept_id ASC, salary DESC;

aggregate function

- 여러 tuple들의 정보를 요약해서 하나의 값으로 추출하는 함수

- 대표적으로 COUNT, SUM, MAX, MIN, AVG 함수가 있다

- (주로) 관심 있는 attribute에 사용된다 e.g.) AVG(salary), MAX(birth_date)

- NULL 값들은 제외하고 요약 값을 추출한다

aggregate function 예제

- 임직원 수를 알고 싶다

mysql> SELECT COUNT(*) FROM employee;

- 프로젝트 2002에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고 싶다

mysql> SELECT COUNT(*), MAX(salary), MIN(salary), AVG(salary)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> WHERE W.proj_id = 2002;

GROUP BY

위 예제에서 다룬 쿼리문을 모든 프로젝트에 대해서 구하고 싶다면 다음과 같이 GROUP BY를 사용해 바꿀 수 있다.

mysql> SELECT W.proj_id, COUNT(*), MAX(salary), MIN(salary), AVG(salary)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> GROUP BY W.proj_id;

GROUP BY 정리

- 관심있는 attribute(s) 기준으로 그룹을 나눠서 그룹별로 aggreate function을 적용하고 싶을 때 사용

- grouping attribute(s) : 그룹을 나누는 기준이 되는 attribute(s)

- grouping attribute(s)에 NULL값이 있을 때는 NULL값을 가지는 tuple끼리 묶인다

HAVING

위 예제를 통해 HAVING을 사용했다.

mysql> SELECT W.proj_id, COUNT(*), MAX(salary), MIN(salary), AVG(salary)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> GROUP BY W.proj_id
    -> HAVING COUNT(*) >= 7;

HAVING 정리

- GROUP BY와 함께 사용한다

- aggregate function의 결과값을 바탕으로 그룹을 필터링하고 싶을 때 사용한다

- HAVING절에 명시된 조건을 만족하는 그룹만 결과에 포함된다

예제

- 각 부서별 인원수를 인원수가 많은 순서대로 정렬해서 알고 싶다

mysql> SELECT dept_id, COUNT(*) AS empl_count FROM employee
    -> GROUP BY dept_id
    -> ORDER BY empl_count DESC;

- 각 부서별 - 성별 인원수를 인원 수가 많은 순서대로 정렬해서 알고 싶다

mysql> SELECT dept_id, sex, COUNT(*) AS empl_count FROM employee
    -> GROUP BY dept_id, sex
    -> ORDER BY empl_count DESC;

- 회사 전체 평균 연봉보다 평균 연봉이 적은 부서들의 평균 연봉을 알고 싶다

mysql> SELECT dept_id, AVG(salary)
    -> FROM employee
    -> GROUP BY dept_id
    -> HAVING AVG(salary) < (
    ->          SELECT AVG(salary) FROM employee
    -> );

- 각 프로젝트별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균 연봉을 알고 싶다

mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
    -> GROUP BY W.proj_id;

프로젝트 ID 기준으로 정렬을 하고 싶을 시 맨 끝 ORDER BY키워드를 추가하면 된다.

mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
    -> GROUP BY W.proj_id
    -> ORDER BY W.proj_id;

- 프로젝트 참여 인원이 7명 이상인 프로젝트에 한정해서 각 프로젝트별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균 연봉을 알고 싶다

mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
    -> FROM works_on W JOIN employee E ON W.empl_id = E.id
    -> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
    ->          AND W.proj_id IN (SELECT proj_id FROM works_on
    ->                          GROUP BY proj_id HAVING COUNT(*) >= 7 )
    -> GROUP BY W.proj_id
    -> ORDER BY W.proj_id;

select로 조회하기 요약

SELECT attribute(s) or aggregate function(s)

FROM table(s)

[WHERE condition(s)]

[GROUP BY group attribute(s)]

[HAVING group condition(s)]

[ORDER BY attribute(s)];

SELECT 실행 순서

6. SELECT attribute(s) or aggregate function(s)

1. FROM table(s)

2. [WHERE condition(s)]

3. [GROUP BY group attribute(s)]

4. [HAVING group condition(s)]

5. [ORDER BY attribute(s)];

- select쿼리에서 각 절(phrase)의 실행 순서는 개념적인 순서이다

- select쿼리의 실제 실행 순서는 각 RDBMS에서 어떻게 구현했는지에 따라 다르다

 

728x90
반응형
LIST