이전에 우리는 IT 회사의 데이터베이스를 설계하고, MySQL을 사용하여 테이블을 생성하고 데이터를 관리하는 방법을 배웠습니다. 또한 테이블 간의 조인을 통해 여러 테이블의 데이터를 조회하는 방법도 학습했습니다. 이번 글에서는 그 내용을 확장하여, 데이터를 정렬하고 그룹화하여 통계를 내는 방법을 알아보겠습니다.
ORDER BY는 조회 결과를 특정 컬럼을 기준으로 정렬할 때 사용합니다. 예를 들어, 직원의 연봉을 기준으로 오름차순 또는 내림차순으로 데이터를 정렬할 수 있습니다.
SELECT *
FROM employee
ORDER BY salary ASC;
위의 쿼리는 직원 테이블의 데이터를 연봉 기준으로 오름차순 정렬합니다. 기본적으로 ASC(오름차순)가 적용되며, 내림차순 정렬을 원한다면 DESC를 사용합니다.
여러 컬럼을 기준으로 정렬할 수도 있습니다. 예를 들어, 부서별로 연봉을 내림차순으로 정렬하고 싶다면 다음과 같이 작성할 수 있습니다:
SELECT *
FROM employee
ORDER BY department_id ASC, salary DESC;
이 쿼리는 먼저 부서 ID를 기준으로 오름차순 정렬한 뒤, 같은 부서 내에서는 연봉을 기준으로 내림차순 정렬합니다.
예를 들어, 전체 직원 수를 구하고 싶다면 COUNT 함수를 사용할 수 있습니다:
SELECT COUNT(*)
FROM employee;
이 쿼리는 employee 테이블에 있는 모든 행의 개수를 반환합니다.
GROUP BY는 특정 컬럼을 기준으로 데이터를 그룹화한 뒤, 각 그룹에 집계 함수를 적용할 때 사용합니다.
부서별로 그룹화하여 각 부서의 평균 연봉을 구해 보겠습니다:
SELECT department_id, AVG(salary)
FROM employee
GROUP BY department_id;
이 쿼리는 각 부서별 평균 연봉을 계산하여 반환합니다.
HAVING 절은 GROUP BY로 그룹화한 결과에 조건을 추가할 때 사용합니다. 예를 들어, 평균 연봉이 5,000 이하인 부서만 조회하고 싶다면:
SELECT department_id, AVG(salary)
FROM employee
GROUP BY department_id
HAVING AVG(salary) <= 5000;
이 쿼리는 평균 연봉이 5,000 이하인 부서의 ID와 해당 부서의 평균 연봉을 반환합니다.
부서별 인원수를 구하고, 그 인원수를 기준으로 내림차순 정렬하여 조회해 보겠습니다:
SELECT department_id, COUNT(*) AS emp_count
FROM employee
GROUP BY department_id
ORDER BY emp_count DESC;
이 쿼리는 각 부서의 직원 수를 계산한 뒤, 직원 수가 많은 부서부터 순서대로 정렬하여 출력합니다.
각 프로젝트별로 90년대생 직원의 수와 평균 연봉을 구하는 쿼리는 다음과 같습니다:
SELECT project_id, COUNT(*) AS num_90s, ROUND(AVG(salary), 2) AS avg_salary
FROM works_on w
INNER JOIN employee e ON w.employee_id = e.id
WHERE e.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
GROUP BY project_id;
이 쿼리는 각 프로젝트에서 90년대생 직원의 수와 평균 연봉을 계산하여 반환합니다.
이번 글에서는 SQL의 GROUP BY와 ORDER BY를 활용한 데이터 정렬 및 그룹화 방법을 배웠습니다. 또한, 집계 함수와 HAVING 절을 사용하여 그룹화된 데이터를 필터링하는 방법도 다뤘습니다. 이러한 개념들을 활용하면 복잡한 SQL 쿼리를 작성하여 데이터베이스에서 원하는 결과를 효율적으로 조회할 수 있습니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe