sql 문제가 나오는 기업의 코딩 테스트를 준비하느라 다~~~ 까먹어버렸던 sql 공부를 다시 해본다..
https://school.programmers.co.kr/learn/courses/30/parts/17044
프로그래머스 SQL KIT 에서 충분히 연습을 해볼 수 있기 때문에 그리 어렵지는 않지만, 그래도 모르는 기초 문법은 없어야 하기에 이렇게 정리로 끄적여 본다 😂 공부하면서 가장 어렵게 느껴졌던 GROUP BY 파트와 JOIN 파트로 나눠서 정리해 볼것이다.
가장 일반적으로 사용하는 문법 : SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT 으로 차례대로 사용하게 되지만 실행되는 순서는 FROM으로 테이블 부터 확인 하고 WHERE (조건) - GROUP BY - HAVING - SELECT(출력) - ORDER BY(출력) - LIMIT (출력) 순이다. 이걸 잘 기억하고 풀어보자!!
GROUP BY는 SELECT 할 수 있는 것이 집계 함수로 제한된다.
1. SUM
2. COUNT
3. MIN/MAX
4. AVG
문제 1. 식품분류별 가장 비싼 식품의 정보 조회하기 (level 4)
문제
FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
[FOOD_PRODUCT]
PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
P0018 | 맛있는고추기름 | CD_OL00008 | 식용유 | 6100 |
P0019 | 맛있는카놀라유 | CD_OL00009 | 식용유 | 5100 |
P0020 | 맛있는산초유 | CD_OL00010 | 식용유 | 6500 |
P0021 | 맛있는케첩 | CD_SC00001 | 소스 | 4500 |
P0022 | 맛있는마요네즈 | CD_SC00002 | 소스 | 4700 |
P0039 | 맛있는황도 | CD_CN00008 | 캔 | 4100 |
P0040 | 맛있는명이나물 | CD_CN00009 | 캔 | 3500 |
P0041 | 맛있는보리차 | CD_TE00010 | 차 | 3400 |
P0042 | 맛있는메밀차 | CD_TE00001 | 차 | 3500 |
P0099 | 맛있는맛동산 | CD_CK00002 | 과자 | 1800 |
출력
CATEGORY MAX_PRICE PRODUCT_NAME
식용유 | 6500 | 맛있는산초유 |
과자 | 1800 | 맛있는맛동산 |
다음 문제에서 주의 깊게 봐야하는 부분은 세 가지 이다.
1) 카테고리로 그룹을 묶되 PRICE 가 가장 큰 값만 출력해야 한다.
2) 조건에 카테고리가 ('과자', ' 국', '김치', '식용유') 인 것만 출력
3) MAX_PRICE 를 내림차순으로 정렬
SELECT CATEGORY, PRICE AS 'MAX_PRICE', PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) #조건 1: 카테고리별로 가격중에 max인 얘들만
FROM FOOD_PRODUCT
GROUP BY CATEGORY)
AND CATEGORY IN ('과자', '국', '김치', '식용유') #조건 2
ORDER BY MAX_PRICE DESC
* WHERE 절 안에 IN (~ 요 안에 들어있는 얘들 출력)을 써서 한번 더 조건을 걸어준다.
문제 2. 즐겨찾기가 가장 많은 식당 정보 출력하기 (level 3)
문제
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
REST_INFO 테이블
REST_ID REST_NAME FOOD_TYPE VIEWS FAVORITES PARKING_LOT ADDRESS TEL
00001 | 은돼지식당 | 한식 | 1150345 | 734 | N | 서울특별시 중구 다산로 149 | 010-4484-8751 |
00002 | 하이가쯔네 | 일식 | 120034 | 112 | N | 서울시 중구 신당동 375-21 | NULL |
00003 | 따띠따띠뜨 | 양식 | 1234023 | 102 | N | 서울시 강남구 신사동 627-3 1F | 02-6397-1023 |
00004 | 스시사카우스 | 일식 | 1522074 | 230 | N | 서울시 서울시 강남구 신사동 627-27 | 010-9394-2554 |
00005 | 코슌스 | 일식 | 15301 | 123 | N | 서울특별시 강남구 언주로153길 | 010-1315-8729 |
출력
FOOD_TYPE REST_ID REST_NAME FAVORITES
한식 | 00001 | 은돼지식당 | 734 |
일식 | 00004 | 스시사카우스 | 230 |
양식 | 00003 | 따띠따띠뜨 | 102 |
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FAVORITES, FOOD_TYPE) IN (SELECT MAX(FAVORITES), FOOD_TYPE
FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC
1번 문제와 비슷한 유형의 문제이다.
문제 3. 입양 시각 구하기(2)
문제
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
출력
HOUR COUNT
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 3 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
20 | 0 |
21 | 0 |
22 | 0 |
23 | 0 |
이번 문제는 막연히 DATETIME에서 HOUR 만 뽑아서 그 갯수를 세는 문제가 아니다.
출력에서 볼 수 있듯이 0시 ~ 23 시가 모두 출력되고 이에 해당되는 갯수가 출력되어야 한다. 그러므로 SET 함수를 이용하여 초기 변수를 정해주어야 한다.
1 씩 증가한 HOUR 가 출력되어야 하고 1씩 증가되는 변수와 같으면 갯수를 세도록 코드를 작성해 주어야 한다.
여기서 잠깐‼️‼️‼️‼️‼️‼️ 변수 지정과 DATE을 처리하는 방법에 대해 알아보자.
변수명 지정
변수 명을 지정해주기 위해서는 SET @변수명 = ...; 형태로 변수를 선언하고 다음과 같이 사용한다.
SET @HOUR = -1;
날짜 추출
- YEAR(DATETIME) => 2022.. (년도만 추출)
- MONTH(DATETIME)
- HOUR(DATETIME) => 1,2,3,4,...23 (시간만 추출)
날짜형 변환
- DATE_FORMAT(날짜, '%Y-%m-%d')
SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS 'HOUR',
(SELECT COUNT(HOUR(DATETIME))
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)=@HOUR) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE @HOUR < 23; #조건을 안달아주면 +1 증가가 끝없이 간다. (필수)
Action speaks louder than words. 하루 하루의 기록을 습관화 합니다 📖
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!