취업준비/코딩테스트 문제 풀이

[프로그래머스 SQL 코딩테스트 연습] Lv3. 조건에 맞는 사용자 정보 조회하기 (MySQL)

상급닌자연습생 2024. 7. 31. 23:51

🤔 문제

다음은 중고 거래 게시판 정보를 담은 `USED_GOODS_BOARD` 테이블과 중고 거래 게시판 첨부파일 정보를 담은 `USED_GOODS_USER` 테이블입니다. `USED_GOODS_BOARD` 테이블은 다음과 같으며 `BOARD_ID`, `WRITER_ID`, `TITLE`, `CONTENTS`, `PRICE`, `CREATED_DATE`, `STATUS`, `VIEWS`는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

 

`USED_GOODS_USER` 테이블은 다음과 같으며 `USER_ID`, `NICKNAME`, `CITY`, `STREET_ADDRESS1`, `STREET_ADDRESS2`, `TLNO`는 각각 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호를 의미합니다.

 

`USED_GOODS_BOARD`와 `USED_GOODS_USER` 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 `xxx-xxxx-xxxx` 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

 

 

예시

`USED_GOODS_BOARD` 테이블이 다음과 같고

 

`USED_GOODS_USER` 테이블이 다음과 같을 때

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

 

 

 

 

 


💻 나의 풀이

SELECT
    u.USER_ID,
    u.NICKNAME,
    CONCAT(u.CITY, ' ', u.STREET_ADDRESS1, ' ', u.STREET_ADDRESS2) AS 전체주소,
    CONCAT(LEFT(u.TLNO, 3), '-', SUBSTRING(u.TLNO, 4, 4), '-', RIGHT(u.TLNO, 4)) AS 전화번호
FROM USED_GOODS_BOARD b
JOIN USED_GOODS_USER u ON b.WRITER_ID=u.USER_ID
GROUP BY b.WRITER_ID
HAVING COUNT(b.BOARD_ID) >= 3
ORDER BY 1 DESC;

 

 

 

 

 

 

 

결과

 

 

 

 

 

 

 

 


✅ 핵심 정리

이번 문제는 문제 자체가 어렵다기 보다는 문자열 관련 함수를 얼마나 알고있고, 이를 자유자재로 활용할 수 있는가가 관건이었던 것 같다.

정답 풀이의 핵심이 되었던 문자열을 합치는 `CONCAT()` 함수와 문자열을 슬라이싱하는 `SUBSTRING()`, `LEFT()`, `RIGHT()`, `MID()` 함수에 대해서 정리해보고자 한다.

 

 

문자열 합치기 : CONCAT

CONCAT(값1, 값2, ..., 값n)

값1 부터 값n을 공백 없이 그대로 합쳐준다.

 

 

 

문자열 슬라이싱 : SUBSTRING(MID, SUBSTR), LEFT, RIGHT

1. SUBSTRING (=MID, SUBSTR)

SUBSTRING(문자열, 시작인덱스, 자를길이) -- 인덱스는 맨 처음부터 1

-- 다음 함수도 SUBSTRING과 동의어이다.
MID(문자열, 시작인덱스, 자를길이)
SUBSTR(문자열, 시작인덱스, 자를길이)

대상이되는 `문자열`에 대해서 `시작인덱스`부터 `자를길이`만큼 슬라이싱하여 반환한다.

 

2. LEFT

LEFT(문자열, 자를길이)

대상이되는 `문자열`에 대해서 가장 왼쪽부터 `자를길이`만큼 슬라이싱하여 반환한다.

 

3. RIGHT

RIGHT(문자열, 자를길이)

대상이되는 `문자열`에 대해서 가장 오른쪽부터 `자를길이`만큼 슬라이싱하여 반환한다.