반응형 DB/SQL Problems30 [SQL-GROUP BY, 난이도 중하] 고양이와 개는 몇 마리 있을까 해설 : 동물 종류 별 마리 수를 조회하는 문제이다. 그래서 "ANIMAL_TYPE" 필드를 기준으로 그룹핑 해줘야 한다. 테이블을 보면 동물 종류는 개(Dog), 고양이(Cat) 밖에 없어서 WHERE 문은 쓰지 않아도 된다. "Cat"이 "Dog"보다 먼저 조회 되게 "ANIMAL_TYPE" 필드를 기준으로 오름차순 하여, 최종적으로 문제에서 원하는 "ANIMAL_TYPE" 필드와 ANIMAL_TYPE 별로 그룹핑된 컬럼 수를 조회하면 된다. SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE; SELECT : 조회하라 ANIMAL_TYPE, COUNT(ANIMAL_TY.. 2020. 12. 8. [SQL-GROUP BY, 난이도 중] 동명 동물 수 찾기 해설 : 이름 별 동명 동물 마리 수를 조회해야 하기 때문에 NAME 을 기준으로 그룹핑 되어야 한다. NAME을 기준으로 그룹핑 하여, NAME과 NAME 별로 그룹핑된 컬럼 수를 조회하는 서브테이블(A) 을 만들어두고 이 테이블의 COUNT 필드값이 2 이상인 경우에만 조회를 하도록 조건을 걸어서 동명 동물 정보만 출력할 수 있게 하였다. 그리고 마지막에 NAME을 기준으로 오름차순 정렬했고, 최종 적으로 A 테이블에서 이 문제에서 원하는 정보인 NAME과 COUNT 필드를 조회할 수 있게 하면 된다. SELECT A.NAME, A.COUNT FROM (SELECT NAME, COUNT(NAME) COUNT FROM ANIMAL_INS GROUP BY NAME) AS A WHERE A.COUNT>1 .. 2020. 12. 8. [SQL-SUM,MAX,MIN, 난이도 하] 최댓값 구하기 해설 : 테이블 "ANIMAL_INS" 의 DATETIME은 보호소에 들어온 시각이기 때문에, 가장 최근에 보호소에 들어온 동물이 보호소에 들어온 시각은 DATETIME의 최댓값으로 알 수 있는 것이다. 이 값을 조회하면 된다. SELECT MAX(DATETIME) FROM ANIMAL_INS; SELECT : 조회하라 MAX(DATETIME) : DATETIME 필드값의 최댓값을 FROM ANIMAL_INS : 테이블 "ANIMAL_INS" 에서 만약 직접 정렬 후 상위 레코드 하나를 추출하는 방법을 쓰고 싶다면 다음과 같이 ORDER BY, LIMIT를 사용하면 된다. SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1; SELECT : 조.. 2020. 12. 8. [SQL-SUM,MAX,MIN, 난이도 하] 최솟값 구하기 해설 : 테이블 "ANIMAL_INS" 의 DATETIME은 보호소에 들어온 시각이기 때문에, 보호소에 가장 먼저 들어온 동물이 보호소에 들어온 시각은 DATETIME의 최솟값으로 알 수 있는 것이다. 이 값을 조회하면 된다. SELECT MIN(DATETIME) FROM ANIMAL_INS; SELECT : 조회하라 MIN(DATETIME) : DATETIME 필드 값의 최솟 값을 FROM ANIMAL_INS : 테이블 "ANIMAL_INS" 에서 만약 직접 정렬 후 상위 레코드 하나를 추출하는 방법을 쓰고 싶다면 다음과 같이 ORDER BY, LIMIT를 사용하면 된다. SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1; SELECT : 조회하라 .. 2020. 12. 8. [SQL-GROUP BY, 난이도 중상] 입양 시각 구하기(2) kimcoder.tistory.com/208?category=897810 [SQL-GROUP BY, 난이도 중] 입양 시각 구하기(1) 해설 : DATETIME을 보면 "0000-00-00 00:00:00" 형식을 지키고 있다. 여기서 HOUR 함수를 이용하면 쉽게 "시" 만 추출할 수 있다. 그리고 테이블의 레코드 수는 COUNT 함수로 구할 수 있다. 시간대 별 입양 건 kimcoder.tistory.com 해설 : 위에 링크로 첨부한 입양 시각 구하기(1) 과의 차이점은 COUNT(*) 값이 0인 레코드 포함 여부이다. 이번 문제에서는 0부터 23까지 모든 시간대 별로 입양 시각 분포를 구해야 한다. 이 문제는 곰곰히 생각해도 잘 풀리지 않아서 검색을 해봤는데 핵심은 변수를 사용한다는 점이었다. 이.. 2020. 12. 7. [SQL-GROUP BY, 난이도 중] 입양 시각 구하기(1) 해설 : DATETIME을 보면 "0000-00-00 00:00:00" 형식을 지키고 있다. 여기서 HOUR 함수를 이용하면 쉽게 "시" 만 추출할 수 있다. 그리고 테이블의 레코드 수는 COUNT 함수로 구할 수 있다. 시간대 별 입양 건 수를 구하는 것이 목적이므로, 그룹핑은 시간대가 기준이 되어야 한다. 그리고 이 테이블에서 시간대는 9시부터 19시로 딱 맞아 떨어지지 않기 때문에 HOUR이 9~19 인 레코드만 나오도록 조건 지정을 해줘야 한다. 마지막으로, 시간대 순으로 정렬해주면 문제에서 원하는 결과가 나온다. SELECT HOUR(DATETIME) HOUR, COUNT(*) COUNT FROM ANIMAL_OUTS WHERE HOUR(DATETIME) BETWEEN 9 AND 19 GROUP.. 2020. 12. 7. [SQL-JOIN, 난이도 중하] 없어진 기록 찾기 테이블 테이블 문제 설명 해설 : ANIMAL_INS, ANIMAL_OUTS 테이블에 있는 동물들은 각각 보호소에 왔던 동물들, 입양 간 동물들이다. 보호소에 들어온 기록은 없고 입양을 간 기록만 있는 동물들을 벤 다이어그램으로 나타내면 다음과 같다. (A=ANIMALS_INS, B=ANIMAL_OUTS) A를 B와 RIGHT JOIN을 해주고 A 부분을 제거해주면 해당 테이블을 만들 수 있다. 이 테이블에서 ANIMAL_OUTS의 ANIMAL_ID를 기준으로 오름차 순 적용하여, 문제가 원하는 정보인 ANIMAL_ID, NAME 값을 레코드마다 추출하여 반환해주면 된다. SELECT AO.ANIMAL_ID, AO.NAME FROM ANIMAL_INS AI RIGHT JOIN ANIMAL_OUTS AO .. 2020. 12. 7. [SQL-JOIN, 난이도 중하] 있었는데요 없었습니다 테이블 테이블 문제 설명 해설 : ANIMAL_INS와 ANIMAL_OUTS 테이블을 ANIMAL_ID에 대해 JOIN해주면 한 동물이 보호소에 들어왔을 때와 입양 갔을 때의 정보를 한 레코드에 확인할 수 있게 된다. ANIMAL_INS, ANIMAL_OUTS의 DATETIME은 각각 보호 시작일과 입양일을 의미하기 때문에 ANIMAL_OUT의 DATETIME이 ANIMAL_INS의 DATETIME보다 더 작은 레코드들을 찾으면 된다. 문제가 원하는 정보인 ANIMAL_ID, NAME 값을 레코드마다 추출하여 반환해주면 된다. SELECT AI.ANIMAL_ID, AI.NAME FROM ANIMAL_INS AI JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID=AO.ANIMAL_ID WHE.. 2020. 12. 7. [SQL-JOIN, 난이도 중] 오랜 기간 보호한 동물(1) 테이블 테이블 문제 설명 해설 : ANIMAL_INS, ANIMAL_OUTS 테이블에 있는 동물들은 각각 보호소에 왔던 동물들, 입양 간 동물들이다. 아직 입양을 못 간 동물들을 벤 다이어그램으로 나타내면 다음과 같다. (A=ANIMALS_INS, B=ANIMAL_OUTS) A를 B와 LEFT JOIN을 해주고 B 부분을 제거해주면 해당 테이블을 만들 수 있다. 이 테이블에서 보호소에 있었던 기간은 보호소에 일찍 들어온 동물일 수록 더 길 것이다. 이 조건을 상위 3개의 레코드까지 적용하여, 문제가 원하는 정보인 NAME, DATETIME 값을 레코드마다 추출하여 반환해주면 된다. SELECT AI.NAME, AI.DATETIME FROM ANIMAL_INS AI LEFT JOIN ANIMAL_OUTS .. 2020. 12. 7. 이전 1 2 3 4 다음