TIL/SQL

TIL 2024-08-28 (SQL - 2주차)

myoma 2024. 8. 28. 17:44

게시글의 제목은 강의 제목이라 2주차지만 사실 2일차...

 

2주차 때 배우는 내용!

 

처음에는 1주차, 저번에 배운 내용을 간단하게 상기시키는 느낌으로 복습을 시작한다.

강사님이 정리해놓으신 1주차 요약본

가장 기억해야하는 부분은 역시 조건 지정하는 방법이라고 생각한다.


 

1주차 내용은 어렵지 않기 때문에 바로 2주차 내용으로 넘어간다.

 

이번엔 조건 지정이 아닌 SQL로 한 번에 계산하기.

(SUM, AVERAGE, COUNT, MIN, MAX)

 

이번 수업은 이론보단 실습으로, 직접 손으로 Query를 작성하며 이해하는 수업을 진행하셨다.

 

select food_preparation_time,
       delivery_time,
       food_preparation_time + delivery_time as total_time
from food_orders

(상품 준비시간과 배달시간의 합계 구하기)

 

컬럼 2개를 작성한 후 그대로 2개의 컬럼에 '+', 사칙연산 기호를 넣으면 된다.

결과 사진

다른 기호도 사용가능하다 (+  , - , * , / )

 

엑셀처럼 평균과 합계 또한 SQL에서 직접 구할 수 있는데

 

함수의 종류

  • SUM(컬럼)
  • AVG(컬럼)
select sum(food_preparation_time) total_food_preparation_time,
       avg(delivery_time) avg_delivery_time
from food_orders

 

결과창에 음식 준비 시간의 합계와 배달하는 시간의 평균이 나온다.

 


 

전체 데이터의 갯수 구하기

 

현재 테이블이 몇 개의 데이터를 가지고 있는지, 몇 개의 값을 가지고 있는지 구할 수 있다.

 

함수의 종류는

  • 데이터 갯수 : COUNT(컬럼)
  • 몇 개의 값을 가지고 있는 지 구할 때 : DISTINCT

DISTINCT는 보통 중복을 없이 데이터를 구할 때 사용하는 것 같다.

ex) 주문을 한 고객은 몇 명인가? (이때 한 고객이 여러 번 주문하여 데이터가 쌓여있어도 1명으로 취급)

 

더 쉽게 Query를 작성해보면 알 수 있다.

select count(1) count_of_orders,
       count(distinct customer_id) count_of_customers
from food_orders

 

위 결과처럼 주문 수는 1898개 지만 DISTINCT를 사용하여 주문한 고객 수는 1200명인 걸 확인할 수 있다.

 


 

데이터의 범위, 최솟값과 최댓값 구하기

 

조회하는 데이터의 최솟값, 최댓값으르 범위도 구할 수 있다.

 

함수 종류

  • 최솟값 : MIN(컬럼)
  • 최댓값 : MAX(컬럼)

이번 강의는 대부분 Query문을 직접 작성하고 실습하면서 어떤 식으로 사용하는 지에 대해 알려주시는 부분이 많았는데 그 이유가 내가 배우면서도 이론 부분으로 알려줄게 딱히 없을 뿐 더러 직접 사용하면서 이해하는 것이 더욱 효과적이었던 것 같다.

 

이번에도 역시 Query를 적어보며 어떤 식으로 사용하는지 익혀보자

 

select min(price) min_price,
       max(price) max_price
from food_orders

 

위 Query문은 food_orders 테이블에서 price의 최댓값, 최솟값을 가져오면서 별명을 주는 것이다.

 

당연히 결과창에는 2개 밖에 나오지 않는다. (min_price와 max_price)

 

여기까지 배운 뒤 지금까지 배운 것을 종합하여 데이터를 조회하는 실습을 해본다.

 

1)주문 금액이 30,000원 이상인 주문건의 갯수 구하기.

 

일단 먼저 Query문을 작성해본다.

select count(1) 
from food_orders
where price >= 30000

 

문제를 짧게 본다면 주문 금액, 30000원 이상, 주문건의 객수 3개 밖에 없기 때문에 천천히 무슨 구문이 필요한 지 생각해보면 쉽다.

 

주문 금액을 불러와야 하기 때문에 food_orders 테이블을 불러오고 30000원 이상이라는 조건이 있기 때문에 where를 사용하여 price의 조건을 맞춰준다.

 

마지막으론 주문건의 갯수를 확인해야하기 때문에 count를 사용하는데 (1)를 넣든 다른 컬럼을 넣어도 상관없다.

원하는 결과는 그저 주문 금액이 30000원 이상인 주문 건의 갯수를 알기 위한 것이므로 어떤 컬럼이든 30000원 이상이면 갯수에 영향을 끼치지 않기 때문이다.

 

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

 

역시 나는 Query문 부터 작성한다...

select avg(price) as avg_price
from food_orders
where cuisine_type = 'Korean'

 

문제에서 '한국'음식이라는 것을 생각해야하기에 나는 food_orders 테이블에서 먼저 국가별 음식 중 'Korean' 음식만 나오도록 작성하고 마지막으론 음식 가격의 평균을 구하는 함수를 작성하면 된다.

 


 

group by로 범주별 연산 한 번에 끝내기.

 

단위를 나누어 숫자 계산이 가능하다.

 

국가별 음식 종류별 평균 가격을 구하기 위해 where절을 여러 개 사용하는 건 너무 비효율적이기 때문에 우리는 group by를 사용한다.

 

group by의 기본 구조는

 

select 카테고리컬럼(원하는 컬럼)
       sum(계산 컬럼)
from 테이블
group by 카테고리컬럼(원하는 컬럼)

 

이렇게만 봐도 충분히 이해가 되지만 더욱 쉽게 이해할 수 있도록 강사님께서 예시문을 알려주신다.

 

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

 

위 Query문을 해석한다면 food_orders 테이블에서 국가별 음식 정보를 가져오고 가격을 합산 하는데 마지막에 group by를 사용하여 국가별 음식 합산 금액을 정리한다.

 

국가별 음식 합산 금액

당연히도 sum을 avg로 바꾸면 평균값도 나타낼 수 있다.

 

실습 문제 하나만 풀어보자면.

 

1) 결제 타입별 가장 최근 결제일 조회하기.

 

select pay_type, max(date) as recent_data
from payments
group by pay_type

 

결제 타입 데이터가 어느 테이블에 있는지 먼저 불러와야함으로 payments 테이블을 불러온다. 

결제 타입 (pay_type)별로 가장 최근 날짜를 보기위해서 이니 group by에 pay_type를 작성하고, 가장 최근 날짜는 가장 높은 날짜 이기 때문에 max 함수를 이용하면 가장 최근 날짜가 나온다. 

 


 

Query 결과를 정렬하여 업무에 바로 사용하기(order by)

 

order by가 무엇이냐.

 

원하는 값을 기준으로 오름차순, 내림차순으로 정리 할 수 있는 구문이다.

이 또한 크게 이론적으론 다룰 게 없으니 Query를 작성하며 이해하는 편이 더욱 수월했다.

 

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

 

예시 Query문을 천천히 살펴보면 food_orders 테이블에서 국가별 음식 가격의 합산 금액을 나타내는 구문이다.

여기서 하나 추가되었다면 order by 구문에서 sum(price)가 추가 되었는데 이 부분은 금액의 합산 부분을 기준으로 오름차순으로 결과를 나타내라는 의미이다.

 

결과는 당연히 합산 금액을 기준으로 작은 수 부터 큰 수로 오름차순으로 결과가 나타날 것이다.

반대로 내림차순으로 나타내고 싶다면,

 

order by sum(price) desc

 

desc 를 뒤에 붙히면 내림차순으로 정렬된다.

 

바로 이어 실습문제를 풀어보자.

 

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

 

역시 Query문부터 작성해본다...

 

select restaurant_name, max(price) as max_price
from food_orders
group by restaurant_name
order by max(price) desc

 

음식점별 주문 금액이기 때문에 food_orders 테이블에서 가게 이름을 데이터를 가져오고, 가게별 주문 금액을 보기 위해 group by 구문에 음식점 이름(restaurant_name)을 넣어준다. 주문 금액 최댓값을 구하기 위해 max(price)를 사용하고 별명은 보기 편한 걸로 바꾼다. 주문 금액 최댓값 내림차순으로 정리하라고 하였으면 order by의 기준은 max(price)가 되고 뒤에 desc를 붙여준다.

 

마지막으로 SQL의 구조에 대해 다시 한 번 복습하자.

 

순서를 잘 기억하는 게 포인트.

 

select
from
where
group by
order by

 

위 순서로 기억해야한다.

 


 

마지막으로 2주차 숙제를 풀고 마무리한다.

 

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

select cuisine_type, min(price) as min_price, max(price) as max_price
from food_orders
group by cuisine_type
order by min(price) desc

'TIL > SQL' 카테고리의 다른 글

TIL 2024-09-25(SQL)  (2) 2024.09.25
TIL 2024-09-02 (SQL - 5주차)  (1) 2024.09.02
TIL 2024-08-30 (SQL - 4주차)  (1) 2024.08.30
TIL 2024-08-29 (SQL - 3주차)  (0) 2024.08.29
TIL 2024-08-26 (SQL - 1주차)  (0) 2024.08.27