SQL 강의 - 2주차 (GROUP BY, ORDER BY/엑셀보다 쉬운 SQL)

박삐뽀·2023년 4월 25일
0
post-thumbnail

# 2주차 목표

  1. Group by, Order by를 이해한다.
  2. 조금 더 복잡한 분석을 위해 자주 사용되는 유용한 문법을 익힌다.

# 데이터 분석의 목적

쌓여 있는 날 것의 데이터를 의미를 갖는 '정보'로 변환. 이때 의미 있는 정보는 통계치로 나타낼 수 있다. (아래 더 구체적으로 작성)
그리고 정보들을 범주(category)별로 묶어줄 수 있는데 이때 사용하는 것이 GROUP BY이다.

# GROUP BY

: 동일한 범주끼리 묶어서 통계를 내준다.

  • ex ) 성씨별 회원수를 Group by로 쉽게 구해보기
	SELECT name, COUNT(*) 
	FROM users u 
	GROUP BY name ;
  • 위 쿼리가 실행되는 순서 : from → group by → select
    1. from users : users 테이블 데이터 전체를 가져온다.
    2. group by name : users 테이블 데이터에서 같은 name을 갖는 데이터를 합친다.
    3. select name, count(*) : name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 센다.
    예) 이, 이, 김, 김, 박 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박은 1개!

# GROUP BY의 기능 : 통계

  • 최대(max)
  • 최소(min)
  • 평균(avg)
  • 합계(sum)
  • 개수(count)
	select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
	group by 범주가 담긴 필드명;

⭐최솟값, 평균, 합계를 구하고 싶을 땐 위 구문에서 최댓값을 min, avg, sum으로 치환해주면 된다!

예외로 개수(count)를 구할 땐

	select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
	group by 범주별로 세어주고 싶은 필드명;

이 규칙으로 하면 된다.

# ORDER BY

: 문자열(ㄱ-ㅎ or A-Z), 시간(숫자 0-9) 기준 데이터를 깔끔하게 정렬하는 기능.
아래와 같이 정렬하고자 하는 필드를 넣어 작성해주면 된다.

	select name, count(*) from users
	group by name
	order by count(*);

기본적으로 오름차순(asceding)으로 정렬되며(default값이라 아무 것도 안 써도 됨) 내림차순(descending)으로 하고 싶을 땐 DESC를 뒤에 적어준다.
내림차순은 시간, 날짜 등 최근 기록을 확인할 때 편리하다.

  • ex) like를 많이 받은 순서대로 '오늘의 다짐'을 출력해보자
	select * from checkins
	order by likes desc;
  • 위 쿼리가 실행되는 순서 : from → group by → select → order by
    1. from users: users 테이블 데이터 전체를 가져온다.
    2. group by name : users 테이블 데이터에서 같은 name을 갖는 데이터를 합친다.
    3. select name, count( ) : name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 센다.
    예) 이, 이, 김, 김, 박 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박은 1개겠죠!
    4. order by count(*) : 합쳐진 데이터의 개수에 따라 오름차순으로 정렬한다.
  • ex ) 웹개발 종합반의 결제수단별 주문건수 세어보기
	select payment_method, count(*) from orders
	where course_title = "웹개발 종합반"
	group by payment_method;
  • 위 쿼리가 실행되는 순서 : 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에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 센다.
    예) CARD, CARD, kakaopay 이렇게 데이터가 있었다면, CARD는 2개, kakaopay는 1개!
👉 만약 order by가 추가된다면? order by는 맨 나중에 실행된다. (결과물을 정렬해주는 것이기 때문!)

# Alias

: 쿼리가 길고 복잡해지면 헷갈리기 쉬우므로 Alias(별칭) 기능을 활용한다.
혼동을 최소화하고 원하는 이름으로 결과를 출력할 수 있다.

  • 테이블명 뒤에 붙이기 (이하 orders -> o로 표기 가능)
	select * from orders o
	where o.course_title = '앱개발 종합반'
  • 출력될 필드에 붙이기 (count(*) 필드가 cnt로 출력됨)
	select payment_method, count(*) as cnt from orders o
	where o.course_title = '앱개발 종합반'
	group by payment_method

# 예제

  1. Gmail 을 사용하는 성씨별 회원수 세어보기
	SELECT name, COUNT(*) 
	FROM users u
	WHERE email LIKE '%gmail.com'
	GROUP BY name ;
  1. course_id별 '오늘의 다짐'에 달린 평균 like 개수 구해보기
	SELECT course_id, AVG(likes)  
	FROM checkins c 
	GROUP BY course_id ;
  1. 네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기
	SELECT payment_method, COUNT(*) 
	FROM orders o
	WHERE email LIKE '%naver.com'
	AND course_title  = '앱개발 종합반' 
	GROUP BY payment_method ;

# 새로 배운 내용

  • 에러가 안 나는 쿼리를 작성하기 위해서는 SQL 쿼리가 실행되는 순서를 아는 것이 중요
  • 오름차순(asceding)/default, 내림차순(descending)/DESC
  • 내림차순은 시간, 날짜 등 최근 데이터부터 확인할 때 편리.

# 회고

  • [ max, min, avg, sum (@@값을 알고 싶은 필드명) ]
    <-> count (세어보려는 필드명)
    ※구문이 살짝 다르다. 헷갈림 주의!
  • 예제2 문장 해석이 헷갈려서 계속 같은 실수를 한다.
    [course_id별 '오늘의 다짐'에 달린 평균 like 개수 구한다]라고 했을 때 '개수'라는 단어 때문에 계속 count를 쓰는데, '평균'이 포인트이므로 avg(likes)로 써야 한다. => 반복해서 다시 풀어보기

  • 자주 하는 실수 :
    • select * <- 전체값을 수정하지 않는다.
      • 결과 : 구하고자 하는 필드와 통계치가 나오지 않는다.
      • 해결안 : *[필드명, 통계]으로 정확히 작성한다.
    • select문 안에 count(*)만 적는다.
      • 결과 : 원하는 통계치는 나왔지만 각각 어떤 범주에 대한 통계치인지는 나오지 않는다.
      • 해결안 : select문 안에 group by에 들어간 필드를 똑같이 적어준다.
        => [select 필드명, 통계값 from 테이블명]

원하는 결과가 출력되지 않을 땐, SQL 쿼리의 실행순서에 따라 차근차근 생각해봐야 어디서 쿼리를 잘못 짰는지 가장 빠르고 정확하게 찾아낼 수 있다.

profile
Life is egg.

0개의 댓글