중고 거래 게시판의 게시글 테이블 USED_GOODS_BOARD
테이블과
중고 거래 게시판 첨부파일 테이블 USED_GOODS_USER
테이블이 있다.
여기서 중고 거래 게시불을 3건 이상 올린 사용자의 정보를 조회하는 SQL 문을 작성해야 한다.
사용자 정보의 주소와 전화번호는 띄어쓰기와 -(하이픈)으로 구분자를 붙여서 출력해야 한다.
-- 코드를 입력하세요
SELECT
USER_ID,
NICKNAME,
CONCAT(CITY, " ", STREET_ADDRESS1, " ", STREET_ADDRESS2) AS '전체주소',
CONCAT(SUBSTRING(TLNO, 1, 3), '-', SUBSTRING(TLNO, 4, 4), '-', SUBSTRING(TLNO, 8)) AS '전화번호'
FROM USED_GOODS_USER
WHERE USER_ID IN (
SELECT
CASE
WHEN COUNT(WRITER_ID) >= 3 THEN WRITER_ID
END AS WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID)
ORDER BY USER_ID DESC;
WHERE 절에 서브 쿼리를 작성하여 3건 이상의 게시글을 작성한 WRITER_ID를 찾고 USED_GOODS_USER
테이블에서 해당 ID를 포함하고 있다면 유저 정보를 커스텀하여 SELECT 하도록 하였다.
SELECT
USER_ID,
NICKNAME,
CONCAT_WS(' ', CITY, STREET_ADDRESS1, STREET_ADDRESS2) AS '전체주소',
CONCAT_WS('-', SUBSTRING(TLNO, 1, 3), SUBSTRING(TLNO, 4, 4), SUBSTRING(TLNO, 8)) AS '전화번호'
FROM USED_GOODS_USER
WHERE USER_ID IN (
SELECT
CASE
WHEN COUNT(WRITER_ID) >= 3 THEN WRITER_ID
END AS WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID)
ORDER BY USER_ID DESC;
CONCAT 대신 CONCAT_WS를 사용해서 동일한 구분자를 문자열 사이에 끼어 넣도록 작성할 수도 있다.
WHERE 절의 서브 쿼리 중 Correlated Subquery라고 합니다.
Correlated Subquery는 메인 쿼리의 모든 행의 수만큼 서브 쿼리가 실행됩니다.
Correlated Subquery는 보통 메인 쿼리의 컬럼을 WHERE 절의 subquery에서 사용하는 경우를 말합니다.
예를 들면 아래와 같습니다.
SELECT e1.EMPLOYEE_ID, e1.FIRST_NAME
FROM EMPLOYEES e1
WHERE SALARY >
(SELECT AVG(SALARY)
FROM EMPLOYEES e2
WHERE e1.DEPARTMENT_ID = e2.DEPARTMENT_ID);
Correlated Subquery를 가지는 쿼리는 메인 쿼리의 결과 행 수가 많다면 성능상 문제가 될 수 있습니다.