상세 컨텐츠

본문 제목

#3. 그룹 연산, 정렬, 구조 정리

내일배움캠프 학습/SQL

by 남민우_ 2024. 10. 11. 18:09

본문

1. 범주별 연산 (GROUP BY)

컬럼 별마다 묶어서 연산을 하고 싶을 때

하나하나 계산하는 것이 아니라 컬럼 단위로 묶어서 한번에 계산하고자 할 때 사용

select cuisine_type,
       sum(price) sum_of_price
from food_orders
group by cuisine_type

 

1. SELECT

cuisine_type 와 price의 sum 을 조회

이때 sum 은 sum_of_price 로 지칭한다.

 

2. FROM

food_orders 테이블에서 조회

 

3. GROUP BY

cuisine_type 마다 그룹으로 묶어서 조회

 

실습1 : 음식점 별 주문 금액 최댓값 조회

여기서 검색 키워드는 '음식점', '주문 금액의 최댓값' 이 된다.

SELECT restaurant_name as "음식점",
	MAX(price) as max_Price
FROM food_orders fo 
group by restaurant_name

 

실습2 : 결제 타입 별 가장 최근 결제일 조회

여기서의 검색 키워드는 '결제 타입', '최근 결제일' 이 된다.

SELECT pay_type ,
	max(date) recent_date
FROM payments p 
group by pay_type

 

추가로, GROUP BY 절에 SELECT 에 해당하는 컬럼 외 다른 컬럼을 사용해봤을 때

에러는 발생하진 않았지만 원하는 결과는 나오지 않았다.

 

 

2. Query 결과를 정렬 (ORDER BY)

조회한 결과를 단순 나열하지 않고, 더 보기 쉽게 혹은 원하는 순서대로 보기 위해 정렬하고자 할 때 사용

select cuisine_type,
       sum(price) sum_of_price
from food_orders
group by cuisine_type
order by sum(price)

 

기본적으로 결과를 조회하면 오름차순으로 정렬되지만

DESC : 내림차순 / ASC : 오름차순

으로 직접 지정할 수도 있다.

 

+ GROUP BY 절과 ORDER BY 절의 순서를 뒤집었을 때 에러가 발생했다.

= SQL 문법 구조의 문제 : 이후 설명

 

실습1 : 음식점 별 주문 금액 최댓값으로 조회하되, 내림차순 정렬

여기서의 키워드는 '음식점', '주문금액', '최댓값', 그리고 '내림차순' 이 될 것이다.

SELECT restaurant_name,
	max(price) as max_Price
FROM food_orders fo 
group by restaurant_name
order by max(price) desc

 

 

실습2 : 고객을 이름 순으로 오름차순 정렬

키워드는 '이름', '오름차순' 이 된다.

SELECT *
FROM customers c
order by name

 

여기서 name 정렬 (ORDER BY) 중 조건을 더 추가로 설정하고 싶다면

SELECT *
FROM customers c
order by gender, name

 

이처럼 진행할 수 있을 것이다.

결과로는 gender 에 따라 먼저 정렬되고, 같은 gender 안에서 name 순으로 다시 정렬된다.

 

 

3. SQL 구조 정리

SQL의 기본 구조는

SELECT
FROM
WHERE
GROUP BY
ORDER BY

 

다음과 같다.

코드를 더 간편하게 보고, 원하는 파트만 수정하기 용이하도록 구조를 미리 작성하고 코드를 짤 수 있다.

 

구조 정리 퀴즈

1번

1. order by sum(delivery_time) desc
2. group by cuisine_type
3. where day_of_the_week=’Weekend’
4. from food_orders
5. select cuisine_type, sum(delivery_time) 

 

정답 : 5 - 4 - 3 - 2 - 1

 

2번

1. where age between 20 and 40
2. select age, count(name) count_of_name
3. order by age 
4. group by age
5. from customers

 

정답 : 2 - 5 - 1 - 4 - 3

관련글 더보기