[프로그래머스] SQL 정리 - JOIN

유은선·2023년 5월 22일
0

Programmers_SQL

목록 보기
4/6
post-thumbnail

JOIN

2개의 테이블에 대해 연관된 튜플을 결합해 하나의 새로운 릴레이션을 반환

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

JOIN을 이용해서 테이블을 연결해준다. 이때 ON을 사용해주는 것을 잊지말기!

SELECT A.FLAVOR 
FROM FIRST_HALF AS A 
JOIN ICECREAM_INFO AS B
ON A.FLAVOR = B.FLAVOR
WHERE B.INGREDIENT_TYPE="fruit_based" AND A.TOTAL_ORDER>3000
ORDER BY A.TOTAL_ORDER DESC;

📚 조건에 맞는 도서와 저자 리스트 출력하기

JOIN ~ ON을 이용해서 두 테이블을 조인해주고, ON에 조건을 넣어 출력

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

🍧 성분으로 구분한 아이스크림 총 주문량

SELECT B.INGREDIENT_TYPE, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF AS A
JOIN ICECREAM_INFO AS B
ON A.FLAVOR = B.FLAVOR
GROUP BY INGREDIENT_TYPE
ORDER BY SUM(A.TOTAL_ORDER);

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

SELECT A.TITLE, B.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS, 
DATE_FORMAT(B.CREATED_DATE,"%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD AS A 
JOIN USED_GOODS_REPLY AS B
ON A.BOARD_ID = B.BOARD_ID
WHERE DATE_FORMAT(A.CREATED_DATE,"%Y-%m")='2022-10'
ORDER BY B.CREATED_DATE, A.TITLE;

📑 없어진 기록 찾기

왼쪽에 ANIMAL_OUTS 를 두고 LEFT JOIN 을 사용하여, ANIMAL_INS 의 키가 NULL 인 데이터를 찾으면, ANIMAL_OUTS 에만 존재하는 데이터를 찾을 수 있다.

  • LEFT JOIN
    LEFT JOIN은 OUTER JOIN의 일종이다. 따라서 합집합을 의미하며, 왼쪽의 모든 행을 조회하며 오른쪽 행이 대응하지 않으면 null을 반환
SELECT B.ANIMAL_ID, B.NAME 
FROM ANIMAL_OUTS AS B
LEFT JOIN ANIMAL_INS AS A
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
ORDER BY B.ANIMAL_ID;

🐰 있었는데요 없었습니다

보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS AS A 
JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME 
ORDER BY A.DATETIME;

📚 카테고리 별 도서 판매량 집계하기

JOINGROUP BY를 모두 사용하는 문제

SELECT A.CATEGORY, SUM(B.SALES) AS TOTAL_SALES
FROM BOOK AS A
JOIN BOOK_SALES AS B
ON A.BOOK_ID = B.BOOK_ID
WHERE DATE_FORMAT(B.SALES_DATE,"%Y-%m") = '2022-01'
GROUP BY A.CATEGORY
ORDER BY A.CATEGORY

🥛 우유와 요거트가 담긴 장바구니

  1. JOIN을 이용한 풀이
SELECT A.CART_ID
FROM CART_PRODUCTS AS A
JOIN CART_PRODUCTS AS B
ON A.CART_ID = B.CART_ID
WHERE A.NAME LIKE 'Yogurt' AND B.NAME LIKE 'Milk'
ORDER BY A.CART_ID

2.GROUP BY를 이용한 풀이
CART_ID를 기준으로 그룹화 하고, Yogurt가 카트에 두개 이상 들어갈 수 있기 때문에 DISTINCT을 사용해줘야만 한다

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk','Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME)=2

🥨 5월 식품들의 총매출 조회하기

SUM함수를 이용해 총 매출 금액을 구해주면 된다.

SELECT A.PRODUCT_ID, A.PRODUCT_NAME,
SUM(A.PRICE*B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT AS A
JOIN FOOD_ORDER AS B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE DATE_FORMAT(PRODUCE_DATE,'%Y-%m')='2022-05'
GROUP BY A.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, A.PRODUCT_ID

🍜 서울에 위치한 식당 목록 출력하기

AVG를 이용해 평균을 구하고, ROUND를 사용해 소수점 자리에서 반올림 해주면 된다.
LIKE "%서울%"로 작성했더니 오답이 되었는데, 만약 경기도 서울시 라는 주소가 있으면 서울에 위치했다고 판단되어 오답처리가 되는 것
따라서 "서울%"로 작성해주면 된다.

SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS,
ROUND(AVG(B.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO AS A
JOIN REST_REVIEW AS B
ON A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE "서울%"
GROUP BY A.REST_ID
ORDER BY SCORE DESC, A.FAVORITES DESC

👩‍⚕️ 취소되지 않은 진료 예약 조회하기

세개의 테이블 조인 가능, WHERE를 사용해 조건을 달아주면 된다.

SELECT C.APNT_NO, A.PT_NAME, A.PT_NO, C.MCDP_CD, B.DR_NAME, C.APNT_YMD
FROM APPOINTMENT AS C
JOIN PATIENT AS A ON A.PT_NO = C.PT_NO
JOIN DOCTOR AS B ON C.MDDR_ID = B.DR_ID
WHERE DATE_FORMAT(C.APNT_YMD,"%Y-%m-%d")='2022-04-13'
AND C.MCDP_CD = 'CS'
AND C.APNT_CNCL_YN = 'N'
ORDER BY C.APNT_YMD;
profile
뭐든지 난 열심히 하지

0개의 댓글