ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL 기본 문법 - 필터링하기 2
    데이터베이스/MySQL 2020. 10. 8. 15:44

    SQL에서 기본적으로 가장 많이 사용하는 필터링 방법은 'where'를 이용하는 것이다.

     

     

    select * from web where country = "한국" and messenger="카카오";

     

     

    'select' 문 뒤에 'where'절과 조건을 써주면 편리하게 쓸 수 있다.

     

    하지만 'where' 외에도 조건을 써줄 수 있는 쿼리문이 있다.

     

    바로 'having'이다.

    1. 'having'의 사용

    'having'도 'where'처럼 조건을 걸어서 데이터를 필터링해줄 수 있다.

     

    그러나 이때 제약 조건이 있다.

     

    'having'은 'group by'를 통해서 그룹화 된 데이터에만 조건을 걸 수 있다는 것이다.

     

    우선 코드를 보자.

     

    select * from web group by country;

     

     

    위의 테이블을 나라별로 나누면 다음과 같이 나온다.

     

    그렇다면 여기서 '라인' 메신저를 사용 중인 데이터만 선택하고 싶다면 어떻게 해야할까?

     

    다음과 같이 'group by' 다음에 'having'를 이용하여 필터링을 하면 된다.

     

    select * from web group by country having messenger = '라인';

     

    결과는 다음과 같다.

     

     

    'group by'를 이용하여 그룹화한 데이터를 필터링할 때는 'where'를 사용할 수 없다.

     

    그렇기 때문에 이럴 때 'having'을 사용하는 것이다.

     

    다만 'having'을 사용할 때 주의할 점이 있다.

     

    2. 'having' 사용시 주의점

    앞서 말했듯 'having'은 'group by'와 한 세트로 다닌다.

     

    즉 'having'은 이미 'group by'를 통해 필터링 된 자료에서만 필터링이 가능하다는 것이다.

     

    코드를 보면 이해가 쉽다.

     

     

    위의 표와 같은 다음과 같은 표가 있다고 하자.

     

    이 중에서 카카오를 'having'을 이용해서 걸러보자.

     

    위에서 한 것처럼 나라별로 데이터를 묶어준 뒤 그 중에서 'messenger' 열의 데이터가 '카카오'인 행을 출력하자.

     

    아마도 실행 쿼리문은 다음과 같을 것이다.

     

    select * from web group by country having messenger = '카카오';
    

     

    그런데 이렇게하면 결과가 안나온다. 왜냐하면 나라별로 분류했을 때 결과는 다음과 같다.

     

     

    이 데이터 중에 'messenger'열에 '카카오'데이터가 없기 때문이다.

     

    즉 이 데이터에서 아래와 같이 쿼리문을 사용해서 '라인' 메신저를 사용하는 데이터는 걸러낼 수 있다.

     

    select * from web group by country having messenger = '라인';

     

    왜냐면 이미 그룹화된 데이터에 '라인' 메신저를 사용하는 데이터가 있기 때문이다.

     

    하지만 '카카오'는 여기 포함되지 않기 때문에 쓸 수 없는 것이다.

     

    그렇다면 어떻게 해야할까?

     

    그럴 때는 우선 'messenger'를 기준으로 데이터를 그룹화하고 그 뒤에 추출해주면 된다.

     

    select * from web group by messenger;

     

     

    위 쿼리문을 실행하면 위와 같이 'messenger'별로 그룹화하여 데이터를 분류할 수 있다.

     

    그리고 다음과 같이 'having'을 이용해서 '카카오'를 필터링해주면 된다.

     

    select * from web group by messenger having messenger = '카카오';

     

    결과는 다음과 같다.

     

     

    정리하자면 다음과 같다.

     

    'having'도 'where'처럼 필터링이 가능하다.

     

    단, 'group by'와 함께 세트로 사용해야 한다.

     

    또한 'having'은 'group by'를 통해 이미 필터링 된 데이터 중에서만 필터링이 가능하다는 것이다.

     

Designed by Tistory.