문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59045 들어올 때에는 비중성화, 나갈 때에는 중성화인 경우만 필터링 해서 보여줍니다. SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID WHERE INS.SEX_UPON_INTAKE LIKE 'Intact%' and (OUTS.SEX_UPON_OUTCOME LIKE 'Spayed%' or OUTS.SEX_UPON_OUTCOME LIKE 'Neutered%') ORDER BY INS.ANIMAL_ID LEFT JOIN으로 I..
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59044 입양을 가지 못한 동물(JOIN 병합 후, OUTS의 값이 NULL인 경우) 중 DATETIME 순으로 정렬 후 LIMIT 3를 사용했다. SELECT INS.NAME, INS.DATETIME FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID WHERE OUTS.ANIMAL_ID IS NULL ORDER BY INS.DATETIME LIMIT 3 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59043 이전문제와 로직이 동일합니다. SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID=OUTS.ANIMAL_ID WHERE INS.DATETIME > OUTS.DATETIME ORDER BY INS.DATETIME INS에서 ANIMAL_ID, NAME을 가져옵니다. A,B 각 두 테이블을 ID 기준으로 집합합니다. WHERE문으로 DATETIME이 들어온 시간보다 나간 시간이 더 빠를 때를 가져옵니다. 정렬은 INS의 DATETIME 기준으로 정렬합니다. 위와 같이 들어온 날짜가..
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59042 JOIN문제입니다. ANIMAL_INS의 테이블이 유실되어서, ANIMAL_OUTS에는 있지만 ANIMAL_INS에는 없는 동물의 ID와 이름을 ID순으로 조회하세요. SELECT OUTS.ANIMAL_ID, OUTS.NAME FROM ANIMAL_OUTS OUTS LEFT JOIN ANIMAL_INS INS ON OUTS.ANIMAL_ID = INS.ANIMAL_ID WHERE INS.ANIMAL_ID IS NULL ORDER BY OUTS.ANIMAL_ID 문제 해설: 먼저, LEFT JOIN으로 테이블OUTS에서 ID, NAME열의 값을 가져오고, INS에서는 OUTS와 일치하는 모든 A..
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59410 IFNULL으로 처리할 수 있습니다. IFNULL은 열 안의 행이 NULL일 때 변경해서 반환하는 역할을 합니다. SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC 결과 위에는 No name이 안보여서 내렸습니다.
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59407 이름이 있는 경우, NULL이 아닐 때를 가져옵니다. IS NULL을 IS NOT NULL로 변경하였습니다. SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL ORDER BY ANIMAL_ID ASC 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59039 WHERE으로 이름이 NULL인 경우의 ANIMAL_ID를 보여줍니다. SELECT ANIMAL_ID from ANIMAL_INS WHERE NAME IS NULL ORDER BY ANIMAL_ID 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59413 해당 문제만 난이도 급상승이네요. 고득점 킷 중 최고 난이도 입양시각이 0 ~ 23인 시간대의 수를 전부 가져옵니다. SET @hour := -1; # 변수 선언문 SELECT (@hour := @hour + 1) as HOUR, (SELECT COUNT(DATETIME) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT FROM ANIMAL_OUTS WHERE @hour < 23 @hour이라는 변수에 -1을 대입합니다. (:= 대입연산자, = 비교연산자) SELECT 문에서 적어주는 열을 2가지입니다. 1. HOUR : 0 ~ 23까지 +1..
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59412 HOUR 함수를 사용해봅시다. WHERE으로 입양 시각이 9 ~ 19 시간 내인 경우만 가져오고, GROUP BY로 묶은 후, ORDER BY로 정렬합니다. SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT' FROM ANIMAL_OUTS WHERE HOUR(DATETIME) >= 9 and HOUR(DATETIME)
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59040 GROUP BY 그루핑하고, COUNT로 각 ANIMAL_TYPE을 세어준 후 정렬합니다. SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE ASC 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59408 동물의 이름의 종류의 수를 구하는 문제입니다. 동물의 이름이 NULL인 경우에는 수를 세지 않습니다. SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL DISTINCT(중복 제거), WHERE IS NOT NULL문 사용합니다. 1. WHERE 조건문으로 NULL이 아닌 경우에는 갯수 셉니다. 2. COUNT(DISTINCT NAME)으로 NAME열에 중복이 되지 않는 경우에 갯수를 셉니다. 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59406 COUNT(세고 싶은 열)으로 동물 수(열 안의 행의 수)를 셀 수 있습니다. COUNT(*)말고 다른 열을 적어도 결과는 같습니다. SELECT COUNT(*) AS 'count' FROM ANIMAL_INS 결과
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/59038 이전 문제와 동일한 로직입니다. MIN으로 가장 작은 값을 가져오면 됩니다. SELECT MIN(DATETIME) AS '시간' FROM ANIMAL_INS 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59415 가장 최근에 들어온 동물, DATETIME이 가장 최근인 동물을 가져옵니다. 이전 문제와 같은 로직이지만 이번에는 MAX함수를 사용하겠습니다. SELECT MAX(DATETIME) AS '시간' FROM ANIMAL_INS 열의 이름을 변경하는 방법은 열 옆에 AS '변경명'을 작성하여 변경할 수 있습니다. 결과 결과 2 (AS로 이름을 변경하지 사용하지 않았을 때)
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59405 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회합니다. 오름차순 정렬 후, LIMIT로 위에서 1번째까지만 출력했습니다. SQL에서의 인덱스는 0부터 시작하지 않고, 1부터 시작합니다. 곧 배울 MAX함수로도 구현할 수 있지만, SELECT문제니 LIMIT를 사용하였습니다. SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59404 ANIMAL_ID, NAME, DATETIME를 출력합니다. 이름 순으로 오름차순 정렬하고, 이름이 같은 경우에는 내림차순으로 정렬한다. 정렬 기준은 먼저 적은 순서로 적용됩니다. SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME ASC, DATETIME DESC 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59403 ANIMAL_ID와 NAME 열을 출력합니다. SELECT ANIMAL_ID, NAME FROM ANIMAL_INS 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59037 INTAKE_CONDITION가 'Aged' 아닌 것들 중에서 ANIMAL_ID, NAME 열들을 출력합니다. SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION != 'Aged'; 결과
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/59036 INTAKE_CONDITION이 'Sick'인 동물들을 ANIMAL_ID 오름차 순으로 정렬하고 ANIMAL_ID, NAME 열을 가져옵니다. SELECT ANIMAL_ID, NAME # 가져올 열 FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' # WHERE 조건문, 상태만 Sick인 동물 ORDER BY ANIMAL_ID ASC #오름차순 정렬 결과
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/59035 NAME, DATETIME 열을 가져오고 ANIMAL_ID을 내림차순으로 정렬합니다. SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC; 결과