SQL

[SQL] 조건에 맞는 정보 조회( JOIN, SUBQUERY(FROM, WHERE), WITH)

ollive 2024. 7. 4. 11:29

<문제: 조건에 맞는 사용자 정보조회하기>

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

 

 

프로그래머스

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

programmers.co.kr

 

 

<풀이 JOIN>

두 테이블을 합친 후, 필요한 COLUMN과 조건을 붙여서 추출하기

SELECT USER_ID, NICKNAME, CONCAT(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) AS '전체주소', 
       CONCAT(SUBSTR(TLNO,1,3),'-', SUBSTR(TLNO,4,4),"-", SUBSTR(TLNO,8,4)) As '전화번호'
FROM USED_GOODS_BOARD B JOIN USED_GOODS_USER U ON B.WRITER_ID=U.USER_ID
group by user_id
having count(user_id) >= 3
ORDER BY USER_ID desc

<풀이 INLINE SUBQUERY, JOIN>

조건(게시물 3건 이상의 사용자)을 만족하는 사용자를 추출해 서브쿼리를 만들고, 이와 관련된 값만 SELECT 절에 넣어 추출하기

SELECT USER_ID, NICKNAME, CONCAT(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) AS '전체주소', 
       CONCAT(SUBSTR(TLNO,1,3),'-', SUBSTR(TLNO,4,4),"-", SUBSTR(TLNO,8,4)) As '전화번호'
FROM (select WRITER_ID from USED_GOODS_BOARD 
      GROUP BY WRITER_ID HAVING COUNT(*)>=3) A
     JOIN USED_GOODS_USER U ON A.WRITER_ID=U.USER_ID
ORDER BY USER_ID desc

<풀이 NESTED SUBQUERY>

FROM에서 서브쿼리를 이용하는 것이 아닌, WHERE에서 서브쿼리를 IN으로 다뤄서 3개 이상의 게시글을 작성한 사용자의 정보를 불러왔다.

SELECT USER_ID, NICKNAME, 
       CONCAT(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) '전체주소', 
       CONCAT(SUBSTRING(TLNO,1,3),'-',SUBSTRING(TLNO,4,4),'-',SUBSTRING(TLNO,8,4)) '전화번호'
FROM USED_GOODS_USER
WHERE USER_ID IN (SELECT WRITER_ID FROM USED_GOODS_BOARD GROUP BY 1 HAVING COUNT(*) >= 3)
ORDER BY USER_ID DESC

<풀이 WITH 서브쿼리별명 AS (서브쿼리내용), 서브쿼리2별명 AS (서브쿼리내용)...>

WITH은 SUBQUERY에 이름을 붙여주어 가독성을 높이고 재사용할 수 있도록 도와준다. 먼저 생성된 서브쿼리는 나중에 생성하는 서브쿼리에 사용가능하고, ','를 사용해 여러개를 정의할 수 있다.

아래 풀이에서 WITH으로 먼저 조건을 지정해주고 이후 본 식의 WHERE의 중첩쿼리를 이용하여 조건을 넣어주었다.

WITH UP3 AS(SELECT WRITER_ID FROM USED_GOODS_BOARD GROUP BY 1 HAVING COUNT(*) >= 3)

SELECT USER_Id, NICKNAME, 
    CONCAT_WS(' ',CITY,STREET_ADDRESS1, STREET_ADDRESS2) AS 전체주소,
    CONCAT(SUBSTRING(TLNO,1,3),'-',SUBSTRING(TLNO,4,4),'-',SUBSTRING(TLNO,8,4)) AS 전화번호
FROM USED_GOODS_USER 
WHERE USER_ID IN (SELECT WRITER_ID FROM UP3)
ORDER BY USER_Id DESC

WITH절 사용에 대한 내용은 아래 블로그에 잘 정리되어있다.

 

[SQL] WITH절 사용하는 방법

이 버전에서는 TOC를 지원하지 않습니다. (ex. 모바일) SQL문을 작성하다 보면 같은 Query구문을 반복해서 작성하는 경우가 발생합니다. 이런 경우 보통 1~2번의 반복은 개발자 입장에서 작성하지만,

royzero.tistory.com