본문 바로가기
AI SCHOOL/TIL

[DAY 20] SQL 많은 문제 풀이와 having, order by

2023. 1. 20.

지난 강의 복습을 제대로 했다는 느낌이 드는 날이었다.

저번 시간에 배운 내용과 관련해서 많은 문제를 풀었고 이후 새로운 내용이 나왔다.

where, group by, 집계함수 관련 문제

### SQL 연습문제 4-5
회원(users) 테이블에서 가입기간(created_at)이 2020년도 1월인 유저의 
국가별 가입자 수 (country_user_count)를 조회하세요.

select country, count(id) as country_user_count
from `thelook_ecommerce.users`
where created_at >= '2020-01-01' and created_at < '2020-02-01'
group by country

 

### SQL 연습문제 4-6
회원(users) 테이블에서 가입기간(created_at)이 2020년도 1월인 유저의 
국가별, 성별 가입자 수를 조회하세요.

select 
  country, 
  gender, 
  count(id) as country_gender_user_count
from `thelook_ecommerce.users`
where created_at >= '2020-01-01' and created_at < '2020-02-01'
group by country, gender

 

### SQL 연습문제 4-7
주문정보(orders) 테이블에서 2022년도의 주문 상태가 환불(Returned)인 유저의
아이디(user_id), 총 주문 아이템(num_of_item)의 합계를 조회하세요.

select user_id, sum(num_of_item)
from `thelook_ecommerce.orders`
where status = 'Returned'
and created_at >= '2022-01-01' and created_at < '2023-01-01'
group by user_id

날짜를 비교할 때는 시간을 적어주지 않으면 자동으로 00시 정각과 같은 의미이다.
예를 들어 '2023-01-01' 은 '2023-01-01 00:00:00'과 같은 의미가 된다.
그래서 유의해야 하는 경우가 있다.
우선 본 글에서 다루는 데이터를 보자.

created
날짜 + 시간 형태

BigQuery에서 users 테이블의 created_at 컬럼 데이터를 조회했다.
created_at 컬럼이 날짜 + 시간 형태로 되어있는 것을 확인할 수 있다.

이런 경우 만약 날짜 조건을 통해 2022년 데이터만 가져오고 싶다면 코드를 어떻게 작성해야 할까?

# 1. 비교 연산자 사용
where created_at >= '2022-01-01' and created_at < '2023-01-01'

# 2. between 사용 1
where created_at between '2022-01-01' and '2023-01-01'

# 3. between 사용 2
where created_at between '2022-01-01' and '2022-12-31'

1번은 비교 연산자를 사용해서 2022년 01월 01일 00시는 포함하고, 2023년 01월 01일 00시는 불포함하여 의도에 맞게 데이터를 조회할 수 있겠지만
2번은 2023년 01월 01일 00:00:00가 포함되어 혹시 모를 2023년 데이터가 조회될 수 있고,
3번은 2022년 12월 31일 00:00:00까지만 포함되어 그 이후의 2022년 12월 31일 데이터를 불포함 시키는 문제가 있다.

따라서 2022년 데이터만 정확히 가져오는 올바른 코드는 1번 뿐인 것이다.
물론 이러한 상황은 거의 일어나지 않지만, 날짜 데이터를 다룬다면 꼼꼼히 확인하면 좋을 것이다.

이어서 프로그래머스 SQL 문제를 풀었다.
나이 정보가 없는 회원 수 구하기
가장 비싼 상품 구하기
최솟값 구하기
동물 수 구하기
중복 제거하기

having

where절은 원천 데이터에 대한 필터, having 절은 집계가 나온 데이터에 대한 필터로 이해

# 예시 : 유저 수가 4000명 이상인 국가의 국가명, 유저 수 조회
select country, count(id) as user_count
from thelook_ecommerce.users
group by country
having user_count >= 4000

 

order by

결과 데이터 테이블을 원하는 순서로 정렬하기 위해 사용
asc, desc를 통해 오름차순, 내림차순 지정 가능하며 asc(오름차순)은 생략 가능

# 유저 데이터를 id 오름차순으로 조회
select * from thelook_ecommerce.users
order by id

# 유저 데이터를 id 내림차순으로 조회
select * from thelook_ecommerce.users
order by id desc

# 국가 오름차순, 국가가 같다면 생성일 내림차순으로 유저 데이터 조회
select * from thelook_ecommerce.users
order by country, created_at desc

# 유저 수 TOP3 국가의 국가명, 유저 수 조회
select country, count(id) as user_count
from thelook_ecommerce.users
group by country
order by user_count desc
limit 3

# 20세 이하 유저 수가 500명 이하인 국가 중 20세 이하 유저 수 TOP5 국가의 국가명, 유저 수 조회
select country, count(id) user_count
from thelook_ecommerce.users
where age <= 20
group by country
having user_count <= 500
order by user_count desc
limit 5

 

having, order by 관련 문제

프로그래머스 lv1
어린 동물 찾기
아픈 동물 찾기
이름이 있는 동물의 아이디
이름이 없는 동물의 아이디
인기있는 아이스크림
상위 n개 레코드
여러 기준으로 정렬하기
동물의 아이디와 이름
역순 정렬하기
모든 레코드 조회하기

프로그래머스 lv2
가격이 제일 비싼 식품의 정보 출력하기
이름에 el이 들어가는 동물 찾기
고양이와 개는 몇 마리 있을까
카테고리 별 상품 개수 구하기  => LEFT 함수 활용
가격대 별 상품 개수 구하기
동명 동물 수 찾기
재구매가 일어난 상품과 회원 리스트 구하기


### SQL 연습문제 5-1
회원 테이블(users)에서 국가별 유저수를 조회하세요. 
- 조회 항목 : 국가명(country), 국가별 유저수(user_count)
- 조건 : 국가의 유저수가 3000명 이상인 국가
- 정렬 : 국가별 유저수 많은순으로 정렬
SELECT country, COUNT(id) user_count
FROM `thelook_ecommerce.users`
GROUP BY country
HAVING user_count >= 3000
order by user_count desc​

 

### SQL 연습문제 5-2
상품정보(products) 테이블에서 제일 저렴한 여성 스웨터 5개를 조회하세요.
- 조건: - category : Sweaters
       - department : Women
- 정렬 : 판매가격(retail_price)이 낮은 순
- 갯수제한 : 5개
select * from `thelook_ecommerce.products`
where category = 'Sweaters' and department='Women'
order by retail_price
limit 5



### SQL 연습문제 5-3
상품정보(products) 테이블에서 여성 스웨터의 브랜드별 평균 판매가격이 100이하인 브랜드의 브랜드 이름과 여성스웨터 평균판매가격을  조회하세요.
- 조건 - category : Sweaters
      - department : Women
- 그룹조건 : 평균 판매가격이 100 이하
- 정렬순서 : 평균 판매가격이 낮은 순
select brand, avg(retail_price) retail_price_avg
from `thelook_ecommerce.products`
where category = 'Sweaters' and department='Women'
group by brand
having retail_price_avg <= 100
order by retail_price_avg desc

 

많은 내용을 하진 않았지만 좁은 범위에 대한 문제를 많이 풀어 보며 기초를 탄탄히 한 것 같다.

프로그래머스 문제는 저작권의 보호를 받는 저작물이므로 본문이나 풀이를 게시하면 후에 문제가 발생할 수도 있기 때문에 어떤 문제를 풀었는지 문제 제목만 작성하였다.

반응형

댓글