• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

제가 작성한 쿼리문도 맞게 쓴걸까요?

22.06.06 22:34 작성 조회수 172

1

select *, max(price)
from products

저는 위의 쿼리로 작성을 했는데요, 이 구문을 썼을 때 정답화면과 같은 결과물이 나오더라구요. 

근데 헷갈렸던 부분이 제가 작성한 select절에 대한 해석이었는데요, 

1. "모든 정보를 가져오는데, 그 중 가장 최댓값의 가격을 지닌 정보만 출력해줘"
2. "모든 컬럼이랑 최댓값 컬럼까지 같이 보여줘"

이 둘 중 어느 뜻인지 모르겠더라구요. 제가 이해한 select절은 2번이었어서, 예상되는 결과값은 모든 정보들이 다 출력이 되고, 그 정보들 중 price가 동일한 값이 있을 경우 최대인 price를 지닌 컬럼만 노출이 되는..?? 것이었는데 

실제로 나온 결과값은 1번이었어서 질문드립니다! 

답변 2

·

답변을 작성해보세요.

1

오민영님의 프로필

오민영

질문자

2022.06.07

아아 이해했습니다!

  1. 집계 함수라는 것 자체가 기본적으로 그룹 전체에 적용되기 때문에
  2. 특정 항목에 대한 집계 결과를 보고 싶을 경우 그룹핑을 해야 한다.
  3. 만약 그룹핑 하지 않고 질문했던 쿼리처럼 실행할 경우 테이블 내 모든 항목 중 집계 함수에 해당하는 값이 출력된다. 

이렇게 이해하면 될까요? 이론적인 내용인 것 같은데 재밌네요!ㅎㅎ 설명 감사합니다! 

Joe님의 프로필

Joe

지식공유자

2022.06.07

정확합니다b

Joe님의 프로필

Joe

지식공유자

2022.06.08

+
섹션2의 마지막 강의란에 "업데이트) Group By의 동작 원리 그림으로 따라가기"로 추가된 영상을 참고해주세요. 감사합니다 : ->

오민영님의 프로필

오민영

질문자

2022.06.08

업데이트 해주신 영상 확인했습니다. 어떤 개념인지 더 잘 와닿았어요. 추가 설명까지 감사합니다!(꾸벅)

0

Joe님의 프로필

Joe

지식공유자

2022.06.07

 

 

안녕하세요 민영님, 질문 감사합니다

어떤 부분이 모호하셨을지 이해가 갑니다. 질문하기 모호한 부분을 명확하게 잘 정리해주셨네요.

이 Function과 그루핑하는 부분이 처음에 이해하기가 좀 알쏭달쏭한 측면이 있는데 이 부분만 잘 넘어가면 SQL 실력이 한층 더 높아지실 것 같아요.  곧 답변 달아둘게요.

 

-------

근데 헷갈렸던 부분이 제가 작성한 select절에 대한 해석이었는데요, 

1. "모든 정보를 가져오는데, 그 중 가장 최댓값의 가격을 지닌 정보만 출력해줘"
2. "모든 컬럼이랑 최댓값 컬럼까지 같이 보여줘"

이 둘 중 어느 뜻인지 모르겠더라구요. 제가 이해한 select절은 2번이었어서, 예상되는 결과값은 모든 정보들이 다 출력이 되고, 그 정보들 중 price가 동일한 값이 있을 경우 최대인 price를 지닌 컬럼만 노출이 되는..?? 것이었는데 

 

  -->위의 쿼리로 실행하면

ProductID ProductName SupplierID CategoryID Unit Price max(price)
38 Côte de Blaye 18 1 12 - 75 cl bottles 263.5 263.5

1번 에서 기대할 수 있는 값이 나오는데요

 

2.에서 기대하신 출력결과는

ProductID, ProductName, ... ,max(price)

---------------------------------------------

##  ## ........... 263.5

## ## ............. 263.5

...

## ## .............  263.5

이런 결과였을 것 같은데요, 이 결과를 출력하려면 아래와 같은 쿼리를 작성해야합니다. 

 

# ----------------------------------------------------------

select *, (select max(price) from products) as maxPrice

  from products

# -----------------------------------------------------------

전체 값을 그대로 두고, 컬럼 하나를 추가하는 형태인것이죠. 

아래 쿼리도 참고하면 더 쉽게 이해가 가능할 것 같아요.

 

# ----------------------------------------------------------

select *, 265 as maxPrice

  from products

# -----------------------------------------------------------

 

265라는 하드코딩으로 숫자를 넣어주었더니, 기존의 products 테이블 레코드에 265를 하나하나 다 가져다가 붙여준 형태인거죠. products의 row 개수만큼 붙여주는 것입니다.

 

하지만 보여주신 쿼리는 max라던지 count라던지 이런 Aggregate Function이 돌아가는 원리를 생각해본다면, 위의 쿼리처럼 기존 테이블 레코드의 모든 row에 max값을 붙여주는게 아니라는 것을 알 수가 있습니다. Aggregate라는 영어의 뜻도 종합하여~ 이런 뜻인데요, Aggregate Function 는 기본적으로 어떤 그룹 전체에 적용되는 함수입니다. 그래서 그루핑을 설정 안해준 경우 from 에서 불러오는 테이블의 모든 레코드가 대상이 되는 것이고요. 올바른 값은 1줄만 나와야 하는 것이죠. (강의 목차에서도 그루핑과 Aggregate Function를 함께 다루는 이유입니다.)

 

 그래서 전달주신 쿼리를 실행하면, 그루핑은 설정이 되어있지 않으니, products 테이블에 있는 모든 레코드들이 한 그룹인것이고, 그 그룹에 대하여 max가 적용되며, 해당 max에 해당하는 모든 컬럼의 레코드들(*)이 함께 나오는 형태에요. 위 쿼리의 경우 애초에 실행이 안되도록 막아둔 DB도 있는데 우리 실습 환경에서는 일단 실행은 되도록 나오네요. 글로 설명드리려니 쓸데없이 장황해지는 것 같은데 그루핑 원리에 대한 영상 곧 추가해두고 알려드릴게요