본문 바로가기

Development Note

SQL : HAVING

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

지나치다가 이런 HAVING 이라는 SQL 명령어를 보게 되었다. 어디서 많이 봤는데 라는 생각만 들었지 어떻게 사용하는지 언제 사용하는지 몰랐다. 이런.. 수년간의 SQL 작성에 대해서 부정받는 느낌이었다. 그래서 부끄럽지만 뒤늦게 찾아보았다. 역시.. 그래서 인지 내 쿼리가 지저분 했던거군 -_-;; 이런 생각이 제일 먼저 들었다. 아마 이 쿼리에 대해서 잘 알았다면 아래처럼 쿼리를 작성하지는 않았을 것이다. 


아래 쿼리를 대략적으로 설명하자면 부서별 직원 숫자를 알아보는 쿼리인데 집계한 직원 수 중에서 2만명이 넘는 조직들을 조회하는 것이다. HAVING 을 알기 전엔 아래처럼 쿼리를 짜놓고 더이상 할 것이 없다.. 하고 있었겠지만 이걸 보고 있자니 이렇게 안할 수 있는 방법도 있는데.. 하는 생각만 들고 있다. 먼저 아래 쿼리는 다소 불필요해보이는 구절이 많다. 실제 3가지 테이블을 조인하여 GROUP BY 한 집합 테이블을 감싸는 다른 형태의 쿼리가 또 등장하는데 이 감싸고 있는 쿼리가 사실은 별로 의미가 없다는 것이다. 실제로 필요한 부분은 WHERE 절 정도일 뿐인데 말이다.

SELECT
   *
FROM
   (
      SELECT
         de.dept_name
         ,count(de.dept_no) as count
      FROM
         employees e JOIN dept_emp d ON e.emp_no = d.emp_no
         JOIN departments de ON d.dept_no = de.dept_no
      GROUP BY de.dept_no
   ) a
WHERE
   a.count > 20000


HAVING 은 집합 테이블에서 WHERE 절 처럼 사용할 수 있도록 도와주는 예약어 이다. 다음은 위의 다소 불필요한 것들이 섞여 있는 쿼리를 단순화 시킨 것이다. 예쁘게 만들기 위해서 탭과 라인 변경을 써서 만들지 않아도 되기도 하고.. 여러가지로 단순하다. 그래서 현장에서 배우는 SQL 이든 요점만 간단하게 배우는 식의 교육의 폐단이 이런거다. 의외로 기초적인 것들을 모르고 지나쳐서 나중에 다른 더 고차원의 지식이 필요할때 베이스가 없어서 허덕이는 문제.. ㅠ


SELECT
   de.dept_name
   ,count(de.dept_no) as emp_count
FROM
   employees e JOIN dept_emp d ON e.emp_no = d.emp_no
   JOIN departments de ON d.dept_no = de.dept_no
GROUP BY de.dept_no
HAVING emp_count > 20000


위와 같이 바꾸면 WHERE 절에 있는 조건식만 있고 실제 불필요한 예약어들은 싹 사라졌다. 굉장히 명쾌하고 가독성이 높은 표현으로 바뀌었다. 또 이런 구멍 지식이 어디 있을텐데;;