728x90
반응형

안녕하세요!

오늘은 프로그래머스 SQL 고득점 Kit 중 SELECT 분야의 '서울에 위치한 식당 목록 출력하기' 문제 리뷰를 진행하겠습니다.

 

문제는 아래 링크에서 확인해주시면 됩니다.

https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 문제 설명

 

  • 문제

 

  • 예시

728x90

  • 문제를 파악하며 쿼리 생각하기

예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야하는 부분은 식당의

  1. 식당 ID : REST_ID
  2. 식당 이름 : REST_NAME
  3. 음식 종류 : FOOD_TYPE
  4. 즐겨찾기 수 : FAVORITES
  5. 주소 : ADDRESS
  6. 리뷰 평균 점수 : AVG(REVIEW_SCORE)

총 6개인 것을 확인할 수 있습니다.

 

다음으로 JOIN 해야하는 부분은

  1. REST_INFO 와 REST_REVIEW를 REST_ID를 기준으로 동시 만족 : JOIN REST_REVIEW b ON a.REST_ID=b.REST_ID
    → a는 REST_INFO 의 별칭입니다.
    REST_INFO와 REST_REVIEW을 둘 다 만족해야 하기 때문에 내부 조인을 사용해야 합니다.
    → 내부 조인이기 때문에 REST_REVIEW에 REST_INFO를 JOIN하셔도 괜찮습니다.

위와 같은 것을 확인할 수 있습니다.

 

다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은

  1. 서울에 위치한 식당 : ADDRESS LIKE '서울%'
    → 서울에 위치한 식당의 주소는 '서울시 ~~' 혹은 '서울특별시 ~~' 로 시작하기 때문에 주소에서 서울로 시작하는 문자열을 모두 가지고 와줍니다. 

총 1개인 것을 확인할 수 있습니다.

 

마지막으로 저희가 문제에서 확인해야 하는 부분은

  1. 리뷰 평균 점수는 소수점 세 번째 자리애서 반올림 : ROUND(AVG(REVIEW_SCORE), 2)
    → ROUND(x, y)는 x를 소수점 y자리 까지 반올림해서 보여주는 함수입니다.
    → 참고로 올림은 CEILING, 내림은 FLOOR을 사용해주시면 됩니다.
  2. 평균 점수 기준 내림차순, 즐겨찾기 수 내림차순 : ORDER BY AVG(REVIEW_SCORE) DESC, FAVORITES DESC
    → ORDER BY는 SELECT에서 진행한 별칭을 사용해도 되기 때문에, AVG(REVIEW_SCORE) 대신 별칭을 사용하시면 좋습니다.
    → ORDER BY는 SELECT에 나온 것을 기준으로 순서를 정렬하기 때문에 SELECT에 있는 컬럼의 순서로 적으셔도 됩니다.

총 2개인 것을 확인할 수 있습니다.

  • 쿼리 완성하기

이제 위에서 생각한 쿼리를 SQL 실행 순서에 맞게 배치해주시면 됩니다.

그렇게 완성된 쿼리는 아래와 같습니다.

SELECT  a.REST_ID,
        REST_NAME,
        FOOD_TYPE,
        FAVORITES,
        ADDRESS,
        ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM    REST_INFO a
JOIN   REST_REVIEW b ON a.REST_ID=b.REST_ID
WHERE   ADDRESS LIKE '서울%'
GROUP BY 1, 2, 3, 4, 5
ORDER BY 6 DESC, 4 DESC

 

궁금한 부분이 있으신 분들은 댓글로 남겨주시면, 답변 드리도록 하겠습니다.

★읽어주셔서 감사합니다★

728x90
반응형
728x90
반응형

안녕하세요!

오늘은 프로그래머스 SQL 고득점 Kit 중 JOIN 분야의 '있었는데요 없었습니다' 문제 리뷰를 진행하겠습니다.

 

문제는 아래 링크에서 확인해주시면 됩니다.

https://school.programmers.co.kr/learn/courses/30/lessons/59043

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 문제 설명

 

  • 문제

 

  • 예시

 

  • 문제를 파악하여 쿼리 생각하기

예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야하는 부분은 동물의

  1. ID: A.ANIMAL_ID
  2. 이름: A.NAME
    → A는 ANIMAL_INS 테이블, B는 ANIMAL_OUTS 테이블을 의미합니다.
    → ID와 이름은 각 테이블에서 같이 포함되어 있기 때문에 어느 테이블에 존재하는지 꼭 명시를 해야합니다.
    → 여기서는 A, B 어느 테이블에 있는 값을 가지고 와도 동일한 값을 SELECT 합니다.

총 2개인 것을 확인할 수 있습니다.

 

다음으로 두 개의 테이블을 JOIN 해야하는 부분은

  1. ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 동시에 만족: JOIN ANIMAL_OUTS B
    → 두 테이블을 동시에 만족해야 하기 때문에 내부 조인을 사용하는데, JOIN 혹은 INNER JOIN 으로 표기하시면 됩니다.
    → ANIMAL_OUTS을 FROM에 두고, ANIMAL_INS 테이블로 JOIN을 해도 상관 없습니다.
  2. 두 테이블에서 값이 동일한 컬럼이 기준: ON A.ANIMAL_ID=B.ANIMAL_ID
    → 두 테이블에서 동일한 값이 여러 개 있으나, 문제에서 ANIMAL_OUTS의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키라고 하였기 때문에 ANIMAL_ID로 JOIN하는 것이 좋습니다.
    → NAME, ANIMAL_TYPE 과 같은 값으로 JOIN을 할 경우, 테이블 내에 중복 값으로 인해 원하는 대로 JOIN이 되지 않을 가능성이 높습니다.

위와 같은 것을 확인할 수 있습니다.

 

다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은

  1. 보호 시작일보다 입양일이 더 빠른 동물: A.DATETIME > B.DATETIME

총 1개인 것을 확인할 수 있습니다.

 

마지막으로 저희가 문제에서 확인해야 하는 부분은

  1. 결과는 보호 시작일이 빠른 순으로 조회: ORDER BY A.DATETIME

총 1개인 것을 확인할 수 있습니다.

 

 

  • 쿼리 완성하기

이제 위에서 생각한 쿼리를 SQL 실행순서에 맞게 배치해주시면 됩니다.

그렇게 완성된 쿼리는 아래와 같습니다.

SELECT 
    A.ANIMAL_ID, A.NAME
FROM 
    ANIMAL_INS A
JOIN 
    ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE 
    A.DATETIME > B.DATETIME
ORDER BY 
    A.DATETIME

 

궁금한 부분이 있으신 분들은 댓글로 남겨주시면, 답변 드리도록 하겠습니다.

★읽어주셔서 감사합니다★

728x90
반응형

+ Recent posts