WHERE 절, HAVING 절, GROUP BY, ORDER BY
1. WHERE 절
- 용도:
WHERE
절은 행 단위로 데이터를 필터링합니다. 즉, 데이터베이스에서 가져온 원시 데이터를 조건에 맞게 필터링하여 필요한 데이터만 남깁니다. - 특징:
WHERE
절은 그룹화되기 전에 조건을 적용합니다. 즉, 데이터가 그룹화되기 전에 필터링이 먼저 일어납니다. - 예시:
이 쿼리는SELECT * FROM Employees WHERE salary > 5000;
Employees
테이블에서 급여가 5000보다 큰 행만 가져옵니다.
2. HAVING 절
- 용도:
HAVING
절은 그룹화된 데이터에 조건을 적용합니다. 즉,GROUP BY
로 그룹화된 결과에 조건을 걸어서 필터링합니다. - 특징:
WHERE
절과 달리,HAVING
절은 집계 함수(SUM, COUNT 등)를 사용할 수 있습니다.HAVING
은 그룹화된 데이터에만 적용되므로GROUP BY
와 함께 사용됩니다. - 예시:
이 쿼리는 부서별 직원 수를 계산하고, 직원 수가 10명 이상인 부서만 반환합니다.SELECT department, COUNT(*) as employee_count FROM Employees GROUP BY department HAVING COUNT(*) > 10;
3. GROUP BY 절
- 용도:
GROUP BY
절은 데이터를 특정 기준으로 그룹화합니다. 주로 집계 함수와 함께 사용하여 그룹별로 요약된 데이터를 반환할 때 사용됩니다. - 특징:
GROUP BY
는 같은 값을 가진 행들을 하나의 그룹으로 묶어줍니다. 그런 후, 그 그룹에 대해 집계 함수(SUM, COUNT, AVG 등)를 적용할 수 있습니다. - 예시:
이 쿼리는 각 부서별로 직원들의 평균 급여를 계산합니다.SELECT department, AVG(salary) as avg_salary FROM Employees GROUP BY department;
4. ORDER BY 절
- 용도:
ORDER BY
절은 결과를 정렬할 때 사용됩니다. 오름차순(ASC) 또는 내림차순(DESC)으로 결과를 정렬할 수 있습니다. - 특징:
ORDER BY
는 정렬하고자 하는 컬럼을 기준으로 결과를 정렬합니다.ORDER BY
절은 쿼리의 마지막에 사용됩니다. - 예시:
이 쿼리는SELECT * FROM Employees ORDER BY salary DESC;
Employees
테이블에서 모든 직원을 급여 순으로 내림차순 정렬해서 보여줍니다.
주요 차이점
- WHERE vs HAVING:
WHERE
는 그룹화 전에 데이터를 필터링하고, HAVING은 그룹화 후 데이터를 필터링합니다.WHERE
는 개별 행에 조건을 걸 수 있지만, HAVING은 집계 함수에 조건을 걸 때 사용합니다.
- GROUP BY vs ORDER BY:
GROUP BY
는 데이터를 그룹화하는데 사용되며, 주로 집계 함수와 함께 사용됩니다.ORDER BY
는 데이터를 정렬하는 데 사용됩니다.
예시로 비교
SELECT department, COUNT(*) as employee_count
FROM Employees
WHERE salary > 5000 -- (1) 먼저 급여가 5000 이상인 행만 필터링
GROUP BY department -- (2) 부서별로 그룹화
HAVING COUNT(*) > 10 -- (3) 그룹화된 데이터 중 직원 수가 10명 이상인 부서만 필터링
ORDER BY employee_count DESC; -- (4) 직원 수 기준으로 내림차순 정렬
이 쿼리는:
- 먼저
WHERE
절로 급여가 5000 이상인 직원만 필터링합니다. - 그런 후, 부서별로 데이터를 그룹화합니다.
- 그다음 직원 수가 10명 이상인 부서만 남깁니다.
- 마지막으로, 직원 수 기준으로 내림차순으로 정렬합니다.
각 절의 순서와 기능을 정확히 이해하고 사용하면 복잡한 쿼리도 쉽게 작성할 수 있습니다.
'Everyday Study' 카테고리의 다른 글
2024.09.24(화) { 오프셋 기반 페이징의 문제점 } (0) | 2024.09.24 |
---|---|
2024.09.23(월) { 페이징, @EntityGraph } (0) | 2024.09.23 |
2024.09.19(목) { 컬렉션 값 타입, CROSS JOIN } (0) | 2024.09.19 |
2024.09.12(목) { 복합키 클래스( @IdClass, @EmbeddedId ) } (0) | 2024.09.12 |
2024.09.11(수) { 지연 로딩&즉시 로딩, n+1 문제, 다이나믹 업데이트, 알아야할 것들 } (0) | 2024.09.11 |