✔ JOIN
주문량이 많은 아이스크림들 조회하기
[프로그래머스 133027]
/*
SELECT : 상위 3개의 맛
FROM : FIRST_HALF, JULY 테이블
GROUP BY : 아이스크림 맛
ORDER BY : 7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값을 내림차순 정렬
*/
SELECT A.FLAVOR
FROM FIRST_HALF A JOIN JULY B
ON A.FLAVOR = B.FLAVOR
GROUP BY A.FLAVOR
ORDER BY (SUM(A.TOTAL_ORDER) + SUM(B.TOTAL_ORDER)) DESC
LIMIT 3
5월 식품들의 총매출 조회하기
[프로그래머스 131117]
/*
SELECT : 식품 ID, 식품 이름, 총매출(식품 가격 * 주문량)
FROM : FOOD_PRODUCT, FOOD_ORDER 테이블
WHERE : 생산일자가 2022년 5월인 식품
GROUP BY : 식물 ID
ORDER BY : 총매출을 기준으로 내림차순 정렬, 같다면 식품 ID를 기준으로 오름차순 정렬
*/
SELECT A.PRODUCT_ID, A.PRODUCT_NAME, SUM(A.PRICE * B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT A JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE B.PRODUCE_DATE LIKE '2022-05-%'
GROUP BY A.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, A.PRODUCT_ID
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
[프로그래머스 157339]
- ROUND(숫자, 반올림 기준 자릿수) : 정해진 자릿수에 따라 반올림하여 반환
- TRUNCATE(숫자, 버릴 기준 자릿수) : 정해진 자릿수에 따라 숫자를 버리고 반환
- FLOOR(숫자) : 소수점 이하를 무조건 버려 반환
- CEILING(숫자) : 소수점 이하를 무조건 올려 반환
/*
SELECT : 자동차 ID, 자동차 종류, 대여 금액(일일 대여 요금 * 30일 * (100 - 할인율)/100의 정수 부분)
FROM : CAR_RENTAL_COMPANY_CAR, CAR_RENTAL_COMPANY_RENTAL_HISTORY, CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블
WHERE : 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능(그 사이에 사용하지 않는 자동차이어야 함)
AND : 30일 이상 대여 가능
GROUP BY : 자동차 ID
HAVING : 자동차 종류가 '세단' 또는 'SUV'
AND : 대여 금액이 50만원 이상 200만원 미만
ORDER BY : 대여 금액을 기준으로 내림차순 정렬, 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 같은 경우 자동차 ID를 기준으로 내림차순 정렬
*/
SELECT A.CAR_ID, A.CAR_TYPE, ROUND(A.DAILY_FEE * 30 * (100 - C.DISCOUNT_RATE)/100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B ON A.CAR_ID = B.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN C ON A.CAR_TYPE = C.CAR_TYPE
WHERE A.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01')
AND C.DURATION_TYPE = '30일 이상'
GROUP BY A.CAR_ID
HAVING A.CAR_TYPE IN ('세단', 'SUV') AND (FEE >= 500000 AND FEE < 2000000)
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
조건에 맞는 도서와 저자 리스트 출력하기
[프로그래머스 144854]
/*
SELECT : 도서 ID, 저자명, 출판일
FROM : BOOK, AUTHOR 테이블
WHERE : '경제' 카테고리
ORDER BY : 출판일을 기준으로 오름차순 정렬
*/
SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK A JOIN AUTHOR B
ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE A.CATEGORY = '경제'
ORDER BY PUBLISHED_DATE
그룹별 조건에 맞는 식당 목록 출력하기
[프로그래머스 131124]
/*
SELECT : 회원 이름, 리뷰 텍스트, 리뷰 작성일
FROM : MEMBER_PROFILE, REST_REVIEW 테이블
WHERE : 리뷰를 가장 많이 작성한 회원
ORDER BY : 리뷰 작성일을 기준으로 오름차순, 같다면 리뷰 텍스트를 기준으로 오름차순 정렬
*/
SELECT A.MEMBER_NAME, B.REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE A JOIN REST_REVIEW B
ON A.MEMBER_ID = B.MEMBER_ID
WHERE A.MEMBER_ID = (SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1)
ORDER BY B.REVIEW_DATE, B.REVIEW_TEXT
없어진 기록 찾기
[프로그래머스 59042]
/*
SELECT : 동물의 ID, 이름
FROM : ANIMAL_INS, ANIMAL_OUTS 테이블 (RIGHT OUTER JOIN)
WHERE : ANIMAL_INS의 ANIMAL_ID가 NULL
ORDER BY : ID 순으로 오름차순 정렬
*/
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_INS A RIGHT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
ORDER BY B.ANIMAL_ID
있었는데요 없었습니다
[프로그래머스 59043]
/*
SELECT : 동물 ID, 이름
FROM : ANIMAL_INS, ANIMAL_OUTS 테이블
WHERE : 보호 시작일보다 입양일이 더 빠른 동물
ORDER BY : 보호 시작일이 빠른 순으로 정렬
*/
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME
오랜 기간 보호한 동물(1)
[프로그래머스 59044]
/*
SELECT : 이름, 보호 시작일
FROM : ANIMAL_INS, ANIMAL_OUTS 테이블 (LEFT OUTER JOIN)
WHERE : ANIMAL_OUTS의 ANIMAL_ID가 NULL
ORDER BY : 보호 시작일 순으로 정렬
*/
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A LEFT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3
보호소에서 중성화한 동물
[프로그래머스 59045]
- != (<>) : 양쪽 값이 다른지 비교하는 연산자
/*
SELECT : 동물 ID, 생물 종, 이름
FROM : ANIMAL_INS, ANIMAL_OUTS 테이블
WEHRE : ANIMAL_INS의 성별 및 중성화 여부는 'Intact', ANIMAL_OUTS의 성별 및 중성화 여부는 'Spayed 또는 Neutered'인 동물
ORDER BY : 동물 ID 순으로 정렬
*/
SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME
FROM ANIMAL_INS A JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE LIKE 'Intact %'
AND B.SEX_UPON_OUTCOME IN ('Spayed Female', 'Neutered Male')
SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME
FROM ANIMAL_INS A JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE != B.SEX_UPON_OUTCOME
상품 별 오프라인 매출 구하기
[프로그래머스 131533]
/*
SELECT : 상품코드 별 매출액(판매가 * 판매량) 합계
FROM : PRODUCT, OFFLINE_SALE 테이블
GROUP BY : 상품코드 별
ORDER BY : 매출액을 기준으로 내림차순 정렬, 같다면 상품코드를 기준으로 오름차순 정렬
*/
SELECT A.PRODUCT_CODE, SUM(A.PRICE * B.SALES_AMOUNT) AS SALES
FROM PRODUCT A JOIN OFFLINE_SALE B
ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_CODE
ORDER BY SALES DESC, A.PRODUCT_CODE
상품을 구매한 회원 비율 구하기
[프로그래머스 131534]
/*
SELECT : 년, 월 별 상품을 구매한 회원수, 상품을 구매한 회원의 비율(2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수, 소수점 두번째자리에서 반올림)
FROM : USER_INFO, ONLINE_SALE 테이블
WHERE : 2021년에 가입한 전체 회원들
GROUP BY : 년, 월 별
ORDER BY : 년을 기준으로 오름차순 정렬, 같다면 월을 기준으로 오름차순 정렬
*/
SELECT YEAR(B.SALES_DATE) AS YEAR,
MONTH(B.SALES_DATE) AS MONTH,
COUNT(DISTINCT B.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT B.USER_ID) / (SELECT COUNT(*) FROM USER_INFO WHERE JOINED LIKE '2021%'), 1) AS PUCHASED_RATIO
FROM USER_INFO A JOIN ONLINE_SALE B
ON A.USER_ID = B.USER_ID
WHERE A.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
FrontEnd 개발자 찾기
[프로그래머스 276035]
/*
SELECT : 개발자의 ID, 이메일, 이름, 성
FROM : DEVELOPERS 테이블
WHERE : Front End 스킬을 가진 개발자
ORDER BY : ID를 기준으로 오름차순 정렬
*/
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT SUM(CODE)
FROM SKILLCODES
WHERE CATEGORY = 'Front End') > 0
ORDER BY ID