[TIL] 엑셀보다 쉽고 빠른 SQL 2주차
2-1 2주차 학습 목표
Category: SQL
- 두 컬럼의 합계 값, 전체 데이터의 갯수 구하기
- 범주별 계산하기
- 데이터 오름차순, 내림차순 정렬하기
2-2 엑셀 대신 SQL로 한번에 계산하기 (SUM, AVERAGE, COUNT, MIN, MAX)
Category: SQL
SUM, AVERAGE
숫자 연산 예시
SELECT food_preparation_time,
delivery_time,
food_preparation_time + delivery_time as total_time
FROM food_orders
- 연산자 +, -, *, / 등 사용 가능
합계와 평균 구하기
select sum(food_preparation_time) total_food_preparation_time,
avg(delivery_time) avg_food_preparation_time
from food_orders
- 함수
- 합계:
SUM(column)
- 평균:
AVG(column)
- 합계:
- 풀이
- food_preparation_time column의
SUM
합계를 구하고 alias를 total_food_preparation_time으로 설정 - delivery_time column의
AVG
평균을 구하고 alias를 avg_food_preparation_time으로 설정
- food_preparation_time column의
SUM, AVG 실습
-- customers 테이블에서 age의 평균값을 구하고,
-- 해당 column의 alias를 average_of_age로 설정하기
SELECT AVG(age) as average_of_age
FROM customers
-- food_orders 테이블에서 price의 합계를 구하고,
-- 해당 column의 alias를 total_price로 설정하기
SELECT SUM(price) as total_price
FROM food_orders
COUNT
갯수 구하기 예시
SELECT COUNT(1) count_of_orders,
COUNT(distinct customer_id) count_of_customers
FROM food_orders
COUNT(*)
혹은COUNT(1)
은 테이블 안의 모든 데이터의 갯수를 카운트하라는 의미이다.COUNT(distinct column_name)
에서distinct
는 해당 column_name의 고유한 데이터 갯수를 카운트하라는 의미이다. 즉, 중복을 제거하는 함수이다.
갯수 구하기 실습
-- payments 테이블의 전체 데이터 갯수를 구하고, alias를 total_count로 설정
SELECT COUNT(1) as total_count
FROM payments
-- payments 테이블의 pay_type column의 고유한 데이터 갯수를 구하고,
-- alias를 count_of_pay_type으로 설정
SELECT COUNT(DISTINCT pay_type) as count_of_pay_type
FROM payments
MIN, MAX
최대값, 최소값 구하기 예시
SELECT MIN(price) min_price,
MAX(price) max_price
FROM food_orders
MIN(column_name)
column_name의 데이터 값 중 최소값을 구하라.MAX(column_name)
column_name의 데이터 값 중 최대값을 구하라.
최대값, 최소값 구하기 실습
-- food_orders 테이블에서 quantity column의 최소값과 최대값을 구하고,
-- 각 column의 alias를 min_quantity와 max_quantity로 설정하기
SELECT MIN(quantity) as min_quantity,
MAX(quantity) as max_quantity
from food_orders
2-3 [실습] WHERE 절로 원하는 데이터를 뽑고, 계산해보기
Category: SQL
1. [실습] 주문 금액이 30,000원 이상인 주문건의 갯수 구하기
🚀 Query를 작성하기 전, 1. 흐름을 정리하고, 2. 구문으로 만든 후, 3. 전체 구조로 합친다.
흐름 정리하기
- 어떤 테이블에서 데이터를 가져올까? → food_orders 테이블에서 가져오자.
- 어떤 컬럼을 이용할까? → 주문 금액이니 price 컬럼을 이용하자.
- 어떤 조건을 지정해야 할까? → 30,000원 이상
- 어떤 함수(수식)을 이용해야 할까? → 주문건의 갯수를 구해야하니
COUNT
함수
구문으로 만들기
FROM
food_ordersSELECT
priceWHERE
price>=
30000SELECT
COUNT
(price) →COUNT(1)
도 가능
전체 구조로 합치기
SELECT COUNT(price) as "cnt_orders"
FROM food_orders
WHERE price >= 30000
Results | cnt_orders |
---|---|
1 | 100 |
2. [실습] 한국 음식의 주문 당 평균 음식가격 구하기
SELECT AVG(price) avg_kr_price
FROM food_orders
WHERE cuisine_type = 'Korean'
Results | avg_kr_price |
---|---|
1 | 14001.5385 |
2-4 범주별 연산을 한 번에 끝내기 (GROUP BY)
Category: SQL
GROUP BY 예시
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
-
해석: food_orders 테이블에서, cuisine_type 컬럼으로 그룹 지어(
GROUP BY
) 각 cuisine_type 데이터에 해당하는 price 컬럼 데이터의 합계(SUM
)를 구하라.Results cuisine_type sum_of_price 1 Korean 182,020 2 Japanese 7,663,130 3 Mexican 1,303,850 4 American 9,530,780
실습해보자! 👩🏻💻
음식점별 주문 금액 최대값 조회하기
select cuisine_type,
max(price) as max_price
from food_orders
group by cuisine_type
Results | cuisine_type | sum_of_price |
---|---|---|
1 | Hangawi | 30,750 |
2 | Blue Ribbon Sushi Izakaya | 33,030 |
3 | Cafe Habana | 31,380 |
4 | Blue Ribbon Fried Chicken | 19,400 |
5 | Dirty Bird to Go | 29,390 |
결제 타입별 가장 최근 결제일 조회하기
select pay_type,
max(date) as recent_date
from payments
group by pay_type
Results | pay_type | recent_date |
---|---|---|
1 | card | 2021-03-21 |
2 | cash | 2021-05-06 |
2-5 Query 결과를 정렬하여 업무에 바로 사용하기 (ORDER BY)
Category: SQL
ORDER BY
함수를 사용하면 데이터가 변경되거나 삭제되어도 동일한 순서로 출력할 수 있다!
ORDER BY 예시
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
order by sum(price)
ORDER BY
특정 컬럼을 기준으로 정렬해줘!SUM(price)
오름차순으로 정렬된다.ORDER BY
default는 오름차순.ASC
Ascending- 내림차순은
DESC
Descending
실습해보자! 👩🏻💻
1. 음식점별 주문 금액 최대값 조회하기 - 최대값 기준으로 내림차순 정렬
select restaurant_name,
max(price) max_price
from food_orders
group by restaurant_name
order by max(price) desc
Results | restaurant_name | max_price |
---|---|---|
1 | Pylos | 35,410 |
2 | Han Dynasty | 34,190 |
3 | Blue Ribbon Sushi | 33,370 |
4 | Nobu Next Door | 33,370 |
2. 고객을 이름 순으로 오름차순으로 정렬하기
select *
from customers
order by name
Results | customer_id | name | gender | age | |
---|---|---|---|---|---|
1 | 232359 | 강도연 | http://hdcjcgshgmail.com/ | female | 78 |
2 | 110461 | 강도연 | mailto:lnldqztx@naver.com | male | 5 |
3 | 105068 | 강도연 | mailto:hgmdmpnp@naver.com | female | 49 |
4 | 117810 | 강도원 | http://wqmpzcqbgmail.com/ | male | 85 |
select *
from customers
order by gender, age, name
- 정렬 기준은 여러 컬럼이 될 수 있다. 쉼표로 구분한다.
Results | customer_id | name | gender | age | |
---|---|---|---|---|---|
1 | 301618 | 강윤진 | mailto:wiviukmg@daum.net | female | 1 |
2 | 220693 | 김서우 | mailto:orylqykh@daum.net | female | 1 |
3 | 42274 | 박도호 | http://rpbuxguggmail.com/ | female | 1 |
4 | 374826 | 박민서 | mailto:iplshijb@daum.net | female | 1 |
데이터에 동명이인이 많아 호기심으로
COUNT
함수를 써봤다.
select count(distinct name)
from customers
-- 중복되는 이름을 걸러내면 724명
Results | count(distinct name) |
---|---|
1 | 724 |
2-6 SQL 구조 마스터 - WHERE, GROUP BY, ORDER BY로 완성되는 SQL 구조
Category: SQL
SQL 문의 기본 구조
select
from
where
group by
order by
구조 맞춰보기 퀴즈! 🚀
-- Quiz. 1
select cuisine_type,
sum(delivery_time) total_delivery_time
from food_orders
where day_of_the_week='Weekend'
group by cuisine_type
order by sum(delivery_time) desc
-
해석: food_orders 테이블에서, cuisine_type 컬럼과 delivery_time 컬럼 데이터의 합계를 각각 가져오는데 delivery_time 합계 컬럼의 별명은 total_delivery_time으로 정하겠다. day_of_the_week이 Weekend 인 조건을 가져와라. 가져온 데이터는 cuisine_type 컬럼으로 분류하고, delivery_time 합계의 내림차순으로 정렬하라.
Results cuisine_type total_delivery_time 1 American 9355 2 Japanese 7544 3 Italian 4700 4 Chinese 3630 … … … 14 Vietnamese 100
-- Quiz. 2
select age, count(name) count_of_name
from customers
where age between 20 and 40
group by age
order by age
-
해석: customers 테이블에서 age 컬럼과 name 컬럼을 가져오는데, name 컬럼은 데이터의 개수를 센 값을 가져오고, 별명을 count_of_name으로 하겠다. age가 20 이상 40 이하인 조건인 경우만 가져와라. age로 분류하고, age 오름차순으로 정렬해라.
Results age count_of_name 1 21 13 2 22 27 3 23 8 4 24 13 … … … 18 39 9
2-7 2주차 끝 & 숙제 안내
Category: SQL
✅ 음식 종류별 가장 높은 주문 금액과 가장 낮은 주문 금액을 조회하고, 가장 낮은 주문 금액 순으로 (내림차순) 정렬하기
select cuisine_type,
min(price) min_price,
max(price) max_price
from food_orders
group by cuisine_type
order by min(price) desc
-
select
에 min, max 만 가져오라고 할 경우, 결과값에 min, max 컬럼에 1개 데이터씩 1열만 생성되어 내림차순 정리가 의미가 없어지므로 cusine_type 컬럼으로 분류해본다.Results cuisine_type min_price max_price 1 Spanish 12,130 29,100 2 French 11,980 29,250 3 Southern 7,380 31,430 4 Thai 6,690 32,930 … … … … 14 Japanese 4,470 33,370