⭐️ WHERE 절 VS HAVING 절
GROUP BY 절을 배우게 되면서 HAVING 절을 배우게 되었다.
근데 문제가 있다‼️ 🧐 WHERE 절과 HAVING 절이 동작하는 것이 비슷한 것이다.
하지만 결과 값이 WHERE절과 HAVING 절이 다르게 나오는 것이다.
⭐️ GROUP BY 절에 WHERE 절이 사용될 경우
우선 아래 WHERE절이 있는 GROUP BY 코드를 보겠다.
-- 각 부서별 평균 급여가 300만원 이상인 부서들만 조회 (부서코드 , 평균 급여)
SELECT DEPT_CODE , ROUND(AVG(SALARY))
FROM EMPLOYEE e
WHERE SALARY >= 3000000
GROUP BY DEPT_CODE;
위의 코드의 경우 순서가 어떻게 될까 ?
SELECT DEPT_CODE , ROUND(AVG(SALARY)) -- 4
FROM EMPLOYEE e -- 1
WHERE SALARY >= 3000000 -- 2
GROUP BY DEPT_CODE; -- 3
위와 같이
1. FROM 절로 테이블 가져온다.
2. WHERE 절로 급여가 300만 이상만 선택한다
3. GROUP BY 절로 DEPT_CODE 를 그룹화 시킨다
4. DEPT_CODE 와 부서별 평균 급여를 보여준다.
🔥 하지만 여기서 문제가 있다 .
각 부서별 평균 급여가 300만원 이상인 부서들만 조회 (부서코드 , 평균 급여) ➡️ 조회 해야 할 내용과 좀 다르다 ‼️
⭐️ 위와같이 WHERE 절을 사용하여 조건을 넣을 시 ⭐️
1. 급여가 300만원 이상이라는 조건을 주고
2. 그룹화 하고
3. 그룹화 한 그룹의 부서코드와 평균 급여가 나오게 된다.
-> 원하는 코드는 부서별 평균 급여가 300만원 이상인 부서를 조회하는것이지 , 먼저 300만원 이상인 부서들의
평균을 구하는것이 아니다 ‼️
쉽게 말해 평균이 300만원 이상인 부서를 먼저 선택하고 그룹으로 묶냐 , 그룹으로 먼저 묶고 300만원 이상의 평균을
찾냐 그 차이다 .
⭐️ 그러면 어떻게 해야 원하는 코드를 만들 수 있을까 ?
-> HAVING 절을 사용 하면 된다 👍
⭐️ GROUP BY 절에 HAVING 절이 사용될 경우
HAVING 절을 사용한 코드를 보자.
SELECT DEPT_CODE , ROUND(AVG(SALARY)) -- 4
FROM EMPLOYEE e -- 1
GROUP BY DEPT_CODE -- 2
HAVING AVG(SALARY) >= 3000000; -- 3
위와 같이
1. FROM 절로 테이블 가져온다. (WHERE 절과 동일)
2. GROUP BY 절로 DEPT_CODE 를 그룹화 시킨다 (WHERE절과 순서가 다름)
3. HAVING 절로 평균 급여가 300만 이상인 부서를 선택한다.
4. DEPT_CODE 와 부서별 평균 급여를 보여준다.
-> 원하는 값을 얻게 되었다 ✨
🔥 이렇게 WHERE 절과 HAVING 절을 사용할 시 순서의 차이가 있을 뿐더러 , 결과의 차이도 생기게 된다 ‼️
⭐️ SELECT 문의 전반적 순서
SELECT 문의 순서는 아래와 같다. 중요 ‼️
SELECT * -- 5
FROM 테이블 -- 1
WHERE 조건식 -- 2
GROUP BY 그룹의 기준이 되는 컬럼 | 조건식 -- 3
HAVING 조건식 -- 4
ORDER BY 정렬기준 컬럼 -- 6
(오라클에는 존재 X LIMIT)
SELECT 문의 순서가 헷갈릴 수도 있지만 자주 보다보면 익숙해 질 것이다 ⭐️
'Back End > DataBase' 카테고리의 다른 글
Inline View (인라인뷰)에 대하여 (0) | 2024.12.20 |
---|---|
JOIN에 대하여 (4) | 2024.12.18 |
LIKE 연산자와 와일드 카드 패턴에 대하여 (8) | 2024.12.18 |
SQL 구문 순서에 대하여 (0) | 2024.12.18 |
SELECT에 대하여 (0) | 2024.12.17 |