JOIN - MySQL 풀이

송철진·2023년 3월 17일
0

프로그래머스-MySQL

목록 보기
5/7

Lv.2

조건에 맞는 도서와 저자 리스트

SELECT 
    b.BOOK_ID,	
    a.AUTHOR_NAME,	
    DATE_FORMAT(b.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK b
INNER JOIN AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID	
WHERE b.CATEGORY = '경제'
ORDER BY b.PUBLISHED_DATE

WHERE - '경제' 카테고리에 속하는 도서들의
SELECT - 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력
ORDER BY - 결과는 출판일을 기준으로 오름차순 정렬

상품 별 오프라인 매출 구하기

SELECT p.PRODUCT_CODE, (s.SUM * p.PRICE) AS SALES
FROM PRODUCT p
INNER JOIN(
    SELECT PRODUCT_ID, SUM(SALES_AMOUNT) AS SUM 
    FROM OFFLINE_SALE
    GROUP BY PRODUCT_ID
 ) s ON s.PRODUCT_ID = p.PRODUCT_ID
ORDER BY SALES DESC, p.PRODUCT_CODE

FROM, INNER JOIN - PRODUCT 테이블과 OFFLINE_SALE 테이블에서
SELECT - 상품코드 별 매출액(판매가 * 판매량) 합계를 출력
ORDER BY- 결과는 매출액을 기준으로 내림차순 정렬, 매출액이 같다면 상품코드를 기준으로 오름차순 정렬

PRODUCT_ID를 기준으로 각 PRODUCT_ID의 판매 합계를 구하고
두 테이블을 PRODUCT_ID를 기준으로 join한 뒤
합계와 가격을 곱 연산(*)하여 SALES 컬럼을 생성했다

Lv.3

오랜 기간 보호한 동물(1)

SELECT ai.NAME, ai.DATETIME
FROM ANIMAL_INS ai
LEFT JOIN ANIMAL_OUTS ao ON ai.ANIMAL_ID = ao.ANIMAL_ID 
WHERE ao.DATETIME IS NULL
ORDER BY ai.DATETIME LIMIT 3

아직 입양을 못 간 동물 중,
WHERE - 가장 오래 보호소에 있었던
LIMIT - 동물 3마리의
SELECT - 이름과 보호 시작일을 조회
ORDER BY - 이때 결과는 보호 시작일 순으로

있었는데요 없었습니다

SELECT ai.ANIMAL_ID, ai.NAME
FROM ANIMAL_INS ai
LEFT JOIN ANIMAL_OUTS ao ON ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE TIMEDIFF(ao.DATETIME, ai.DATETIME) < 0
ORDER BY ai.DATETIME

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다.
WHERE - 보호 시작일보다 입양일이 더 빠른
SELECT - 동물의 아이디와 이름을 조회
ORDER BY - 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

처음엔 DATEDIFF()로 구현했는데 틀렸다고 하더라.
같은 날짜에 보호되었다가 입양되는 경우가 있을 수 있으므로
보다 정확한 TIMEDIFF()를 써야 한다는 것을 알았다.

없어진 기록 찾기

SELECT 
    ao.ANIMAL_ID,
    ao.NAME
FROM ANIMAL_OUTS ao
LEFT JOIN ANIMAL_INS ai ON ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE ai.DATETIME IS NULL
ORDER BY ao.ANIMAL_ID

천재지변으로 인해 일부 데이터가 유실되었습니다.
WHERE - 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의
SELECT - ID와 이름을
ORDER BY - ID 순으로 조회하는 SQL문을 작성해주세요.

문제를 제대로 읽지 않고 ANIMAL_INS에 NAME이 있으면 ANIMAL_OUTS에는 없을 것이라는 고정관념 때문에 다소 시간이 걸렸다.

입양 간 기록 테이블을 기준으로 보호된 기록 테이블을 LEFT JOIN하고
보호된 기록 테이블의 보호시작일이 NULL인 조건 하에
입양 간 기록 테이블의 id와 이름을 조회하도록 구현했다.

Lv.4

보호소에서 중성화한 동물

SELECT ai.ANIMAL_ID, ai.ANIMAL_TYPE, ai.NAME
FROM ANIMAL_INS ai
INNER JOIN ANIMAL_OUTS ao ON ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE ai.SEX_UPON_INTAKE LIKE 'Intact%' 
	AND ao.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
ORDER BY ai.ANIMAL_ID;

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다.
WHERE - 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의
SELECT - 아이디와 생물 종, 이름을 조회하는
ORDER BY - 아이디 순으로 조회하는 SQL 문을 작성해주세요.

  1. 조회할 컬럼: ANIMAL_ID, ANIMAL_TYPE, NAME
  2. 외래키는 join한다: ANIMAL_ID
  3. 들어올 땐 중성화 안했다: 'Intact'로 시작할 것
  4. 나갈 땐 중성화 했다: 'Intact'로 시작하지 않을 것
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글