[MySQL] 문제(SUM(), AVG(), COUNT(), MIN() & MAX(), GROUP BY, ORDER BY)

Lake·2024년 4월 10일
0

SQL 문제

목록 보기
1/36

관련 설명:
https://velog.io/@dyllis_lin/MySQL-%EA%B8%B0%EB%A1%9D2

연산

- 상품 준비시간과 배달시간의 합계 구하기(연산자 사용)

SELECT food_preparation_time
	   , delivery_time
	   , food_preparation_time + delivery_time AS "total_time"
FROM food_orders fo; 


- 상품 준비시간의 합계 평균 구하기

  • 합계 : SUM(컬럼)
  • 평균 : AVG(컬럼)
SELECT SUM(food_preparation_time) AS "total_food_preparation time"
	   , AVG(delivery_time) AS avg_food_preparation_time 
FROM food_orders fo; 


- 전체 데이터의 개수 구하기

  • 데이터 개수 : COUNT(컬럼) <컬럼 명 대신 1 혹은 * 사용 가능>
  • 중복제거: COUNT(DISTINCT 컬럼명)
SELECT COUNT(1) AS "count_of_orders"
	   , COUNT(DISTINCT customer_id) AS "count_of_customers" 
FROM food_orders fo; 

  • count_of_orders : 주문 건수
  • count_of_customers : 주문 한 고객 수

    맨 처음에는 왜 쿼리가 이렇게 짜여지는지 이해가 안갔다.

    • 주문 '한' 고객 수 -> 몇명이 주문 했는지
    • '한 명이 여러번 주문 했을 수 있다'는 생각을 못 했음 -> 아 그럼 중복을 제거해야 되는 거겠구나
    • 근데 나는 DISTINCT를 '몇개의 값을 가지고 있는지 구할 때 사용한다' 라고 배움 -> 직관적으로 이해를 못함(...ㅋㅋ)
    • 무슨 말이지? 해서 검색해보니까 DISTINCT는 중복제거 키워드가 맞았다...

      그제야 이해 완.

- 주문 가격의 최솟값, 최댓값 구하기

  • 최솟값 : MIN(컬럼)
  • 최댓값 : MAX(컬럼)
SELECT MIN(price) AS "최솟값"
	   , MAX(price) AS "최댓값"
FROM food_orders fo; 


- 주문 금액이 30,000원 이상인 주문건의 개수 구하기

로직
1. 필요 컬럼 : 주문 금액, 주문 번호(개수를 구해야 하니까)
2. 조건 : 30,000원 이상 -> WHERE 사용
3. 필요 수식 : 개수 구하는 수식 -> COUNT(1)

SELECT COUNT(order_id) AS "주문 건수"
FROM food_orders fo
WHERE price >= 30000;

- 한국 음식의 주문 당 평균 음식가격 구하기

로직
1. 필요 컬럼 : 음식 종류, 주문 금액, 주문 건수
2. 조건 : 한국 음식
3. 필요 수식 : AVG

SELECT AVG(price) AS "평균 가격"
FROM food_orders fo
WHERE cuisine_type = 'Korean';


범주 별 연산

- 음식 종류별 주문 금액 합계

SELECT cuisine_type 
	   , SUM(price) AS "금액 합계"
FROM food_orders fo
GROUP BY cuisine_type;   

GROUP BY cuisine_type 대신에 GROUP BY 1을 사용해도 된다.

실제로 돌려보니까 똑같이 잘 돌아간다. 근데 나는 컬럼 명 쓰는게 더 안 헷갈리고 좋다...

- 음식점별 주문 금액 최댓값 조회하기

SELECT restaurant_name 
	   , MAX(price) AS "최대 주문 금액"
FROM food_orders fo
GROUP BY restaurant_name;   

- 결제 타입별 가장 최근 결제일 조회하기

SELECT pay_type AS "결제 타입"
	   , MAX(date) AS "최근 결제일"
FROM payments p
GROUP BY pay_type;   

처음 이 문제를 보고 최근? 뭘 써야 하는거지? 날짜 관련 함수 따로 써야 하나? 싶었는데 그냥 MAX() 쓰면 해결 될 문제였다. 반대로 최초 날짜를 구하고 싶으면 MIN().


정렬

- 고객을 이름 순으로 오름차순으로 정렬하기

SELECT *
FROM customers c
ORDER BY name;   


- 음식점별 주문 금액 최댓값 조회하기 -> 최댓값 기준으로 내림차순 정렬하기

  • 오름차순 : ORDER BY 컬럼
  • 내림차순 : ORDER BY 컬럼 DESC
SELECT restaurant_name 
	   , MAX(price) AS "최대 주문금액"
FROM food_orders fo
GROUP BY restaurant_name
ORDER BY MAX(PRICE)  DESC;   

마찬가지로 'ORDER BY MAX(PRICE) DESC' 대신 'ORDER BY 2 DESC'로 써도 잘 돌아간다.


- 음식 종류별 가장 높은 주문 금액과 가장 낮은 주문금액을 조회하고, 가장 낮은 주문 금액 순으로 정렬하기

로직
1. 필요 컬럼 : 음식 종류, 주문 금액
2. 조건 : 없음
3. 필요 수식 : GROUP BY cuisine_type -> 음식 종류
                  MIN(price) DESC -> 가장 낮은 금액 순 정렬

SELECT cuisine_type
	   , MAX(price) AS "최대 주문 금액"
	   , MIN(price) AS "최소 주문 금액"
FROM food_orders fo
GROUP BY cuisine_type
ORDER BY MIN(price) DESC; 

오늘도 TMI
SQL이라는 존재에 천천히 적응해 가는 중...

0개의 댓글