[프로그래머스] SQL 고득점 Kit - select (join)

박채은·2023년 6월 22일
0

코딩테스트

목록 보기
41/52

2. 조건에 부합하는 중고거래 댓글 조회하기

오랜만에 SQL을 직접 작성하다 보니까, 생각보다 2번부터 헷갈렸다.

USED_GOODS_BOARD와 USED_GOODS_REPLY을 조인해야 한다.
이때 문제에서 주된 테이블은 USED_GOODS_REPLY이다.
USED_GOODS_REPLY 테이블은 모두 존재해야 하기 때문에 USED_GOODS_REPLY이 LEFT 테이블이 되고, LEFT 조인을 한다.

최종 코드

✔️ YEAR()와 MONTH() 사용

SELECT board.TITLE, 
    board.BOARD_ID, 
    reply.REPLY_ID, 
    reply.WRITER_ID, 
    reply.CONTENTS, 
    DATE_FORMAT(reply.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE
FROM USED_GOODS_REPLY AS REPLY
LEFT JOIN USED_GOODS_BOARD AS BOARD
on board.BOARD_ID = reply.BOARD_ID
where YEAR(board.CREATED_DATE) = 2022 and MONTH(board.CREATED_DATE) = 10
order by reply.CREATED_DATE, board.TITLE;

TIP
칼럼 이름이 겹치지 않는 경우에는 굳이 별칭을 명시할 필요는 없다.

SELECT TITLE, 
    board.BOARD_ID, 
    REPLY_ID, 
    reply.WRITER_ID, 
    reply.CONTENTS, 
    DATE_FORMAT(reply.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE
FROM USED_GOODS_REPLY AS reply
LEFT JOIN USED_GOODS_BOARD AS board
on board.BOARD_ID = reply.BOARD_ID
where YEAR(board.CREATED_DATE) = 2022 and MONTH(board.CREATED_DATE) = 10
order by reply.CREATED_DATE, board.TITLE;

✔️ DATE_FORMAT() 사용

SELECT TITLE, 
    board.BOARD_ID, 
    REPLY_ID, 
    reply.WRITER_ID, 
    reply.CONTENTS, 
    DATE_FORMAT(reply.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE
FROM USED_GOODS_REPLY AS reply
LEFT JOIN USED_GOODS_BOARD AS board
on board.BOARD_ID = reply.BOARD_ID
where DATE_FORMAT(board.CREATED_DATE, '%Y-%m') = '2022-10'
order by reply.CREATED_DATE, board.TITLE;

과일로 만든 아이스크림 고르기

SELECT A.FLAVOR
from FIRST_HALF A
inner join ICECREAM_INFO B
on A.FLAVOR = B.FLAVOR
where A.TOTAL_ORDER>3000 and B.INGREDIENT_TYPE='fruit_based'
order by A.TOTAL_ORDER DESC;

JOIN

INNER JOIN (JOIN)

  • 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
SELECT 조회할 컬럼
FROM <테이블1>, <테이블2>
[WHERE 검색 조건]
SELECT 조회할 컬럼
FROM <테이블1>
    INNER JOIN <테이블2>
    ON 테이블1.컬럼 = 테이블2.컬럼
[WHERE 검색 조건]

OUTER JOIN

  • 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
    • LEFT: 왼쪽 테이블의 모든 값이 출력
    • RIGHT: 오른쪽 테이블의 모든 값이 출력
    • FULL: 모든 테이블의 값이 출력 (MySQL에서는 FULL OUTER JOIN을 지원하지 않음)
SELECT 조회할 컬럼
FROM <테이블1(LEFT 테이블)>
    <LEFT | RIGHT> OUTER JOIN <테이블2(RIGHT 테이블)>
     ON <조인 조건>
[WHERE 검색 조건]

CROSS JOIN

  • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인한다. (카티션 곱)
SELECT 조회할 컬럼
FROM <테이블1>
CROSS JOIN <테이블2>

SELF JOIN

  • 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.

[참고]
https://doh-an.tistory.com/30
https://www.w3schools.com/sql/sql_join.asp
https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

0개의 댓글