이번에는 Group by에 대해서 설명드리겠습니다.

    Group

    Join에 대해서 조금 디테일한 설명을 드리려고 했더니, 

    Group by를 설명하지 않으면 예제를 설명할수 없는 케이스가 있어서

    Group by에 대해서 설명을 한후 Join에 대해서 조금 디테일한 설명을 드리겠습니다.


    Group by는 언제 사용을 하냐하면 

    1. Select 와 From 사이에 집계함수가 들어간 경우

    2. 조회 결과를 Group 지어서 봐야하는 경우

    이 두가지 케이스 중에서 1번이 가장 많이 사용하는 케이스 입니다.

    왜냐하면 매출을 보거나, 판매량을 보거나, 재고가 몇개가 있거나 등등

    자료를 추출할때 집계함수를 참 많이 쓰거든요.

    그래서 Group by를 써야하는 경우가 참 많습니다.

    집계함수


    그럼 아래의 예제로 SQL을 작성해보면서 설명 드리겠습니다.

    People_lis란 테이블이 있고, 오른쪽 처럼 결과를 만들어 내고 싶습니다.

    그럼 SQL은 아래와 같이 작성을 하시면 됩니다.

    위에서 부터 하나하나씩 설명 드리겠습니다.

    1. 저는 결과를 팀명, 인원의 두개의 컬럼으로 결과를 보려고 합니다.

    그럼 Select 와 From절에는 콤마로 구분한게 하나만 있으면 됩니다.

    2. 이름부분에 카운트를 해야 해당팀에 몇명이 있는지 볼수 있으니 이름을 Count합니다.

    3. 테이블 이름을 적습니다.

    4. group by절에는 집계함수를 쓴 컬럼을 제외한 나머지 컬럼을 적어 줍니다.

    Group by절에는 집계함수를 쓴 컬럼을 제외한 나머지 컬럼을 적어 줍니다.

    이게 가장 중요합니다. 집계함수를 쓴것을 제외하고 나머지에 대해서 컬럼에 적어준다..

    저도 이부분에 대해서 처음에 잘 이해가 되지 않았습니다.

    하지만 여러가지 SQL을 작성하다 보니 조금 이해가 되어서

    제가 이해한 방식을 설명드려보도록 하겠습니다.

    제일 먼저 이름 부분에 대해서 카운트가 됩니다.

    그럼 2개의 행에 대해서 카운트가 되어 2가 들어가게 됩니다.

    하지만 여기서 문제가 발생을 합니다.

    행이 2개였던것이 카운트를 함으로 인해서 1개로 합쳐진 결과가 나오거든요.

    엑셀에서의 병합한것 처럼요. 하지만 Db에서는 저렇게 표현이 될수가 없습니다.

    그래서 저부분을 해결해야 하는데 해결방법은 같은 팀명에 대해서 그룹을 지어주면 해결이 됩니다.

    그래서 Group by에 people_list.팀명을 넣어주게 되는 것입니다.

    자.. 이걸 좀 쉽게 바꾸면 집계함수를 사용하지 않은 컬럼은 모두 group by에 넣어준다.

    맞죠? 인원컬럼에 Count를 했으니, 그것을 빼고 다른 컬럼을 Group by에..

    그리고 where절까지 쿼리를 작성하시고 Group by를 넣지 않았다 하면

    에러가 발생을 하던가 아니면 제대로된 결과가 나오지 않습니다.

    이부분은 실습에서 보여드리겠습니다.

    여기서 주위하실 사항이 하나 있습니다.

    Select 와 From절에 산술함수와 집계함수를 같이 쓰는 경우가 있습니다.

    그중에서 산술함수(더하기, 빼기, 나누기,곱하기)를 사용할때는 Group by절에 넣어주시면 안됩니다.



    이번에는 Distinct에 대해서 설명 드리겠습니다.

    Distinct는 중복 제거하는 함수 입니다.

    하나의 컬럼에 적용을 할수 있고,

    Select 와 from사이에 넣으면 전체 보고자 하는 컬럼에 대해서 중복제거가 됩니다.

    이게 왜 필요하냐..

    어떤 데이터에 대해서 Sum, Count등을 할때,

    이 중복제거하는 함수를 잘 써야지만 정확한 데이터를 추출 할수 있습니다.

    아래의 예제 표로 설명 드리겠습니다.


    여러 상품들 중에서 판매된 상품의 가짓수가 궁금합니다.

    예를들어 내가 판매하고 있는 상품이 100개인데, 그중에 매출이 난것이 몇개인지

    알고 싶을때 입니다.

    왼쪽과 오른쪽의 SQL이 조금 다릅니다.

    왼쪽은 상품명을 그냥 Count하였고, 오른쪽은 상품명을 Distinct한후 Count하였습니다.

    왼쪽은 결과가 4가 나올꺼구요, 오른쪽의 SQL은 3이 나올껍니다.

    위에 보시면 판매된 상품의 가짓수이니, 초코파이는 중복 제거되고 카운트를 해야하죠..

    그래서 오른쪽 SQL이 맞습니다.

    이렇게 보면 쉬운것 같지만, 데이터가 많으면 최종 결과만을 가지고 제대로 중복을 제거해야하는지

    아닌지 판단하기 어려운 경우가 많이 있습니다.

    그래서 Count를 쓰실때는 유의 해서 사용하셔야 합니다.

    또한 자주하는 실수가 있습니다.

    Distinct(count(product_list.상품명) 이렇게 쓰실경우도 있습니다.

    이러면 정말 큰일납니다.

    SQL작성시 해석은 괄호 안에서 바깥쪽으로 해석을 해주셔야하고,

    실행 되는 순서도 마찬가지 입니다.

    자.. 그럼 두가지를 해석해보겠습니다.

    이렇게 보면 제대로 결과가 나온것 같죠?

    밑에꺼를 sum을 하면 3으로 결과가 같으니까요.

    테이블의 데이터를 조금 바꿔 보겠습니다.

    이런 테이블의 데이터를 count해보려고 합니다.

    그럼 결과는 위와 같이 나옵니다.

    두번째것을 적용해서 해석해보면 콜라,사이다를 카운트 했습니다.

    그럼 1,1이 나옵니다.

    테이블에 1개씩의 데이터가 있으니까요.

    거기에 distinct가 적용이 됩니다.

    숫자 1,1 은 중복이니 하나를 없애버리는거죠.

    자 이렇게 보면 count쓰실때 distinct를 잘못쓰면 결과가 완전 틀려지겠죠?

    이런부분 조심해서 사용하셔야 합니다.

    Distinct는 중복 제거할때 사용한다.

    단 Count와 같이 쓸때는 조심해야한다를 명심하세요.





    마지막으로 Alias를 설명 드리겠습니다.

    Alias에 대해서 어학 사전을 찾아보면 이렇게 설명이 되어 있습니다.

    이것을 어떤때에 사용하냐 하면 테이블명이나 컬럼명을 줄여 쓰거나,바꿀때 사용합니다.

    제가 예제로 써드리는것은 SQL이 짧아서 오래 걸리지 않으나,

    SQL이 길어지고, 테이블명이 길어지면 SQL작성시 엄청 시간이 많이 걸립니다.

    그래서 줄여쓰는 경우에 많이 사용되는데요.

    아래의 예제로 설명 드리겠습니다.

    위에 예제로 작성 했던 SQL인데요.

    Alias적용과 적용하지 않았을때를 비교하였습니다.


    제가 Alias적용된 부분에 빨간 박스 표시를 하였습니다.

    여기에는 테이블명을 줄여 쓰는것과 컬럼명을 바꿀때 사용하는 부분이 둘다 들어가 있습니다.

    자~ 하나씩 설명을 드리겠습니다.

    제일 먼저 테이블명을 한번 보시면

    People_list pl 이라고 되어 있습니다.

    여기서 테이블명 을쓰고 한칸을 띄운다음 pl이라고 써줬습니다.

    그러면 이제부터 select ~ from ~ where~group by~oredr by에서는

    pl이라고만 써도 people_list라고 알아먹습니다.

    지금은 테이블명이 짧아서 그렇게 줄여쓸필요 없다고 생각하시는데요..

    만약 테이블명이 product_property_attribute_information 이렇게 적혀 있다고 생각 해보세요.

    딱 두개의 컬럼을 불러오는데도 이렇게 길어집니다.

    product_property_attribute_information.상품명, product_property_attribute_information.정보

    만약 10개 이상의 컬럼을 가져와야 한다면 멘붕이...

    그래서 테이블명에 Alias를 적용 하는게 좋습니다.

    그리고 컬럼명을 변경하는 경우가 있습니다.

    위에서 count(prople_list.이름) 이부분입니다.

    이렇게 작성하시고 결과를 내면 컬럼명이 count로 나옵니다.

    그럼 이게 몬지 알수 없겠죠..

    거기다가 만약 sum,count,max가 select와 from사이에 같이 있다면

    이게 어떤 합계인지, 카운트인지, 최대값인지 모르겠죠.

    그래서 여기서는 컬럼명을 변경 해줘야 합니다.

    count(pl.이름) as 인원 이렇게 적어주시면 해당 컬럼명은 인원으로 보입니다.

    count(pl.이름) as 인원 또는 count(pl.이름) 인원 이렇게 써도 결과는 똑같습니다.

    하지만 as를 쓰는 이유는 컬럼명에 alias를 적용했다를 구분하기 위해 저는 사용합니다.

    이건 필수는 아니나 사용해보니 테이블명에서는 스페이스로 Alias를 적용해주고,

    컬럼명에서는 as로 적용해주면 나중에 다시 확인할때도

    구분이 되어 확인이 편리 했습니다.

    다음에는 변환함수에 대해서 설명 드리겠습니다.





    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기