Group by
, Order by
를 이해한다.쌓여 있는 날 것의 데이터를 의미를 갖는 '정보'로 변환. 이때 의미 있는 정보는 통계치로 나타낼 수 있다. (아래 더 구체적으로 작성)
그리고 정보들을 범주(category)별로 묶어줄 수 있는데 이때 사용하는 것이 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개!
select 범주가 담긴 필드명, max(최댓값을 알고 싶은 필드명) from 테이블명
group by 범주가 담긴 필드명;
⭐최솟값, 평균, 합계를 구하고 싶을 땐 위 구문에서 최댓값을 min, avg, sum으로 치환해주면 된다!
예외로 개수(count)를 구할 땐
select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
이 규칙으로 하면 된다.
: 문자열(ㄱ-ㅎ or A-Z), 시간(숫자 0-9) 기준 데이터를 깔끔하게 정렬하는 기능.
아래와 같이 정렬하고자 하는 필드를 넣어 작성해주면 된다.
select name, count(*) from users
group by name
order by count(*);
기본적으로 오름차순(asceding)으로 정렬되며(default값이라 아무 것도 안 써도 됨) 내림차순(descending)으로 하고 싶을 땐 DESC
를 뒤에 적어준다.
내림차순은 시간, 날짜 등 최근 기록을 확인할 때 편리하다.
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(*) : 합쳐진 데이터의 개수에 따라 오름차순으로 정렬한다.
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(별칭) 기능을 활용한다.
혼동을 최소화하고 원하는 이름으로 결과를 출력할 수 있다.
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
SELECT name, COUNT(*)
FROM users u
WHERE email LIKE '%gmail.com'
GROUP BY name ;
SELECT course_id, AVG(likes)
FROM checkins c
GROUP BY course_id ;
SELECT payment_method, COUNT(*)
FROM orders o
WHERE email LIKE '%naver.com'
AND course_title = '앱개발 종합반'
GROUP BY payment_method ;
max
, min
, avg
, sum
(@@값을 알고 싶은 필드명) ]count
(세어보려는 필드명)avg(likes)
로 써야 한다. => 반복해서 다시 풀어보기*
<- 전체값을 수정하지 않는다.*
을 [필드명, 통계]
으로 정확히 작성한다. count(*)
만 적는다.[select 필드명, 통계값 from 테이블명]
원하는 결과가 출력되지 않을 땐, SQL 쿼리의 실행순서에 따라 차근차근 생각해봐야 어디서 쿼리를 잘못 짰는지 가장 빠르고 정확하게 찾아낼 수 있다.