개발일지/SQL

2주차 - group by, order by, alias

FeelsKim 2022. 9. 26. 16:55

쿼리문을 통해 주어진 테이블을 조건에 맞게 재가공하고,

원하는 정보로 만드는 과정에서 결과값을 재구성하는 경우가 생긴다.

 

예를 들어 운영중인 쇼핑몰 주문내역으로부터

성별이나 나이, 지역에 따른 구매선호도나 전환율 등을 보고싶다고 하자.

성별이야 남,녀 2가지 경우의 수만 생각하면 되니 각각에 대해 쿼리문을 날려도 된다.

 

근데 만약 고객의 성씨별로 회원 수를 보려고 한다면?

 

slect * from users
where name like '김%'

slect * from users
where name like '이%'

slect * from users
where name like '박%'

slect * from users
where name like '정%'

.
.
.

 

최소 몇십개 이상은 족히 넘을 성씨마다 각각 쿼리문을 구하고 그걸 취합해야 하는 상황이 생길것이다.. 

 

그래서 있는 것이 group by다.

 

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

 

앞서 예를 든 상황의 반복적인 쿼리문들을 group by를 통해 하나의 쿼리문으로 처리할 수 있다.

group by에 보고자 하는 항목(name)을 입력 후,  select에서도 그 항목을 우선순위에 입력하면 

그 항목(name)에서 동일한 값(김씨, 이씨, 박씨 등)끼리 묶여 뒤이어 입력한 select 항목(count)의 통계를 볼 수 있게 된다.

 

 

단순히 성씨별 회원수가 아닌, 결제금액과 같은 숫자일 경우 최소값, 최대값, 평균값, 합도 구할 수 있다.

 

-- 최소값 >> min(대상필드) 사용
select name, min(order_price) from orders
group by name

-- 최대값 >> max(대상필드) 사용
select name, max(order_price) from orders
group by name

-- 평균값 >> avg(대상필드) 사용
select name, avg(order_price) from orders
group by name

-- 반올림 >> round(대상필드,반올림위치) 사용
select name, round(avg(order_price),1) from orders
group by name

-- 합 >> sum(대상필드) 사용
select name, sum(order_price) from orders
group by name

 

 

그리고 이렇게 나온 값을 깔끔히 정렬하기 위해 order by를 사용한다.

order by에 정렬할 기준이 되는 필드(count(*))를 입력하면 해당 필드를 기준으로 정렬이 가능한데,

오름차순(ascending)이 기본값이기 때문에 내림차순(descending)의 경우 desc를 추가해주면 된다. 

 

select name, count(*) from users
group by name
order by count(*)  -- >> 오름차순 (ascending)


select name, count(*) from users
group by name
order by count(*) desc  -- >> 내림차순 (descending)

 

마지막으로 alias. 

'통칭', '별칭' 등의 뜻으로, 말 그대로 특정필드명을 다른 이름으로 지정하는 기능이다.

쿼리문이 길고 복잡해질수록 대상이 되는 필드나 테이블 이름들이 헷갈리는 경우가 생기기 때문에

특정이름으로 지정해놓고 해당 필드를 연산하거나 실행할때 가독성있게 보이도록 사용할 수 있다. 

 

select name, count(*) as cnt_user from users u  -- alias 적용
group by name
order by count(*) desc

 

select에서 count(*)를 as를 통해 'cnt_user'로 지정하면, 실행시 해당 필드명이 cnt_user로 보이게 되어 데이터를 직관적으로 이해하기 쉬워진다.

from에선 users 테이블명을 'u'로 지정해줬는데,

select를 제외한 부분에선 그냥 해당 테이블 뒤에 지정할 이름만 추가해주면 된다.