[SQL] 조건에 맞는 사용자 정보 조회하기(STRING)❌

Jaewon Lim·2024년 12월 19일

📝 문제 설명

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

Column NameTypeNullable
BOARD_IDVARCHAR(5)FALSE
WRITER_IDVARCHAR(50)FALSE
TITLEVARCHAR(100)FALSE
CONTENTSVARCHAR(1000)FALSE
PRICENUMBERFALSE
CREATED_DATEDATEFALSE
STATUSVARCHAR(10)FALSE
VIEWSNUMBERFALSE

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

Column NameTypeNullable
USER_IDVARCHAR(50)FALSE
NICKANMEVARCHAR(100)FALSE
CITYVARCHAR(100)FALSE
STREET_ADDRESS1VARCHAR(100)FALSE
STREET_ADDRESS2VARCHAR(100)TRUE
TLNOVARCHAR(20)FALSE

❓ 문제

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

📖 예시

USED_GOODS_BOARD 테이블이 다음과 같고

BOARD_IDWRITER_IDTITLECONTENTSPRICECREATED_DATESTATUSVIEWS
B0001dhfkzmf09칼라거펠트 코트양모 70%이상 코트입니다.1200002022-10-14DONE104
B0002lee871201국내산 볶음참깨직접 농사지은 참깨입니다.30002022-10-02DONE121
B0003dhfkzmf09나이키 숏패팅사이즈는 M입니다.400002022-10-17DONE98
B0004kwag98반려견 배변패드 팝니다정말 저렴히 판매합니다. 전부 미개봉 새상품입니다.120002022-10-01DONE250
B0005dhfkzmf09PS4PS5 구매로인해 팝니다.2500002022-11-03DONE111

USED_GOODS_USER 테이블이 다음과 같을 때

USER_IDNICKNAMECITYSTREET_ADDRESS1STREET_ADDRESS2TLNO
dhfkzmf09찐찐성남시분당구 수내로 13A동 1107호01053422914
dlPcks90썹썹성남시분당구 수내로 74401호01034573944
cjfwls91점심만금식성남시분당구 내정로 185501호01036344964
dlfghks94희망성남시분당구 내정로 101203동 102호01032634154
rkdhs95용기성남시분당구 수내로 23501호01074564564

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

USER_IDNICKNAME전체주소전화번호
dhfkzmf09찐찐성남시 분당구 수내로 13 A동 1107호010-5342-2914

💻 코드

내코드

SELECT B.WRITER_ID, U.NICKNAME, 
       CONCAT(U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2)as 전체주소
FROM USED_GOODS_BOARD B LEFT OUTER JOIN USED_GOODS_USER U
ON  B.WRITER_ID = U.USER_ID
WHERE COUNT(B.WRITER_ID) >= 3
GROUP BY B.WRITER_ID
ORDER BY B.WRITER_ID DESC

정답코드

SELECT 
    B.WRITER_ID, 
    U.NICKNAME, 
    CONCAT(U.CITY, ' ', U.STREET_ADDRESS1, ' ', COALESCE(U.STREET_ADDRESS2, '')) AS 전체주소,
  --CONCAT(U.CITY, ' ', U.STREET_ADDRESS1, ' ', U.STREET_ADDRESS2) AS 전체주소,
    INSERT(INSERT(U.TLNO, 8, 0, '-'), 4, 0, '-') AS 전화번호
FROM 
    USED_GOODS_BOARD B 
LEFT OUTER JOIN 
    USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
GROUP BY 
    B.WRITER_ID, U.NICKNAME, U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2, U.TLNO
HAVING 
    COUNT(B.WRITER_ID) >= 3
ORDER BY 
    B.WRITER_ID DESC;

🔍 분석

  1. COALESCE 함수 사용법
  • 병합한다는 의미의 COALESCE. 조건에 따라 두 컬럼을 합치는 기능. 이런 기능을 활용해서 NULL 값을 특정 값으로 변환하는데 사용한다.
  • 인자로 주어진 컬럼들 중에서 NULL이 아닌 첫 번째 값을 반환하는 함수. A,B라는 컬럼을 인자로 COALESCE 함수로 주게 되면 A 컬럼 값이 NULL 값이 아닌 경우 A 값을 리턴하고 A가 NULL 이고 B가 NULL이 아닌 경우 B 값 리턴
SELECT A, B, COALESCE(A,B) FROM TABLE; 
ABCOALESCE(A, B)
1NULL1
NULL22
NULLNULLNULL

이러한 COALESCE 함수의 기능을 활용하면 특정열의 NULL 값을 적절한 값으로 치환할 때 사용하기 용이하다. 만약 아래와 같이 사용하면 A 열에 값이 NULL이 아닌 경우 A의 열 값 리턴, NULL인 경우에는 0 값을 리턴하므로 해당 열의 NULL을 0으로 변환해서 처리할 수 있다.

SELECT A, COALESCE(A,0) FROM TABLE;
ACOALESCE(A , 0)
22
NULL0
55
  1. CONCAT 쓸 때, 띄어쓰기('') 주의하기!!!!
  1. INSERT INTO 문
    데이터를 입력하기 위함
INSERT INTO [테이블명] (칼럼1, 칼럼2, 칼럼3)
VALUE (1,2,3)
  1. WHERE절에서 COUNT사용 금지!!!
WHERE COUNT(B.WRITER_ID) >= 3
GROUP BY 
    B.WRITER_ID
ORDER BY 
    B.WRITER_ID DESC;
GROUP BY 
    B.WRITER_ID, U.NICKNAME, U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2, U.TLNO
HAVING 
    COUNT(B.WRITER_ID) >= 3
ORDER BY 
    B.WRITER_ID DESC;
  • 집계함수는 WHERE 절에서 사용 불가능. WHERE 절은 각 행에 대해 조건을 평가할 때 사용되며, 집계함수는 그룹화된 결과에 대한 조건을 지정할 때 HAVING 절을 통해 사용한다.
  1. GROUP BY 절에서는 SELECT 절에 명시된 모든 비집계 컬럼을 포함한다.
GROUP BY 
    B.WRITER_ID, U.NICKNAME, U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2, U.TLNO
  • SELECT 문에서 집계함수를 사용하지 않고 컬럼을 직접 참조하는 경우, 해당 컬럼의 값들은 여러 다른 값을 가질 수 있다. GROUP BY에 포함되지 않은 컬럼은 그룹화 과정에서 어떤 값이 선택되어야 할지 명확하지 않기 때문에 각 그룹별로 유일한 값이 정해져야 할 때 그 컬럼을 GROUP BY절에 포함시켜야한다.

0개의 댓글