AI SCHOOL/SQL

[SQL] HAVING, ORDER BY

moru_xz 2023. 1. 20. 17:08

WHERE은 모든 데이터에서 필터, 그렇게 된 집계 데이터에서 한 번 더 필터 걸고 싶을 때 HAVING 

 

HAVING

- 그룹화된 데이터에 조건을 부여

- 그룹화된 데이터에 조건을 부여하므로 GROUP BY와 함께 사용

 

유저를 국가별로 그룹화하고 국가별 유저수가 4000 이상인 국가와 유저수를 조회

select 
  country, 
  count(id) as user_count
from `thelook_ecommerce.users`
group by country
having count(id) >= 4000;

 

ORDER BY

- 출력 결과를 정렬

- 오름차순 : ASC(기본, 작은 수에서 큰 수로, ASCENDING)

- 내림차순 : DESC(큰 수에서 작은 수로, DESCENDING)

 

아이디순으로 정렬하여 유저정보 확

select * 
from `thelook_ecommerce.users`
order by age asc;

일차정렬로 나이 내림차순, 이차정렬로 id 오름차순으로 조회

select * 
from `thelook_ecommerce.users` 
order by age desc, id asc;

작성 순서

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT

 

국가별 20세 이하 유저수가 500명 이상인 유저수 국가 TOP 5를 조회하는 과정

 

1) 모든 유저 데이터 조회 하기

select *
from `thelook_ecommerce.users` 

2) 모든 유저수를 카운트 합니다.

select count(id) as user_count
from `thelook_ecommerce.users` 

3) 나이가 20세 이하 조건을 추가합니다.

select count(id) as user_count
from `thelook_ecommerce.users` 
where age <= 20

4) 국가별로 그룹화해서 국가별 유저를 카운트 합니다.

select country, count(id) as user_count
from `thelook_ecommerce.users` 
where age <= 20
group by country

5) 그룹화한 결과에서 국가별 유저수가 1000명 이상인 국가의 데이터만 표시하도록 having 조건을 추가합니다.

select country, count(id) as user_count
from `thelook_ecommerce.users` 
where age <= 20
group by country
having user_count >= 500

6) 5의 결과를 국가별 유저수가 많은 순으로 정렬하여 조회합니다.

select country, count(id) as user_count
from `thelook_ecommerce.users` 
where age <= 20
group by country
having user_count >= 500
order by user_count desc

7) 6의 결과에서 상위 5개 국가의 유저수만 조회합니다.

select country, count(id) as user_count
from `thelook_ecommerce.users` 
where age <= 20
group by country
having user_count >= 500
order by user_count desc
limit 5

프로그래머스 문제 5-1 (level 1)

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT(INTAKE_CONDITION = 'Aged')
ORDER BY ANIMAL_ID ASC

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-2 (level 1)

SELECT ANIMAL_ID, NAME
from ANIMAL_INS
WHERE INTAKE_CONDITION IN ('Sick')
ORDER BY ANIMAL_ID ASC

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-3 (level 1)

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL 
ORDER BY ANIMAL_ID ASC

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-4(level 1)

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-5(level 1)

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-6(level 1)

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-7(level 1)

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS

ORDER BY NAME ASC, DATETIME DESC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-8(level 1)

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS

ORDER BY ANIMAL_ID ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-9(level 1)

SELECT NAME, DATETIME
FROM ANIMAL_INS

ORDER BY ANIMAL_ID DESC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스 문제 5-10(level 1)

SELECT *
FROM ANIMAL_INS

ORDER BY ANIMAL_ID ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-11(level 2)

SELECT *
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-12(level 2)

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%'
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME

# ANIMAL_TYPE을 안 해서 계속 틀렸음

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스 문제 5-13(level 2)

SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-14(level 2)

SELECT left(PRODUCT_CODE,2) AS CATEGORY, COUNT(PRODUCT_ID)
FROM PRODUCT
GROUP BY left(PRODUCT_CODE,2)
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-15(level 2)

SELECT LEFT(PRICE / 10000, 1) * 10000 AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC

PRICE_GROUP 으로 묶어서 각 그룹 마다의 수가 필요하니까 COUNT(PRODUCT_ID)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-16(level 12

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME 
HAVING COUNT >= 2
ORDER BY NAME ASC
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 문제 5-17(level 2)

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(ONLINE_SALE_ID) >= 2

ORDER BY USER_ID ASC, PRODUCT_ID DESC

# GROUP BY PRODUCT_ID 이유는...?

 


SQL 연습문제 5 (필수)

SQL 연습문제 5-1

회원 테이블(users)에서 국가별 유저수를 조회하세요.

  • 조회 항목 : 국가명(country), 국가별 유저수(user_count)
  • 조건 : 국가의 유저수가 3000명 이상인 국가
  • 정렬 : 국가별 유저수 많은순으로 정렬
select country, count(id) as 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 asc
LIMIT 5

SQL 연습문제 5-3

상품정보(products) 테이블에서 여성 스웨터의 브랜드별 평균 판매가격이 100이하인 브랜드의 브랜드 이름과 여성스웨터 평균판매가격을 조회하세요.

  • 조건
    • category : Sweaters
    • department : Women
  • 그룹조건 : 평균 판매가격이 100 이하
  • 정렬순서 : 평균 판매가격이 낮은 순
select brand, avg(retail_price) as retail_price_avg
from `thelook_ecommerce.products`
WHERE category = 'Sweaters' AND department = 'Women'
group by brand
having avg(retail_price) <= 100
ORDER BY retail_price_avg assc

SQL 연습문제 5-4

상품정보(products) 테이블에서 각 제품의 id, 이름, 카테고리, 브랜드, 비용(cost), 판매가(retail_price), 이익금액(profit), 이익율(profit_rate)을 조회하세요.

  • 이익금액(profit) : 판매가(retail_price) - 비용(cost)
  • 이익율(profit_rate) : (판매가(retail_price) - 비용(cost)) / 판매가(retail_price) * 100
  •  
select id, name, category, brand, cost, retail_price, (retail_price - cost)as profit, (((retail_price - cost) / retail_price) * 100) as profit_rate
from `thelook_ecommerce.products`

SQL 연습문제 5-5

상품정보(products) 테이블에서 수영카테고리 제품의 각 브랜드별 최소이익율, 최대 이익율, 평균 이익율을 조회하세요.

  • 조건
    • category : Swim
  • 이익율(profit_rate) : (판매가(retail_price) - 비용(cost)) / 판매가(retail_price) * 100
select brand, 
      min((retail_price - cost) / retail_price * 100) as min_profit_rate,
      max((retail_price - cost) / retail_price * 100) as max_profit_rate,
      avg((retail_price - cost) / retail_price * 100) as avg_profit_rate
from `thelook_ecommerce.products`
where category = 'Swim'
group by brand

SQL 연습문제 5-6

연습문제 5-5 데이터에서 평균이익율이 높은 TOP 5 브랜드와 평균이익율을 조회하세요.

select brand, 
       avg((retail_price - cost) / retail_price * 100) as avg_profit_rate
from `thelook_ecommerce.products`
where category = 'Swim'
group by brand
order by avg_profit_rate desc
limit 5

SQL 연습문제 5-7

상품정보(products) 테이블에서 카테고리 별 남성 제품의 수를 조회하세요. 단, 카테고리 중 ‘Sport’가 들어가지 않은 카테고리만 조회하시오.