작성
·
415
1
group by 챕터에서 알려준대로 실행했을 때 궁금증이 생겼는데요, group by를 안 쓰고,
select country, count(*) from customers ;
위와 같이 쓰면 germany 91로 나오는 데 수 많은 나라 중 독일만 나오는 건 왜일까요? (GROUP BY랑 where이랑 차이점을 모르겠어요. )
더불어, count(distinct customerID)라고 쓰셨는데, ID는 무엇을 의미하는건가요? 같은 명의 컬럼이 없는데, 임의로 id라고 쓰는 이유는 뭔가요
실습문제4에서는 group by customerid에 o.customerid라고 안써도 작동이 되었는데, 왜 실습문제5에서는 select o.customerid라고 해야 작동될까요?
그리고, select에 구문을 쓰는 것과 where에 구문을 쓰는 것은 차이가 있을까요? 가령 count라는 것을 where에 같은 컬럼에 쓰는 거랑 select에 쓰는 거랑 뭔 차이예요?
개념적 질문인데요, 하나의 질문에 sql statement가 사람당 셀 수도 없는 다양한 답이 나올 수가 있는건가요?
띄어쓰기를 여러번하나 한 번 하나 똑같은 값이 나오는 건가요? 띄어쓰기의 정도는 지문 쓰는 데 상관 없나요?
답변 1
0
예은님 안녕하세요? :)
고민하셨던 질문 남겨주셔서 감사합니다.
1번 질문
group by 챕터에서 알려준대로 실행했을 때 궁금증이 생겼는데요, group by를 안 쓰고,
select country, count(*) from customers ;
위와 같이 쓰면 germany 91로 나오는 데 수 많은 나라 중 독일만 나오는 건 왜일까요? (GROUP BY랑 where이랑 차이점을 모르겠어요. )
이유만 먼저 말씀드리면 독일(Germany)에 해당하는 row가 가장 먼저 등장했기 때문입니다.
아래 이미지를 한번 볼까요? 먼저 group by를 빼고 작성한 쿼리의 결과값입니다.
count(*)의 경우에는 전체 row의 값인 91건을 출력하고 있지만 country는 germany만 출력되고 있습니다. 다시한번 원래 customers 테이블의 rows들을 보면은 아래 이미지와 같습니다.
맨 첫번째 row의 country값이 Germany인 것을 확인할 수 있습니다.
Group By와 Count가 어떻게 작동하는지 한번 다시 생각해보면 왜 Germany만 나왔는지 알 수 있습니다.
Count는 Aggregate Function로 집계함수의 한 종류에요. 즉, 여러줄의 row를 집계하여 결과를 출력해주는 역할을 해주기 때문에 기본적으로 결과값을 1개로 요약하려는 성질을 가지고 있습니다. 우리가 뭔가를 세거나 할 때 결과값은 하나인 것 처럼요 (학교의 총 학생수 30명, 제품의 총 갯수 382개...)
Group By는 이러한 집계함수와 함께 쓰여 집계출력값을 각 기준별로 여러개를 출력할 수 있도록 해주는 역할을 해줍니다. 학교의 학생수가 30명인데, 그 중 한국 학생, 해외학생.. 별로 카운트를 하고 싶다면 그루핑을 지어서 묶어주는 것이죠. (학교의 한국 학생 19명, 해외 학생 11명..)
그렇기 때문에 group by를 제외하면 count는 customers 테이블의 전체 회원에 대하여 row의 갯수를 세려고하게 됩니다. 그런데 쿼리에서 Select절에서 Country를 출력하도록 했지만 Country는 1개가 아니기 때문에 여기서는 컴퓨터가 테이블을 읽을 때 가장 먼저 발견한 1행의 Country값을 단순 출력만 해주고 있는 것이죠.
이러한 결과는 사실 큰 의미가 없는 결과입니다. 독일에 살고있는 회원 수가 91건이 아니니까요. 그래서 우리 모의쿼리환경에서는 실행이 되고는 있지만 원천적으로 이러한 쿼리가 막혀있는 DB환경도 더러 있습니다. 여기서는 원리를 이해하는 데에만 집중해주시면 좋을 것 같습니다.
2번 질문
더불어, count(distinct customerID)라고 쓰셨는데, ID는 무엇을 의미하는건가요? 같은 명의 컬럼이 없는데, 임의로 id라고 쓰는 이유는 뭔가요
이 부분은 "CustomerID"가 전체 컬럼명인데요 아무래도 ID 부분이 대문자로 되어있어서 혼동을 드리지 않았나 싶습니다.
ID는 Identifier의 약자로 식별자라는 뜻인데요, DB의 세계에서는 테이블에 있는 각 행을 구분해주기 위한 식별자로 이러한 ID를 꼭 추가해서 식별하고 있습니다. 여기서 CustomerID는 고객의 고유식별번호로 중복되지 않는 값을 가집니다. 그렇기 때문에 저 CustomerID를 중복되지 않게 세도록 하는 부분이 count(distinct CustomerID)인 것이죠. (우리 모의쿼리 환경에서는 컬럼을 대소문자 구분없이 써도 작동이 되고 있습니다.)
3번 질문
실습문제4에서는 group by customerid에 o.customerid라고 안써도 작동이 되었는데, 왜 실습문제5에서는 select o.customerid라고 해야 작동될까요?
이유만 먼저 말씀드리면 조인(Join)을 했기 때문입니다. 조인은 강의에서 설명하고 있듯이 여러 테이블을 하나로 합치는 것인데요, 그러다보니 같은 이름의 컬럼명이 여러 테이블에 존재할 수 있는 상황이 생기게 됩니다. 이것을 컴퓨터에게 헷갈리지 말라고 조인을 할 때에는 각 테이블별로 별칭(alias)를 지정해주는데요, o라는 별칭을 지정한 테이블의 customerid를 지칭하도록 해줘야만 작동되는 쿼리이기 때문이에요.
4번 질문
그리고, select에 구문을 쓰는 것과 where에 구문을 쓰는 것은 차이가 있을까요? 가령 count라는 것을 where에 같은 컬럼에 쓰는 거랑 select에 쓰는 거랑 뭔 차이예요?
그 역할에 차이가 있어요. select은 우리 눈에 보이는 컬럼을 어떤 컬럼을 가져올까? 하는 부분을 컨트롤 하는 부분이고 where는 원하는 부분만 가져오도록 필터링하는 부분이에요.
그렇기 때문에 count를 select에 쓰면 컬럼명으로(세로) 무엇인가를 카운트한 결과값을 출력할 수 있지만 where에 쓰게되면 무엇인가를 카운트한 결과를 가지고 필터링(가로)하는 로직만 사용할 수 있는 것이죠.
5번 질문
개념적 질문인데요, 하나의 질문에 sql statement가 사람당 셀 수도 없는 다양한 답이 나올 수가 있는건가요?
네 맞습니다. SQL뿐만 아니라 코드라는 것이 사람마다 작성하는 스타일이 어느정도 다르기 때문에 결과값은 같지만 여러가지 스타일의 쿼리가 등장할 수 있어요.
다만 SQL은 어느정도 형식이 정해져있는 편이기 때문에 어느정도 대동소이하다 라고는 말씀드릴 수 있으며, 회사별 개별팀별로 협업하는 사람들간에 가독성을 확보하기 위해 팀별로 우리는 이건 이렇게짜자~ 하는 약속과 같은 코드 컨벤션을 따로 두는 편이에요.
6번 질문
띄어쓰기를 여러번하나 한 번 하나 똑같은 값이 나오는 건가요? 띄어쓰기의 정도는 지문 쓰는 데 상관 없나요?
네 맞습니다. 띄어쓰기를 해주어야 하는 부분에서 안하면 에러가 날 수는 있지만 기본적으로 스페이스가 1번 이상인 경우에는 코드를 해석하는 파서에서 알아서 처리해주기 때문에 결과에는 영향이 없습니다.