인프런 커뮤니티 질문&답변

양키님의 프로필 이미지
양키

작성한 질문수

[개념반]배워서 바로 쓰는 SQL 쿼리

실습 문제 3-4 (Functions)

group by에 대해서

작성

·

410

1

강사님 수업 잘듣고 있습니다. 갑자기 문제풀면서 실습하다가

모르는 점이 생겨서요!!

group by가 집계 연산자를 실행할 때 기준을 알려주는 라인이라고 말씀하셨는데요.

그럼 집계 연산자를 쓰지 않을 때는 아예 쓰지를 않는건가요?

SELECT * from Products group by SupplierID

이렇게 출력했더니 

저는 groupby를 기준이 되는 컬럼으로 모든 행을 보여준다고 생각했는데 기준이 되는 행에서 중복이 되면 안보여주고 

위 사진처럼 sql을 실행시키면 SupplierID 의 값별 첫 행만 보여주더라구요.

원래 이런건가요?? * 와일드카드로 모든 컬럼을 불러왔는데도 어떻게 이렇게 실행이 되는거죠?? 원리대로라면  모든 값을 가져와야 하는 것 아닌건가요??

이게 맞다면 애초에 groupby라는 기능이 중복이 되지 않게 기준이 되는 열을 모아서 보여주기만 한다는 것인가요?

말이 너무 길어졌네요ㅜㅜ 계속 쉽게쉽게 이해되다가 갑자기 뭔가가 이해가 안가서요...

답변 1

0

Joe님의 프로필 이미지
Joe
지식공유자

안녕하세요! 제가 본업이 바빠 질문주신 것에 이제 답변을 남깁니다 ㅠㅠ..

그루핑을 컴퓨터에게 수행시켰을 때, 왜 그룹별 1 row씩만 나오는지 질문 남겨주셨었는데요, Group By를 통해 그루핑을 하게되었을 때 컴퓨터가 이를 어떻게 가져오는지 생각해보면 생각보다 간단하게 이해가 되는 부분입니다.

 설명을 위해 '주머니'라는 단어를 가져다가 잠시 쓰겠습니다. 그루핑을 하기 위해 위에서 처럼 'group by SupplierID'를 쿼리에 넣어주면 컴퓨터는 SupplierID를 기준으로  일종의 '고유한 주머니'를 생성합니다. SupplierID 안에 A, A, A, B,B 이렇게 여러 값들이 중복해서 들어있더라도 이를 distinct처리하여...  (A 주머니) (B 주머니) 이렇게 두 개의 '고유한 주머니'를 만드는 거죠. 그리고 나머지 컬럼 값들을 각 주머니별로 나누어서 넣게 됩니다. 이것이 Group By가 해주는 역할이고, 그루핑이라 부릅니다.

 

 저희 강의에서 같이 보았듯이, 그루핑을 해주는 이유는 집계 함수를 쓰기 위함이었죠. 주머니별로 avg든, max든 집계함수를 적용하면 주머니별로 각각의 함수 값을 리턴하여 각각의 주머니별 값을 리턴해주었는데요, 그루핑을 해놓고 함수를 안쓰게되면 위에서 보신 것 처럼 각 주머니 기준(SupplierID)별 맨 위에 등장하는 row가 반환이 됩니다..

먼저 가장 맨 위에 등장하는 row가 반환되는 이유는, 그루핑을 할 때, 주머니를 만들고, 컴퓨터의 포인터가 가장 위에서 부터 내려가면서 주머니에 각각의 값들을 넣어주게 되는데 이 때 가장 처음으로 넣는 row가 주머니의 맨 위에 들어있기 때문입니다. 그루핑을 했으니.. 집계함수를 쓰건 어떤 함수를 쓰겠지? 했는데 그냥 단순 row 출력을 실행하도록 하니 그냥 주머니에 넣어둔 row값 중 맨 처음 row값을 반환해주고 끝나는 것이죠. 이 때 각 주머니, 즉 여기선 동일한 SupplierID별로  두 건 이상의 row가 등장해서는 안됩니다. 기준이기 때문이에요. 기준은 중복될 수 없고 중복되는 순간 기준의 의미를 상실하게 됩니다.

정리하자면, 1) Group By는 집계함수를 쓰기 위한 목적 하에서 사용되며, 2) 그렇기 때문에 집계함수를 안쓰고 기준으로 적어준 컬럼 외의 컬럼명을 select에서 적어줄 경우 기준별 가장 상단에 등장하는 row값이 반환된다고 할 수 있습니다. 일반적인 용법이 아니라는 의미입니다.

줄글로 설명드리다보니 잘 전달이 되었을지 잘 모르겠네요. 이 부분은 언젠가 영상으로 다시 한번 제작하여 강의 내에 올리도록 하겠습니다. 그 때가 되면 알림을 이 답변으로 한번 더 드리도록 할게요.

감사합니다 :D

양키님의 프로필 이미지
양키

작성한 질문수

질문하기