• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

HAVING, WHERE, ORDER BY 질문

21.08.13 22:09 작성 조회수 86

1

안녕하세요!

강의 맨 마지막 문제 Symmetric Pairs 를 풀다가 질문이 있어 글 남깁니다!

질문1. WHERE 및 HAVING에 관한 질문

SELECT *

FROM Functions

WHERE X = Y

GROUP BY X, Y 

HAVING COUNT(*) = 2

-- 이 부분에서, COUNT(*)=2에 대한 조건을 HAVING이 아닌, WHERE  절에 붙이면 안되는 이유가 있을까요?

예를 들어, 아래와 같이

SELECT *

FROM Functions

WHERE X = Y AND COUNT(*) = 2

GROUP BY X, Y 

질문2. UNION 함수에서의 ORDER BY 질문

Symmetric pairs 문제의 UNION 함수 아랫 부분에서, ORDER BY의 경우 아래 부분에만 해당 되는 것이 아니라 두개의 쿼리 모두에 적용된다고 말씀 주셨었는데, 

그래서 ORDER BY 끝에 F1.X로 작성했을 때는 쿼리가 작동하지 않는건가요?

즉, UNION함수를 사용할 경우에는 반드시 맨 끝의 order by의 경우 join 함수와 상관 없이 union 해 준 두개 쿼리 모두를 아우르는 것으로만 정렬을 할 수 있는 건지 궁금합니다.

UNION

SELECT F1.X, F1.Y

FROM Functions AS F1

     LEFT JOIN Functions AS F2 ON F1.X = F2.Y AND F1.Y = F2.X

WHERE F1.X < F2.X

ORDER BY X

제가 질문을 잘 알아들을 수 있게 작성한 것인지 모르겠지만.. 확인 부탁드립니다.

CRM 직무로 그간 일을 해왔었는데, 이전의 회사는 SQL사용이 필요 없어 전혀 해본적이 없다가

이번에 이직하게 된 회사에서는 SQL이 필요하다 하여 대리급의 직급에 이제와서 뒤늦게 SQL을 배워야 하게 되었는데요.

실제 회사에서 얼마나 잘 적용해서 일 할수 있을진 모르겠지만 그래도 이직 전에 이 강의를 듣고 부담감을 좀 덜 수 있게 되었습니다.

설명도 너무 잘해주셔서 이해도 잘 되고, 강의도 너무 길지 않아서 시간 쪼개서 듣기 좋습니다.

고생 많으세요! 시간 되실 때 답변 주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

0

안녕하세요 남다빈님, 우선 이직 축하드립니다.
꼼꼼하게 질문 주신 것을 보니 충분히 적응 잘 하시고 역량 발휘 잘 하실 것 같네요.
기획팀에 너무나 힘이 나는 내용 덧붙여주셔서 정말 감사해요 :)

그럼 질문주신 두가지 내용에 대해 답변드리겠습니다.

질문1. WHERE 및 HAVING에 관한 질문

문의 주신 쿼리를 돌려보셨으면 아셨겠지만 말씀해주신 방법처럼 조건절에 집계함수를 사용하는 것은 문법적으로 맞지 않는 방법입니다. 질문주신 쿼리에서는 X, Y라는 값으로 묶인 그룹에 대해 각 그룹에 해당하는 갯수가 2개가 되는 경우만 반환하라는 조건을 주고 있습니다.

집계함수를 통해 숫자를 세기 위해서는 어떤 그룹에 해당하는 값들을 셀 것인지 반드시 명시해줘야 하는데요(전체 값을 셀때는 예외). 그래서 갯수를 센 후 그 값이 특정 숫자보다 큰지 작은지를 알고 싶을 경우에는 GROUP BY 를 사용하여 어느 그룹에 대해 COUNT를 할지 먼저 선언한 후 HAVING을 통해 집계값에 대한 조건을 주어야 합니다.

WHERE는 그룹을 만든 후 숫자를 세는 것이 아니라 아무런 조작을 가하지 않은 원본 데이터에 대해 조건을 걸어주는 것이기 때문에 말씀해주신 집계 함수들을 사용할 수는 없다는 것을 한번 더 생각해보시면 좋을 것 같습니다.

질문2. UNION 함수에서의 ORDER BY 질문

결론적으로 말씀드리면 UNION 한 후에도 ORDER BY를 할 수 있고, UNION하기 전에도 ORDER BY 를 할 수 있습니다. 단순하게 쓰임이 다른 것으로 생각해주시면 됩니다.

UNION은 단순히 같은 형식의 데이터를 위아래로 붙이는 것인데요. 엑셀을 생각해보시면 이해가 빠르실 것 같네요. 똑같은 형식으로 작성된 두개의 시트를 한개로 합치는 과정에서 정렬을 할텐데, 두 테이블을 합치기 전에 각각의 시트에서 정렬을 진행한 후 데이터를 합칠 것인지, 두개의 시트를 합쳐 놓은 후에 정렬을 할 것인지 선택할 수 있겠죠.

그 과정에서 JOIN과 ORDER BY는 딱히 관련이 없습니다.

제가 질문의 의도를 제대로 파악한 것이 맞으면 좋겠네요. 혹시나 추가 질문이 있으시면 남겨주세요!