[프로그래머스] SQL 20

[lv2] 재구매가 일어난 상품과 회원 리스트 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131536 유저별로 재구매가 일어난 상품을 출력하는 문제다.재구매 상품에 대해 첫 구매 컬럼을 제외하고 출력하는 문제면 까다로울 것 같다고 생각했다. SELECT USER_ID, PRODUCT_IDFROM ONLINE_SALEGROUP BY USER_ID, PRODUCT_IDHAVING COUNT(*) >= 2ORDER BY USER_ID, PRODUCT_ID DESC

[lv2] 자동차 평균 대여 기간 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/157342날짜를 비교를 위해, 코테에서 사용하는 방법을 떠올렸다.total = (Y * 365) + (M * 29~31[배열 필요]) + D DATE TO NUMBER를 위해, 무작정 CAST()를 떠올렸다. 그래서 오답이었다. 1. CAST()CAST('2022-10-1' TO INTEGER) // 에러CAST('2022-10-1' TO UNSIGNED/SIGNED [INTEGER]) // 2022CAST('1000-01-03' TO UNSIGNED/SIGNED [INTEGER]) // 1000 오답을 받아 SELECT로 조회하니, 이는 의도하는 형변환이 아니었다. 문자 '-'를 만나기 전의 유효숫..

[lv3] 저자 별 카테고리 별 매출액 집계하기

https://school.programmers.co.kr/learn/courses/30/lessons/144855인덱스가 걸려있는 경우 날짜 비교에서 BETWEEN이 LIKE보다 권장된다고 한다. LIKE는 모든 범위를 스캔하기 때문이다. SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(PRICE * SALES) AS TOTAL_SALESFROM ( SELECT BOOK_ID, CATEGORY, AUTHOR_ID, AUTHOR_NAME, PRICE FROM BOOK JOIN AUTHOR USING(AUTHOR_ID)) B JOIN ( SELECT BOOK_ID, SALES FROM BOOK_SALES WHERE SALES_DATE LIK..

[lv3] 카테고리 별 도서 판매량 집계하기

https://school.programmers.co.kr/learn/courses/30/lessons/144855 MONTH()의 반환형은 INT라고 한다.= '1', LIKE '1'과 같이 자동형변환을 거칠 필요는 없었다. 와일드카드를 사용하지 않는 경우의 LIKE와 =의 비교에서, = 이 권장되었다.이유는 성능(동작은 비슷해지나, 오버헤드가 있다고 함), 가독성 이었다.LIKE는 근간이 패턴매칭을 위한 연산자였고, NUMBER 외의 문자열간의 비교에서도 =을 권장했다.SELECT CATEGORY, SUM(SALES) TOTAL_SALESFROM BOOK JOIN BOOK_SALESUSING(BOOK_ID)WHERE MONTH(SALES_DATE) = 1GROUP BY CATEGORYORDER BY ..

[lv3] 조건에 맞는 사용자와 총 거래금액 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/164668 WRITER_ID와 USER_ID가 외래키라는 명시가 없었다. 하지만, 조인이 가능한 속성임이 유일했다. SELECT B.WRITER_ID, U.NICKNAME, SUM(B.PRICE) TOTAL_SALESFROM USED_GOODS_BOARD B JOIN USED_GOODS_USER UON B.WRITER_ID = U.USER_IDWHERE B.STATUS LIKE 'DONE'GROUP BY B.WRITER_IDHAVING TOTAL_SALES >= 700000ORDER BY TOTAL_SALES

[lv3] 업그레이드 할 수 없는 아이템 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/273712SELECT ITEM_ID, ITEM_NAME, RARITYFROM ITEM_INFOWHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID FROM ITEM_TREE)ORDER BY ITEM_ID DESC  NOT IN (NULL) 조건식은, NULL의 비교는 UNKNOWN이므로 NULL을 반환한다.이는 WHERE절 조건식을 항상 FALSE로 만들게 되므로, 아무 결과도 조회되지 않는다.이후 값의 범위에 포함이 되지 않는 -1로 예외 처리하였다. 오답을 받으며 떠오른 내용이 있다.IN(NULL, A)의 경우에는 A에 포함 되면 TR..

[lv2] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151137SELECT CAR_TYPE, COUNT(CAR_TYPE) CARSFROM CAR_RENTAL_COMPANY_CARWHERE OPTIONS LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'GROUP BY CAR_TYPEORDER BY CAR_TYPE 해당 식은 OR절 이후를 조건 컬럼 OPTIONS와 비교하는 것이 아닌, 문자열 자체로 평가 됨MySQL에서 %열선시트%, %가죽시트% 문자열은 각각 FALSE(1)로 치환되므로, => WHERE OPTIONS LIKE '%통풍시트%' OR 1 OR 1=> WHERE OPTIONS LIKE '%통풍시트%'식과 같아짐  수정 1...

[lv3] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

https://school.programmers.co.kr/learn/courses/30/lessons/157340 SELECT CAR_ID, IF(CAR_ID IN (SELECT DISTINCT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE END_DATE >= '2022-10-16'), '대여중', '대여 가능') AVAILABILITYFROM CAR_RENTAL_COMPANY_RENTAL_HISTORYGROUP BY CAR_IDORDER BY CAR_ID DESC 문제를 잘못 해석했고,데이터 결함이 없다면 (START_DATE > END_DATE인 경우)..

[lv3] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151139 1. DATE가 실제 날짜를 벗어나는 경우, 처리가 다르다.SELECT DATE('2022-10-32') => NULLSELECT DATE('2022-10-00') => 2022-09-30 00:00:00 2. START_DATE >= DATE('2022-08-01') AND END_DATE 대여일이 기준이므로,   START_DATE >= DATE('2022-08-01') AND START_DATE 가 되어야 한다. 3. 월 별 그룹 테이블을 만드는 아이디어를 떠올리지 못했다. (SUBSTING을 이용하면 처리가 난해했다.)MySQL에서는 DATE를 파싱하는 YEAR(), MONTH()..