데이터베이스

[Database] 9. ORDER BY, GROUP BY, HAVING

nayeonee__ 2023. 9. 11. 19:46

본 글은 다음 강의를 보고 작성한 글입니다.

https://www.youtube.com/playlist?list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe 

 

데이터베이스

백엔드에 필요한 DB 지식들을 정리했어요~ :) 내용은 컴공과 수준입니다

www.youtube.com

 

ORDER BY

  • 조회 결과를 특정 attribute(s) 기준으로 정렬하여 가져오고 싶을 때 사용한다.
  • default 정렬 방식은 오름차순이다.
  • 오름차순 정렬은 ASC 로 표기한다.
  • 내림차순 정렬은 DESC 로 표기한다.
-- 임직원들의 정보를 연봉 순서대로 정렬해서 조회
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary DESC;

-- 임직원들의 정보를 같은 부서 안에서 연봉 순서대로 정렬해서 조회
SELECT * FROM employee ORDER BY dept_id ASC, salary DESC;
// 같은 ORDER BY 내에서 여러개의 컬럼을 불러올 수 있다.
// 우선순위는 앞에 있는 컬럼부터 실행된다. 

 

aggregate function

  • 여러 tuple 들의 정보를 요약해서 하나의 값으로 추출하는 함수
  • 대표적으로 COUNT, SUM, MAX, MIN, AVG 함수가 있다.
  • (주로) 관심있는 attribute 에 사용된다. e.g.) AVG(salary), MAX(birth_date)
  • NULL 값들은 제외하고 요약 값을 추출한다.
-- 임직원 수를 조회
SELECT COUNT(*) FROM employee;
// * : 튜플의 수 : 튜플의 전체를 세라는 의미
-- 프로젝트 2002 에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 조회
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

  • 관심있는 attribute(s) 기준으로 그룹을 나눠서 그룹별로 aggregate funtion 을 적용하고 싶을 때 사용
  • grouping attribute(s) : 그룹을 나누는 기준이 되는 attribute(s)
  • grouping attribute(s) 에 NULL 값이 있을 때는 NULL 값을 가지는 tuple 끼리 묶인다.
-- 각 프로젝트에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 조회
SELECT 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

  • GROUP BY 와 함께 사용한다.
  • aggregate funtion 의 결과 값을 바탕으로 그룹을 필터링하고 싶을 때 사용한다.
  • HAVING 절에 명시된 조건을 만족하는 그룹만 결과에 포함된다.
-- 프로젝트 참여 인원이 7명 이상인 프로젝트들에 대해서 
-- 각 프로젝트에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 조회
SELECT 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;

 

복잡 예제

-- 프로젝트 참여 인원이 7명 이상인 프로젝트에 한정해서
-- 각 프로젝트별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균연봉 조회
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;

⇒ WHERE 절에 조건을 걸을 것인지 HAVING 절에 걸어야 하는지 잘 구분해야 한다.

 

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 에서 어떻게 구현했는지에 따라 다르다.

'데이터베이스' 카테고리의 다른 글

[데이터베이스] JOIN 과 UNION 비교  (0) 2023.09.25
[Database] 8. JOIN  (0) 2023.09.12