코드카타
년,월,성별 별 상품 구매 회원 수 구하기
년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요.
결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.
- 테이블 2개 : JOIN
- 성별 정보가 없는 경우 결과에서 제외해주세요. : WHERE IS NOT NULL
- 년, 월, 성별 별 : GROUP BY
- 오름차순 정렬 : ORDER BY
SELECT YEAR(O.SALES_DATE) AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.GENDER AS GENDER, COUNT(DISTINCT U.USER_ID) AS USER
FROM USER_INFO U JOIN ONLINE_SALE O ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER;
서울에서 위치한 식당 목록 출력하기
서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회
이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬
평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
- 테이블 2개 : JOIN
- 리뷰 평균점수 : AVG
- 소수점 세 번째 자리에서 반올림 해주시고 : ROUND(,2)
- 서울에 위치한 식당 : WHERE LIKE '서울%'
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(R.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO I
JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC;
Print Prime Numbers
이 쿼리는 1000 이하의 모든 소수를 출력합니다.
소수는 1과 자기 자신을 제외하고 어떤 양의 정수로도 나누어지지 않는 수입니다.
결과를 한 줄에 출력하며 구분자로 ampersand (&) 문자를 사용합니다.
예를 들어, 10 이하의 모든 소수에 대한 출력은 다음과 같습니다:
2&3&5&7
- 2부터 시작 -> 재귀적인 쿼리 : WITH
- 해당 테이블에 계속해서 값을 추가 : UNION ALL
- N값 증가 : N+1
- 구분자로 ampersand (&) 문자를 사용 : GROUP_CONCAT
- 소수 확인 : WHERE
WITH RECURSIVE num AS (
SELECT
2 AS n
UNION ALL
SELECT
n+1
FROM num
WHERE n < 1000
)
SELECT
GROUP_CONCAT(n ORDER BY n SEPARATOR '&')
FROM num
WHERE n NOT IN (
SELECT
DISTINCT bnum.n
FROM num AS bnum
JOIN num AS snum
ON bnum.n > snum.n
AND bnum.n % snum.n = 0
)
;
SQL 숙제
가장 비싼 상품 구하기
판매 중인 상품 중 가장 높은 판매가를 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 MAX_PRICE로 지정해주세요.
SELECT max(PRICE) MAX_PRICE
from PRODUCT
월별 잡은 물고기 수 구하기
잡은 물고기 수 컬럼명은 FISH_COUNT, 월 컬럼명은 MONTH로 해주세요.
결과는 월을 기준으로 오름차순 정렬해주세요.
단, 월은 숫자형태 (1~12) 로 출력하며 9 이하의 숫자는 두 자리로 출력하지 않습니다.
잡은 물고기가 없는 월은 출력하지 않습니다.
- 잡은 물고기 수 : COUNT
- 월을 기준 : GROUP BY
- 오름차순 정렬 : ORDER BY
SELECT COUNT(ID) AS FISH_COUNT, MONTH(TIME) AS MONTH
FROM FISH_INFO
GROUP BY MONTH
ORDER BY MONTH;
노선별 평균 역 사이 거리 조회하기
노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.
총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다.
총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고,
총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력
결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.
- 총 누계거리 : SUM
- 평균 역 사이 거리 : AVG
- 총 누계거리는 소수 둘째자리 : ROUND(,1)
- 평균 역 사이 거리는 소수 셋째 자리 : ROUND(,2)
- 단위(km)를 함께 출력 : CONCAT(,'KM')
- 총 누계 거리를 기준 : GROUP BY
- 내림차순 정렬 : ORDER BY
SELECT ROUTE,
CONCAT(ROUND(SUM(D_BETWEEN_DIST),1),'km') AS TOTAL_DISTANCE,
CONCAT(ROUND(AVG(D_BETWEEN_DIST),2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUTE DESC;
group by 절을 사용하여, 서버별 게임캐릭터id수(중복값 허용x)와 평균 경험치를 추출해주세요.
- 서버별 : GROUP BY
- 게임캐릭터id수(중복값 허용x) : COUNT(DISTINCT)
- 평균 경험치 : AVG
select count(distinct game_actor_id) as 게임캐릭터수, avg(exp) as 평균경험치
from basic.users
group by serverno;
group by 와 having 절을 사용하여, 일별 게임캐릭터id수(중복값 허용x)를 구하고, 그 값이 10개를 초과하는 경우를 추출
- 일별 : GROUP BY
- 게임캐릭터id수(중복값 허용x) : COUNT(DISITNCT)
- 그 값이 10개를 초과하는 경우 : HAVING > 10
select date ,count(distinct game_actor_id)게임캐릭터수
from basic.users
group by date
having count(distinct game_actor_id) > 10;
위와 같은 문제를 having 이 아닌 인라인 뷰 subquery를 사용하여, 추출해주세요.
select 일, 게임캐릭터수
from (
select date as 일 ,count(distinct game_actor_id)게임캐릭터수
from basic.users
group by date
) as 일별게임캐릭터수
where 게임캐릭터수 > 10;