관리 메뉴

JIE0025

[MySQL][Lv.3] 조건에 맞는 사용자 정보 조회하기 본문

알고리즘/프로그래머스

[MySQL][Lv.3] 조건에 맞는 사용자 정보 조회하기

Kangjieun11 2023. 11. 4. 01:42
728x90

 

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

 

프로그래머스

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

programmers.co.kr

 

 

✅ 문제

 

 

📝 요구사항 정리

1) 3개 이상의 게시글을 작성한, 유저의 id, 닉네임, 전체주소, 전화번호를 출력

2) 전화번호는 - 를 중간에 추가

3) 유저 아이디 내림차순 정렬

 


✅ 풀이과정

 

1️⃣ CONCAT 을 이용한 문자열 합치기

전체 주소를 출력 형태로 만들어줄 때 CONCAT을 사용해 쉽게 문자열을 합칠 수 있다.

CONCAT(합칠문자열1, 문자열2, ....)

 

 

✍️ 전체주소를 만들때, 시티 이름부터 STREET_ADDRESS2까지, 띄어쓰기 추가하면서 합쳐주면 된다.

CONCAT(U.CITY, " ", U.STREET_ADDRESS1, " ", U.STREET_ADDRESS2) AS '전체주소'

 

 

2️⃣ SUBSTRING 을 이용해, 문자열 자르기

SUBSTRING(자를 문자열, 시작문자순서,몇개문자)

 

 

✍️ 전화번호 사이사이에 -를 추가해야하므로 CONCAT과 함께 사용했다.

CONCAT(SUBSTRING(U.TLNO, 1,3), "-", SUBSTRING(U.TLNO, 4,4) ,"-", SUBSTRING(U.TLNO, 8)) AS '전화번호'

 

 

💪 어떤 블로그를 참고했는데   LEFT / MID / RIGHT를 사용할 수도 있다.

LEFT(문자열, 왼쪽부터 시작해서 몇개 가져올건지)
MID(문자열, 시작위치, 가져올개수)
RIGHT(문자열, 오른쪽부터 시작해서 몇개 가져올건지)

 

LEFT, MID, RIGHT를 사용하면 아래와 같아진다.

CONCAT(LEFT(U.TLNO,3), '-', MID(U.TLNO,4,4),'-', RIGHT(U.TLNO,4)) AS 전화번호

 

 

3️⃣ HAVING과 WHERE절의 차이

 

HAVING, WHERE절 모두 쿼리문에서 조건 지정시 사용하지만

사용시점/ 목적에 분명한 차이가 있다.

 

 

 

✍️  MYSQL 쿼리의 처리 순서부터 다시 기억해보자.

 

FROM : 데이터의 출처테이블을 지정한다.

JOIN : 테이블이 여러개인 경우 먼저 연결한다 (ON으로 조인 조건 사용)

WHERE : 지정된 조건에 맞게 필터링한다.  >> 집계되기 전 개별 레코드에 대한 필터링이다.

GROUP BY : 그룹화를 해준다.

HAVING : 그룹화된 데이터들에 추가적인 필터 처리를 한다. 집계함수를 포함해 필터링이 가능하다 (WHERE에선 불가능)

SELECT : 선택된 필드를 가져온다. 별칭을 만들 수 있다.

ORDER BY : 결과를 정렬한다. 지정된 별칭을 사용할 수 있다.

LIMIT : 결과 개수를 제한한다.

 

 

 

✔️ WHERE

: 데이터를 그룹화 하기전에 행을 필터링

 

Ex) 편의점에 파는 물건들 중 카테고리가 <다이어트> 인 상품을 보여줘    

 

* 모든 상품 중 카테고리가 다이어트인 상품을 선별함   >>   WHERE category = "다이어트"

 

 

 

✔️ HAVING

: 데이터를 그룹화 한 후에 그룹을 필터링 > 그룹화된 결과에 대한 조건을 만든다.

 

Ex) 카테고리별로 재고가 5개 이상 남은 상품을 보여줘 

 

* 카테고리에 대한 그룹화를 하고      GROUP BY category

* 재고가 5개 이상 남아있는지 체크   HAVING  count(*) >= 5

 

 


 

✅ 정답

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

 

 

중고거래 게시물의 작성자를 기준으로 그룹화하고,  (GROUP BY)

COUNT를 이용해 B.WRITER가 3개 이상인 경우로 필터링 해줬다. (HAVING)

 

 

WHERE 절을 이용해서 SUBQUERY로 3개 이상의 글을 작성한 사람을 가져오는 방법도 있지만

오늘은 HAVING과 WHERE의 차이를 복습했으므로 HAVING을 사용하며 마무리!!!