본문 바로가기
데이터 분석/SQL(Structured Query Language)

SQL WHERE vs HAVING의 차이 (실전 문제)

by debugglinglife 2024. 2. 21.
728x90

[SQL(Structured Query Language)] - 데이터베이스 분석의 필수 도구, SQL 기본 명령어 마스터하기!(SQL 기초를 알고 싶다면 링크 참고)

SQL 학습 과정에서 WHEREHAVING의 사용 시점이 혼란스러울 수 있습니다. 대체로 WHERE 구문을 먼저 배우고 이를 충분히 이해한 후, HAVING에 대한 예제를 통해 두 구문의 차이점을 명확히 이해하는 것이 중요합니다.

 

특히, HAVING을 언제 사용해야 하는지에 대한 이해는, 프로그래머스의 실제 연습 문제를 풀어보는 과정에서 자연스럽게 얻어질 수 있습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/157342

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

❑ 문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블 예시 (자세한 내용은 연습문제 링크에서 확인)

Output1

❑ 풀이 과정

요구 사항이 많지만 차근차근 풀어보면 어렵지 않습니다.

  • 먼저, 조건 대여기간이 7일 이상인 조건이 아니라 vs _평균 대여 기간_이 7일 이상인 자동차ID →(평균) 이라는 단어로 Group by를 생각하고, 그 이후에 평균 대여 기간의 7일 이상이라 (조건) -Having을 써야겠다는 생각을 했다면 잘한 것이다. (처음에 생각없이 WHERE을 썼는데 - 바로 오류 메시지 등장 ⚠️)
    ⛔ 오답
    -- WHERE은 전체 (From + Table)에 대한 조건 | 현재 문제에서는 Group by 평균 대여 기간이 7일 이상인 경우라서 Having을 사용해야 한다. -- 
    SELECT 
    car_id,
    ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) as AVERAGE_DURATION
    From CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    WHERE ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) >=7
    GROUP BY car_id
    ORDER BY ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) DESC, car_id DESC
  • 평균 대여 기간 구하기 (DATEDIFF) : (MySQL기준) 날짜 사이의 기간을 구할 때 사용 (w3school 참조) + 대여기간 일수를 구하기위해 +1 까지 해줍시다.
  • SELECT DATEDIFF("2017-06-25", "2017-06-15"); -- Output 10
  • 그 외 : AVG - 평균 | ROUND - 반올림 | as 이름을 변경

❑ SQL 코드 (💯정답)

SELECT 
car_id,
ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) as AVERAGE_DURATION
From CAR_RENTAL_COMPANY_RENTAL_HISTORY 
GROUP BY car_id
HAVING ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) >=7
ORDER BY ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) DESC, car_id DESC

 

결과

Output2

 

728x90