SQL

SQL 구조 마스터하기

추운날_너를_기다리며 2024. 6. 20. 16:19

1) 1주차 복습 - SQL 문의 기본 구조

  • SQL 문이란 : DB에서 데이터를 조회하기 위한 언어로,
  • SQL 문법을 이용하여 DB에 명령을 내리는 것을 Query 한다고 합니다.
  • SQL 문의 기본 구조
  • select # '데이터 조회' 의 명령어로 필수 구문 from # '어디에서 데이터를 조회할까' 의 명령어로 필수 구문 where # 조건을 지정해주는 구문
  • 조건을 지정하는 방법다양한 구문 : IN, BETWEEN, LIKE
  • 여러가지 조건의 적용 : AND, OR, NOT
  • 비교연산자 : <, >, =, <>

2) 2주차 수업에서 배울 내용

  • 두 컬럼의 합계 값을 뽑거나, 전체 데이터의 갯수를 구할 수 있을까?
  • 범주별로 계산을 할 수 있을까?
  • 데이터를 가나다 순으로 정렬한다면 보고서에 바로 사용할 수 있을텐데!

3) 엑셀 대신 SQL로 한번에 계산하기 (SUM, AVERAGE, COUNT, MIN, MAX)

  • 숫자 연산 기호를 SQL 에서도 사용 가능하다.
  • 숫자 연산의 사용 예시 (상품 준비시간과 배달시간의 합계 구하기)
  • select food_preparation_time, delivery_time, food_preparation_time + delivery_time as total_time from food_orders
  • 숫자 연산 종류 + - * /

4) 기본 연산, 합계와 평균 구하기

  • SQL 에서는 계산의 편의를 위해 함수를 제공하고 있습니다.
  • 사용방법은 엑셀과 유사하고, 유일하게 다른 점은 데이터의 범위가 아닌 계산할 ‘컬럼’을 적어준다는 것입니다.
  • 함수 종류
    • 합계 : SUM(컬럼)
    • 평균 : AVG(컬럼)
  • 사용 예시 (상품 준비시간의 합계와 평균 구하기)
  • select sum(food_preparation_time) total_food_preparation_time, avg(delivery_time) avg_food_preparation_time from food_orders

5) 전체 데이터의 갯수 구하기

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

  • 함수 종류
    • 데이터 갯수 : COUNT(컬럼) * 컬럼명 대신 1 혹은 * 사용 가능
    • 몇개의 값을 가지고 있는지 구할 떄 : DISTINCT
  • 예시
    • 데이터 갯수 : 주문 테이블의 전체 주문은 몇건인가요?
    • 몇개의 값을 가지고 있는지 구할 때 : 주문을 한 고객은 몇명인가요?
  • 사용 예시 (주문건수와, 주문 한 고객 수 구하기)
  • select count(1) count_of_orders, count(distinct customer_id) count_of_customers from food_orders

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

  • 함수 종류
    • 최솟값 : MIN(컬럼)
    • 최댓값 : MAX(컬럼)
  • 사용 예시 (주문 가격의 최솟값, 최댓값 구하기)
  • select min(price) min_price, max(price) max_price from food_orders

7) [실습] WHERE 절로 원하는 데이터를 뽑고, 계산해보기

  1. [실습] 주문 금액이 30,000원 이상인 주문건의 갯수 구하기
  2. select count(order_id) count_of_orders from food_orders where price>=30000
  3. [실습] 한국 음식의 주문 당 평균 음식가격 구하기
  4. select avg(price) as average_price from food_orders where cuisine_type='Korean'

8) GROUP BY로 범주별 연산 한 번에 끝내기

단위를 나누어 숫자 계산을 해봅시다

  • 카테고리별로 숫자 연산을 간단하게 하기
    • 음식 종류별로 평균 음식 가격을 구하기 위해 where 절을 사용해서 수십개의 쿼리를 작성하는 것은 너무 비효율적입니다. 이 문제를 Group by를 사용해서 어떻게 해결할 수 있을까요?
    • 편의를 위해서 ‘원하는 단위로 (eg. 음식 종류별, 식당별) 나누는 것’ 을 수업에서는 앞으로 ‘카테고리별로’ 계산을 한다고 명명하겠습니다
    • 여러번의 Query 없이, 카테고리를 지정하여 수식 함수로 연산을 할 수 있습니다.
    • 이 때 사용되는 구문이 Group by 입니다.
  • Group by 기본 구조
    • Group by 는 카테고리 컬럼 지정, 그리고 Group by 를 적어주는 것으로 적용 가능합니다.
    • 기본 구조
    • select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나)
    • 사용 예시(음식 종류별 주문 금액 합계)
    • select cuisine_type, sum(price) sum_of_price from food_orders group by cuisine_type
  • [실습] Group by 를 이용하여 카테고리별 연산해보기
    • 음식점별 주문 금액 최댓값 조회하기
    • select restaurant_name, max(price) "최대 주문금액" from food_orders group by restaurant_name
    • 결제 타입별 가장 최근 결제일 조회하기
    • select pay_type "결제타입", max(date) "최근 결제일" from payments group by pay_type

9) Query 결과를 정렬하여 업무에 바로 사용하기 (ORDER BY)

  • Query 결과는 항상 동일한 순서로 출력될까
    • 오름차순 : 숫자가 점점 커지는 순서로 정렬
    • 내림차순 : 숫자가 점점 작아지는 순서로 정렬
  • 정렬문 Order by 의 기본구조
    • Order by 는 카테고리 컬럼 지정, 그리고 Order by를 적어주는 것으로 적용 가능하다
    • 기본 구조
    select 카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼), from group by 카테고리컬럼(원하는컬럼 아무거나) order by 정렬을 원하는 컬럼 (카테고리컬럼(원하는컬럼 아무거나), sum(계산 컬럼) 둘 다 가능)
    • 사용 예시 (음식 종류별 주문 금액 합계를 ‘주문 금액 합계’ 기준으로 오름차순 정렬)
    • select cuisine_type, sum(price) sum_of_price from food_orders group by cuisine_type order by sum(price)
    • 정렬의 종류
      오름차순, 내림차순 desc
  • [실습] Order by를 이용하여 데이터를 정렬해보기
    • 음식점별 주문 금액 최댓값 조회하기 - 최댓값 기준으로 내림차순 정렬
    select restaurant_name, max(price) "최대 주문금액" from food_orders group by restaurant_name order by max(price) desc
    • 고객의 이름 순으로 오름차순으로 정렬하기
    select * from customers order by name

10) SQL 구조 마스터 - WHERE, GROUP BY, ORDER BY 로 완성되는 SQL 구조

  • 완성된 SQL 문의 기본 구조
  • 복습의 차원에서 한 번 보고 갑시다

select from where group by order by

  • [퀴즈] 조회 할 데이터를 SQL 구조에 맞춰서 바꿔보기
    • 구조 맞춰보기
    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) total_delivery_time
    • 정답
    • 5 → 4 → 3 → 2 → 1
    • 구조 맞춰보기
    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

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

정답 코드

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

'SQL' 카테고리의 다른 글

SQL Pivot table  (0) 2024.06.27
SQL subquery, join  (0) 2024.06.26
SQL substring, concat, if, case  (0) 2024.06.25
SQL 기본  (0) 2024.06.19