[230120] 멋쟁이사자처럼 AI SCHOOL 8기 [특강] SQL_이범재강사님' 복습

조세연·2023년 1월 23일
0

멋사 AI SCHOOL 8기

목록 보기
21/35
post-thumbnail

📝Today I learned

🚀 TIL 목차 🚀

  • 데이터 집계
    - HAVING
    - ORDER BY
  • 예제 오답노트

[특강] SQL 기초

1) 데이터 집계

🔹 HAVING
: 그룹화된 데이터에 조건을 부여(집계된 결과에서 필터를 걸어야 할 때)

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

: 원천 데이터에서 조건을 걸고 싶다면 그냥 WHERE을 바로 사용

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

SELECT 
  country, 
  COUNT(id) AS user_count
FROM `thelook_ecommerce.users`
GROUP BY country
HAVING user_count >= 4000;

.
🚨 주의할 점 : 원천데이터에서 조건을 걸 땐 HAVING 대신 WHERE을 사용

# 추천하지 않는 방식.
SELECT 
	country,
    COUNT(id) AS country_user_count
FROM `thelook_ecommerce.users`
GROUP BY country
HAVING country = 'Japan'

# country는 원천 데이터에서 필터하는 게 더 좋은 방식
SELECT 
	country,
    COUNT(id) AS country_user_count
FROM `thelook_ecommerce.users`
WHERE country = 'Japan'
GROUP BY country

.
🚨 잠깐! 나의 실수

SELECT
	country,
    COUNT(id) AS country_user_count
FROM `thelook_ecommerce.users`
WHERE country = 'Japan'

🤔 WHERE에서 이미 Japan만 필터했는데 굳이 GROUP BY를 또 해야하나? SELECT에 바로 country 필드 불러오면 안되나?

👉 응 안됨. 지금 SELECT문을 보면 COUNT(id)라고 집계함수를 불러오고 있음. 집계함수를 SELECT로 불러오려면 무조건 GROUP BY가 필요함. COUNT(id)를 삭제하면 country 필드를 바로 불러올 수 있음.

🔹 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;

👉 2가지 기준으로 정렬을 할 땐 우선순위에 따라 차례대로 나란히 적으면 됨.
.

# 가입날짜가 가장 최신인 3명의 유저정보를 조회
SELECT * 
FROM `thelook_ecommerce.users` 
ORDER BY created_at DESC
LIMIT 3;

👉 상위 또는 하위 N개를 구하는 문제에서는 ORDER BYLIMIT 사용
.

2) 예제 오답 노트

.
1. 가격대별 상품개수 구하기
문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131530
<문제>
PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요.
이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고
가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요.
결과는 가격대를 기준으로 오름차순 정렬해주세요.

SELECT
	(PRICE - PRICE % 10000) AS PRICE_GROUP,
    COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC

👉 특정 자리수 이하를 버리는 방법(PRICE_GROUP 만들기)
1) PRICE - PRICE % 10000
2) TRUNCATE(PRICE,-4)
3) LEFT(PRICE/10000, 1)*10000

.
2. 동명 동물 수 찾기
문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/59041
<문제>
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과
해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요.
이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL OR NAME != ''
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME

👉 집계된 값으로 조건을 만들때는 HAVING
👉 이름으로 일단 묶고(GROUP BY NAME), 그 이름 중에서 이름 개수 카운트(COUNT(NAME) AS COUNT, HAVING COUNT >= 2)
.
3. 재구매가 일어난 상품과 회원 리스트 구하기
문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131536
<문제>
ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여,
재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요.
결과는 회원 ID를 기준으로 오름차순 정렬해주시고
회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

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

👉 조건이 2개라면 GROUP BY에 나란히 2개 적기
👉 ONLINE_SALE_ID: 판매 한 건의 고유값을 나타냄

❗이것만은 외우고 자자 Top 3

📌 집계된 결과에 필터를 걸어야 할 땐 HAVING, 원천 데이터에 필터를 걸어야 할 땐 WHERE

📌 특정 자리수 이하를 버리는 방법(PRICE_GROUP 만들기)
1) PRICE - PRICE % 10000
2) TRUNCATE(PRICE,-4)
3) LEFT(PRICE/10000, 1)*10000

📌 SELECT 문에 있는 모든 열은 집계 함수가 되거나 GROUP BY 절에 나타나야함

🌟데일리 피드백

1. 오늘의 칭찬&반성

문제푸는 시간이 많아서 오히려 재미있었다. 퀴즈, 퍼즐, 문제.. 이런 것을 좋아해서 다행이다.. 하지만 실무에서 많이 사용할법한 쿼리문은 나에게 상당히 어려웠다. 당황해서 쿼리짜는 순서를 안 지켰더니 문제가 더 안 풀어졌다. 침착하게 쿼리를 순서에 맞춰 논리적으로 작성하는 연습을 더 많이 해야겠다.

2. 내가 부족한 부분

GROUP BY가 아직 이해가 잘 안되서 오류가 많이 난다. 아래의 글을 읽고 확실히 개념을 파악해야지.
https://kimsyoung.tistory.com/entry/GROUP-BY下-오류문-해결하기

3. 내일의 목표

오늘 공부한 내용 한번 쭉 읽어보기

profile
HR Analyst가 되고 싶은

0개의 댓글