[프로그래머스] SQL/오답 노트 8

[lv3] 없어진 기록 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59042RIGHT OUTER JOIN 문제다.해당 쿼리는 오답을 받았다.SELECT ANIMAL_ID, O.NAMEFROM ANIMAL_INS I RIGHT JOIN ANIMAL_OUTS OUSING(ANIMAL_ID)WHERE I.NAME IS NULLORDER BY I.ANIMAL_ID  조건에서 NAME은 NULLABLE이므로 WHERE절에 사용하면 안됐다.   수정SELECT ANIMAL_ID, O.NAMEFROM ANIMAL_INS I RIGHT JOIN ANIMAL_OUTS OUSING(ANIMAL_ID)WHERE I.ANIMAL_ID IS NULLORDER BY I.ANIMAL_ID

[lv3] 조건에 맞는 개발자 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/276034 SELECT ID, EMAIL, FIRST_NAME, LAST_NAMEFROM DEVELOPERSWHERE BIN(SKILL_CODE) & (SELECT BIN(SUM(CODE)) FROM SKILLCODES WHERE NAME IN ('C#', 'Python')) > 0ORDER BY ID BIN()은 NUMBER을 2진수 값으로한 "문자열"을 반환한다. 따라서 이 쿼리는 문자열간의 비트 연산을 수행하므로 예상치 못한 값이 된다. 제출 후 문제가 생긴 이유를 찾고 정수의 비트연산으로 수정했다. 또한, 어차피 &연산간 일치하는 값이 없다면 0을 반환하게 되므로 " > 0"구문을 지웠다.WE..

[lv3] 대장균의 크기에 따라 분류하기 2

https://school.programmers.co.kr/learn/courses/30/lessons/301649 RANK()를 통한다면 구하는 과정이 난해했기에 활용할 수 있는 함수를 보고 시작했다.NETILE(n) => 기준 값에 대해 n개의 순위로 나눠 각각 등급 부여 SELECT ID, CASE WHEN NT = 4 THEN 'CRITICAL' WHEN NT = 3 THEN 'HIGH' WHEN NT = 2 THEN 'MEDIUM' ELSE 'LOW' END COLONY_NAMEFROM ECOLI_DATA A JOIN (SELECT ID, NTILE(4) OVER (ORDER BY SIZE_OF_COLONY) NT ..

[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/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()..