sql

스파르타 코딩클럽 SQL 2주차 개발일지

야언 2022. 6. 14. 23:54

[수업 목표]

  1. 동일한 범주의 데이터를 묶어서 통계를 내주는 Group by를 이해한다.
  2. 출력하는 데이터를 필드의 값으로 정렬하여 출력하는 Order by를 익힌다.
  3. 조금 더 복잡한 분석을 위해 자주 사용되는 유용한 문법을 익힌다.


오늘 배울 것

  • 우리는 데이터에서 무엇이 궁금할까?
    • 통계: 최대 / 최소 / 평균 / 개수
      • 데이터 분석의 목적: 쌓여있는 날것의 데이터 → 의미를 갖는 '정보'로의 변환
    • 데이터베이스 테이블에 저장된 데이터: 쌓여있는 날것의 데이터
    • 가장 많은 Like를 받은 사람의 이름, 전체 신청자수, 평균 연령: 의미있는 '정보'
      • 더 나아가면? '범주 (category)' 각각의 정보가 궁금할 수 있습니다
    • 예) 과목별 신청자 평균 연령, 과목별 신청자수, 성씨별 회원수 등
  • 동일한 범주의 데이터를 묶어주는 Group by
    • Group by - 동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것
  • 깔끔하게 데이터를 정렬해보자: Order by
    • 데이터를 내림차순 혹은 오름차순으로 정렬

 

Group by, Order by 사용해보기

  • Group by 기능 알아보기
    • 동일한 범주의 개수 구하기 - count
      • ex) 주차별 '오늘의 다짐' 개수 구하기
        select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
        group by 범주별로 세어주고 싶은 필드명;
    • 동일한 범주에서의 최솟값 구하기 - min
      • ex)
        select 범주가 담긴 필드명, min(최솟값을 알고 싶은 필드명) from 테이블명
        group by 범주가 담긴 필드명;
    • 동일한 범주에서의 최댓값 구하기 - max
      • ex)
        select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
        group by 범주가 담긴 필드명;
    • 동일한 범주의 평균 구하기 - avg
      • select 범주가 담긴 필드명, avg(평균값을 알고 싶은 필드명) from 테이블명
        group by 범주가 담긴 필드명;
    • 동일한 범주의 합계 구하기 - sum
      • select 범주가 담긴 필드명, sum(합계를 알고 싶은 필드명) from 테이블명
        group by 범주가 담긴 필드명;
    • Group by 제대로 알아보기: SQL 쿼리가 실행되는 순서
      • select name, count(*) from users
        group by name;
      • 위 쿼리가 실행되는 순서: from → group by → select
        1. from users: users 테이블 데이터 전체를 가져옵니다.
        2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
        3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
  • Order by로 앞의 결과를 정렬해보자
    • 원본 쿼리
      select name, count(*) from users
      group by name;
    • 결과의 개수 오름차순으로 정렬해보기
      select name, count(*) from users
      group by name
      order by count(*);
    • 결과의 개수 내림차순으로 정렬해보기
    • select name, count(*) from users
      group by name
      order by count(*); desc; 
    • desc = descending
  • Order by 사용해보기
    • ex) like를 많이 받은 순서대로 '오늘의 다짐'을 출력
      select * from checkins
      order by likes desc;
    • 규칙 살펴보기
      select * from 테이블명
      order by 정렬의 기준이 될 필드명;
    • Order by 제대로 알아보기: SQL 쿼리가 실행되는 순서
      • select name, count(*) from users
        group by name
        order by count(*);
      • 위 쿼리가 실행되는 순서: from → group by → select → order by
        1. from users: users 테이블 데이터 전체를 가져옵니다.
        2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
        3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
        4. order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.
    • Where와 Group by, Order by 함께 사용해보기
      • Where절로 조건이 하나 추가되고, 그 이후에 Group by, Order by가 실행
        • ex) 웹개발 종합반의 결제수단별 주문건수 세어보기
          [순서]
          1. orders 테이블에서 주문 데이터를 읽어오고
          2. 웹개발 종합반 데이터만 남기고
          3. 결제수단(범주) 별로 그룹화하고
          4. 결제수단별 주문건수를 세어준다!
          select payment_method, count(*) from orders
          where course_title = "웹개발 종합반"
          group by payment_method;
      • 더 알아보기: SQL 쿼리가 실행되는 순서
        위 쿼리가 실행되는 순서: from → where → group by → select
        1. from orders: users 테이블 데이터 전체를 가져옵니다.
        2. where course_title = "웹개발 종합반": 웹개발 종합반 데이터만 남겨줍니다.
        3. group by payment_method: 같은 payment_method을 갖는 데이터를 합쳐줍니다.
        4. select payment_method, count(*): payment_method에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
    • [꿀팁] 이렇게 쿼리를 작성하면 편해요!
      1) show tables로 어떤 테이블이 있는지 살펴보기
      2) 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 limit 10 쿼리 날려보기
      3) 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
      4) 테이블을 찾았다! 범주를 나눠서 보고싶은 필드를 찾기
      5) 범주별로 통계를 보고싶은 필드를 찾기 6) SQL 쿼리 작성하기!

이외 유용한 문법 배워보기

  • 별칭 기능: Alias
    • 쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있습니다. 그래서 SQL은 Alias라는 별칭 기능을 지원합니다.
      • select * from orders o
        where o.course_title = '앱개발 종합반' 

        테이블명 뒤에 as를 붙여 별칭 추가

      • select payment_method, count(*) as cnt from orders o
        where o.course_title = '앱개발 종합반'
        group by payment_method

        출력될 필드에 별칭을 붙이는 것도 가능

      • 이처럼, 혼동을 최소화하고 원하는 이름으로 결과를 출력하기 위해 사용된다.