MySQL문제풀기

문해피와 제육볶음·2023년 6월 12일
0

데이터베이스

목록 보기
2/13

동명 동물 수 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59041

문제의 풀이는 동명의 이름을 찾고 그 이름에 몇마리가 있는지 찾는것입니다.

select *
from (select NAME, count(name) as COUNT
     from animal_ins
     where name is not NULL
     group by NAME)X
where COUNT>=2
order by NAME

서브쿼리 안의 내용

from에 테이블에서 동물의 이름인 NAME 컬럼, 각각의 이름의 수를 카운트하는 COUNT 컬럼을 선택하였습니다.
그리고 조건중 NULL값이 없어야 하므로 is not NULL을 통해서 널값을 미포함시켰습니다.
그리고 이름의 각각의 수를 카운트 하기위해서 NAME으로 그룹을 만들었습니다.
쿼리를 빠져 나와서 조건에 count의 수가 2이상이고
정렬은 NAME의 오름차순으로 정렬하였습니다.


가격대별 상품 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131530

문제 설명

다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은 PRODUCT 테이블입니다. PRODUCT 테이블은 아래와 같은 구조로 되어있으며, PRODUCT_IDPRODUCT_CODEPRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.

Column nameTypeNullable
PRODUCT_IDINTEGERFALSE
PRODUCT_CODEVARCHAR(8)FALSE
PRICEINTEGERFALSE

상품 별로 중복되지 않는 8자리 상품코드 값을 가지며 앞 2자리는 카테고리 코드를 나타냅니다.

문제

PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

예시

예를 들어 PRODUCT 테이블이 다음과 같다면

PRODUCT_IDPRODUCT_CODEPRICE
1A100001110000
2A10000459000
3C300000222000
4C300000615000
5C300001030000
6K100002317000

만원 단위의 가격대 별로 상품을 나누면

  • 가격대가 0원 ~ 1만원 미만인 상품은 PRODUCT_ID 가 2인 상품 1개,
  • 가격대가 1만원 이상 ~ 2만원 미만인 상품들은 PRODUCT_ID 가 1, 4, 6인 상품 3개,
  • 가격대가 2만원 이상 ~ 3만원 미만인 상품은 PRODUCT_ID 가 3인 상품 1개,
  • 가격대가 3만원 이상 ~ 4만원 미만인 상품은 PRODUCT_ID 가 5인 상품 1개,

에 각각 해당하므로 다음과 같이 결과가 나와야 합니다.

PRICE_GROUPPRODUCTS
01
100003
200001
300001
SELECT TRUNCATE((PRICE/10000),0)*10000 AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC
  1. TRUNCATE를 통해서 먼저 PRICE를 10000으로 나누고 그것의 소수점을 삭제하고 10000을 곱해서 PRICE_GROUP으로 컬럼명을 합니다
  2. 그리고 PRODUCT_ID의 숫자를 PRODUCTS 컬럼명으로 합니다
  3. 그것을 PRODUCT 테이블에서 찾습니다
  4. 아까 만든 PRICE_GROUP을 그룹으로 묶습니다
  5. 정렬은 PRICE_GROUP의 오름차순으로 합니다.

입양된시각별로 구하기

문제설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_OUTCOMEVARCHAR(N)FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

HOURCOUNT
00
10
20
30
40
50
60
73
81
91
102
1113
1210
1314
149
157
1610
1712
1816
192
200
210
220
230

풀이

set @hour=-1;
select @hour := @hour +1 as HOUR,(
	select count(*)
	from animal_outs
	where @hour = HOUR(datetime)) as COUNT
from animal_outs
where @hour<23

이 문제를 풀기 위해서는 SET이라는 문법을 이용해서 새로운 변수를 할당해주고 서브쿼리를 이용해야합니다.

이렇게 하는 이유는 DATETIME라는 컬럼에서 0시~23시 까지 연속적으로 있는 것이 아니라 중간에 몇몇빠지는 시간대가 있기 때문입니다.

SET이라는 문법은 Python 문법을 예로 든다면 for문과 비슷합니다.

cnt=0
for n in range(0,24):
	cnt+=n

위의 테이블에서 쿼리문을 작성한다면

SET @HOUR=-1;
SELECT @HOUR := @HOUR+1 AS HOUR
FROM ANIMAL_OUTS

위의 표현으로 쿼리문을 한다면 HOUR라는 컬럼에 1부터 N-1개의 로우가 생성이 될것입니다.

그리고 ANIMAL_OUTS테이블에 DATETIME컬럼에 @HOUR과 같은 값을 가지는 데이터를 COUNT하면

SET @HOUR = -1
SELECT @HOUR := +1 AS HOUR,(
	SELECT COUNT(*)
	FROM ANIMAL_OUTS
	WHERE @HOUR=HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR<24

그리고 마지막에 WHERE절에서 @HOUR의 제한을 걸어줌으로서 0시~23시까지 로우를 만들어 줍니다

0개의 댓글