• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    해결됨

여러가지 풀이를 보며 생긴 궁금증

20.08.21 13:13 작성 조회수 133

2

안녕하세요! 오늘도 즐겁게 공부하고 있습니다 :)

196Delete Duplicate Emails  의 풀이들을 이해하려고 노력하던 중 생긴 질문입니다.

풀이 자체에 관한 질문이라기 보다는, 코딩 방식(?)에 대해 생긴 궁금증이라 이곳에 질문해도 될지 모르겠습니다..!

1번 풀이

DELETE
FROM person
WHERE id NOT IN (SELECT p2.min
                 FROM (
                        SELECT email, MIN(id) AS min
                        FROM person
                        GROUP BY email
                        ) p2 )

2번 풀이

DELETE p1
FROM person AS p1
          INNER JOIN person AS p2 ON p1.email = p2.email
          WHERE p1.id > p2.id

1번 풀이는 비교적 복잡하고 길지만 읽으면 바로 이해가 되었는데,

2번 풀이는 간결하고 예쁘지만 지금도 이해하려고 노력하고 있습니다.

그리고 사실 2번과 같은 풀이를 곧바로 이해만 한다면 '이렇게도 풀 수 있구나!'라고 감탄하지만,

반대로 이해가 안 되면 '자기만 알아보게 만들면 무슨 소용이야!' 혹은 '내가 아직 부족하구나'라고 느낍니다.

학습자 입장에서 다른 풀이를 이해하는 것이 실력 향상에 도움이 된다는 점은 매일 느끼고 있어 계속 도전하고 있지만,

과연 간결하고 예쁜 코드가 '좋은 코드'인가에 대한 의문이 듭니다!! (파이썬의 철학이 아름다운 최선의 코드라고 들었는데..)

특히 현업에서는 답을 내기만 하면 되는 것이 아닐 것 같습니다.

1번과 2번은 스타일의 차이인지, 실력의 차이인지, 속도 같은 기능의 차이인지... 어떤 차이가 있는지 궁금합니다.

그런데 써놓고 보니 최선의 코드를 만들고 동료들의 이해를 위해 주석을 다는 방법도 있겠네요..

그렇다면 역시 답은 실력을 갈고 닦자고 자문자답을 하게 되는 것 같지만...

여전히 의문은 1번 같은 코드와 2번 같은 코드의 차이란 무엇인가 입니다!

강의와 직접적인 연관이 있는 것은 아니지만,

강의를 들으며 계속해서 여러 풀이를 시도하면서 드는 의문이기에 조심스레 질문을 남깁니다.

답변 2

·

답변을 작성해보세요.

2

김해인님의 프로필

김해인

질문자

2020.08.23

친절하고 자세한 답변 감사드립니다!

쿼리를 작성할 때 고려할 사항들의 하나하나가 다 중요해보입니다. 현업에서는 역시 혼자 일하는 것이 아니니 주어진 상황을 잘 파악하고 동료들과도 잘 맞추어 갈 수 있도록 해야겠네요. 

앞으로 생각지 못한 쿼리를 만나면 좋은 고민거리가 생긴 것으로 여길 수 있을 것 같습니다!!

저만의 좋은 코드.. 많이 써보고 많이 읽어보면서 찾아나가보겠습니다 :) !! 다시 한 번 답변 감사드립니다!

2

  안녕하세요 해인님, 답변드립니다.

  우선 1번과 2번 코드의 차이는 스타일의 차이일 것 같습니다. 같은 문제에 대해서도 여러 접근 방식이 있기 때문입니다. '좋은 코드'에 대해서는 정답이 없기 때문에 저의 견해를 말씀 드릴텐데, 절대적인 답은 아니라는 점 참고해주시면 좋겠습니다.

  적어주신 대로 현업에서는 답을 내기만 하면 되는 것이 아닙니다. 한 번 작성된 쿼리가 반복적으로 사용되기도 하고, 내가 작성한 쿼리를 다른 사람이 보고 참고하거나 수정하는 경우도 있기 때문입니다. 그렇기 때문에 쿼리를 작성할 때는 쿼리의 성능, 문제 접근 방식, 가독성 등을 고려하게 됩니다.

1. 쿼리의 성능 ( '더 빨리 실행할 수는 없을까?')
  쿼리의 반복 사용을 생각한다면 가장 중요한 부분일 것입니다. 필요한 데이터만 스캔할 수 있도록, 실행시간이 덜 걸리도록 쿼리를 작성하는 것이 중요합니다. 이를 위해서는, 한 쿼리 내에서 반복되는 코드는 없는 지, 있다면 서브쿼리를 사용하는 등의 방법으로 반복을 피할 수 있을 지 항상 고민하는 편입니다.

2. 문제 접근 방식 ('이 방법이 가장 효율적일까?' )
  사실 이 부분은 성능과도 관련이 있습니다. 해커랭크나 리트코드 등의 문제를 풀 때는 주어진 테이블을 모두 사용해야 하지만, 현업에서는 사내 DB에 대한 이해가 중요하며, 어떤 상황에서 어떤 테이블을 사용하는 것이 더 효과적인지 파악하고 있는 것이 중요합니다.

3. 가독성 ('잘 알아볼 수 있을까?')
  질문 내용 중 가장 큰 부분이 이 가독성에 대한 부분인 것 같습니다. 가독성을 위해서는 쿼리 자체를 이해하기 쉽게 짜는 것도 방법일 테고, 주석을 사용하는 것도 하나의 방법일 수 있을 것 같습니다. 코드 한 줄 한 줄에 주석을 달기도 하고, 서브쿼리에 대한 설명을 주석으로 달아 놓기도 합니다.

  이 세가지를 고려해서 쿼리를 작성하면 간결하고 예쁜 코드가 될 수도 있을 것 같네요. 하지만 각자의 쿼리 작성 방식, 선호가 다르기 때문에 '간결하고 예쁜 코드가 '좋은 코드'인가'에 대한 답을 드리기는 어렵습니다. 다만, 작성된 쿼리를 보고 지금처럼 '이게 좋은 쿼리일까?'하는 고민을 해보시는 것은 실력향상에 많은 도움이 됩니다. 내가 생각하지 못한 방식으로 작성된 쿼리를 보고 도움을 받을 수도 있고, 오히려 '이렇게 작성하면 더 효율적일텐데.' 하는 생각을 하게 할 수도 있겠지요. 쿼리를 작성하는 방식에는 정답이 없기 때문에, 쿼리를 많이 작성해보시면서 해인님만의 좋은 코드를 고민하고 만들어가시면 현업을 하실 때도 많은 도움이 될 것 같습니다.

  저도 답변을 드리며 다시 생각해 볼 수 있는 기회가 되었네요. 해인님께도 답변이 도움이 되었길 바랍니다.
좋은 질문 남겨주셔서 감사드리며, 추가 질문 있으시면 언제든 남겨주세요 :)