기존 where 절을 사용했을 때 생기는 문제점
한 데이터베이스에서 이** 이라는 사람의 명수를 구하는 문제는 where 절을 통해 쉽게 구할 수 있다.
select name, count(*) from users
where name = '이**'
출력결과)
그러나 성씨를 가진사람들의 각각의 명수를 구하는 문제에서는 범주의 범위가 넓아 구하기가 어렵다
이를 극복하기 위해 group by 가 쓰여진다.
그런데, 시트가 정렬이 잘되지 않은 것 같다. 이를 위해서 정렬에 도움을 주는 order by를 사용한다.
select name, count(*) from users
group by name
order by name// 이름별로 정렬
select name, count(*) from users
group by name
order by count(*)// 숫자별로 정렬
성씨를 가진사람들의 각각의 명수를 구하는 문제 에서 조건을 추가해보자
7월 12일 부터 7월 20일 사이에 계정을 생성한 사람의 한해서, 성씨를 가진사람들의 명수를 구하라
위같은 문제를 해결하기 위해선 where 절을 추가해야한다 아래와 같이 코드를 짜보자
select name, count(*) from users
group by name
where created_at BETWEEN '2020-07-12' AND '2020-07-20'
결과)
실행을 시키면 위와같이 오류가 발생한다. 왜 그럴까?? 그 이유는 아래와 같다.
where -> from -> group by -> select
말로 풀어내자면, where을통해 특정 필드의 조건을 만족하는 데이터를 자르고 from이 작동한 후, group by는 그 데이터를 범주단위로 묶는다 그리고 select를 통해 데이터를 불러온다
그렇기 때문에 where절 이 group by 보다 먼저 작성되어야 한다.
select name, count(*) from users
where created_at BETWEEN '2020-07-12'
And '2020-07-20'
group by name // 정렬을 추가하고 싶다면 order by 절을 아래에 작성해준다
group by는 그룹함수와 조합하여 이밖에 다양한 기능을 수행할 수 있다.
함수명 | 기능 | 사용 |
---|---|---|
count | 행의 수를 계산한다 | count(column or* ) |
max | 값들중 최댓값을 구한다 | max(column) |
min | 값들중 최솟갑을 구한다 | min(column) |
avg | 평균값을 구한다 | avg(column)//round와 같이 사용되기도함 |
variance | 분산값을 구한다 | variance(column) |
stddev | 표준편차를 구한다 | stddev(column) |
Alias (별칭)
코드를 길어질 때 어느 한 필드가 어떤 테이블의 필드인지 알아 볼 수 있게 해준다.
select * from users u // users u라고 줄였다.
where u.created_at BETWEEN '2020-07-12' //u.created_at은 users 테이블의 created_at 필드를 말한다
And '2020-07-20'