작성
·
505
·
수정됨
0
안녕하세요 선생님. 강의 항상 잘 듣고 있습니다.
PK인 컬럼에 대해 DISTINCT를 적용하는 것에 대한 의문이 들어 질문을 남깁니다.
PK는 해당 테이블의 가장 고유한 값이기에 중복되지 않는 고유한 값을 가지고 있는 것으로 알고 있는데, GROUP BY에서 COUNT를 적용하는 과정에서 (PK인 컬럼에 대해) DISTINCT를 적용하여 세는 것이 가장 일반적인 방법이라고 말씀하신 이유가 궁금합니다. PK가 아닌 다른 컬럼에 대한 적용을 염두한 말씀이신가요?(해당 사례는 CUSTOMERS 테이블에 대해 CustomerID를 DISTINCT로 적용하여 COUNT하는 상황이었습니다.) 아니면 다른 이유가 있는 것인지 궁금합니다.
아래의 세 집계함수에 어떤 차이가 있는 것인지 궁금합니다.
COUNT(DISTINCT PK)
COUNT(PK)
COUNT(*)
감사합니다.
답변 1
0
안녕하세요 reinsaz님 질문주셨는데 오래 기다려주셔서 감사합니다.
위의 PK를 대상으로 count를 하는 부분에 대해서 질문을 주셨는데요, 이 부분에 대해서는 단일 테이블이 아닌 상황을 생각하고 말씀드린 것으로 봐주시면 좋을 것 같아요. 강의 내에서 설명이 부족했던 것 같아 부연 설명을 남깁니다.
말씀대로 단일 테이블 내의 PK는 중복되지 않고 null을 허용하지 않기 때문에 테이블 내의 무결성이 확보되었다면 PK의 수 = 전체 row의 수인 것이 맞습니다. 그렇기 때문에 count(*)를 하거나 count(distinct PK)를 하거나 동일한 결과를 보실 수 있을거에요.
실무에서 지표를 추출할 때에는 1:N관계 등의 여러 테이블과 JOIN을 수행하게 되면서 원천 데이터가 PK를 포함하여 중복이 생기는 상황이 발생하는데요, 이 때에 count(distinct PK)를 통해 이러한 중복을 제거하고 추출하고자 하는 지표의 원래 의미에 가장 부합하는 PK 컬럼을 중복없이 카운트해주어야 한다는 의미로 받아들여주시면 좋겠습니다.
추가로
COUNT(DISTINCT PK)
COUNT(PK)
COUNT(*)
각각의 의미에 대해서 질문을 남겨주셨었는데요,
count(*)의 경우에는 대상 테이블이 되는 테이블의 모든 행 수를 반환하게 됩니다.count는 각 행에 주어진 인풋값이 할당된 횟수를 보여주는 것이기 때문에 count(1)도 동일하 결과를 보여줍니다.
count(PK)도 위와 동일하게 PK라는 컬럼의 모든 카운트 값을 반환해주지만, null값의 경우에는 카운트를 하지 않으며 중복은 제거하지 않습니다.
count(distinct PK)의 경우에는 위의 count(PK)와 동일하지만 중복값을 제외하고 카운트해줍니다.
이외에 해결되지 않은 부분 있으면 질문 또 남겨주세요.
감사합니다.