본문 바로가기
BackEnd/SQL

SQL공부 feat. 프로그래머스 (3) (JOIN - ON, GROUP BY - HAVING)

by Chaedie 2023. 3. 19.
728x90

JOIN - ON

-- 코드를 입력하세요
SELECT A.FLAVOR
FROM FIRST_HALF AS A 
     JOIN ICECREAM_INFO AS B
ON A.FLAVOR = B.FLAVOR
WHERE A.TOTAL_ORDER > 3000 AND 
      B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC

조건에 부합하는 중고거래 댓글 조회하기

SELECT 
  B.TITLE, 
  B.BOARD_ID, 
  R.REPLY_ID, 
  R.WRITER_ID, 
  R.CONTENTS, 
  DATE_FORMAT(R.CREATED_DATE, "%Y-%m-%d") AS CREATED_DATE 
FROM 
  USED_GOODS_BOARD AS B 
  JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID 
WHERE 
  B.CREATED_DATE >= "2022-10-01" 
  AND B.CREATED_DATE <= "2022-10-31" 
ORDER BY 
  R.CREATED_DATE, 
  B.TITLE;

상품 별 오프라인 매출 구하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/131533

-- 코드를 입력하세요
SELECT P.product_code,
       Sum(P.price * S.sales_amount) AS SALES
FROM   product P
       JOIN offline_sale S
         ON P.product_id = S.product_id
GROUP  BY P.product_code
ORDER  BY sales DESC,
          P.product_code

조건에 맞는 도서와 저자 리스트 출력하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/144854

-- 코드를 입력하세요
SELECT book_id,
       author_name,
       Date_format(published_date, "%y-%m-%d") AS PUBLISHED_DATE
FROM   book AS B
       JOIN author AS A
         ON B.author_id = A.author_id
WHERE  B.category = "경제"
ORDER  BY B.published_date;

GROUP BY - HAVING

GROUP BY - HAVING을 통해 특정 컬럼별로 그룹을 지어줄수있고, 이때 그룹별로 HAVING 절에 해당하는 조건으로 묶어줄 수 있다.

여기를 읽으면 이해가 된다. https://wkdtjsgur100.github.io/groupby-having/

재구매가 일어난 상품과 회원 리스트 구하기

프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131536

-- 코드를 입력하세요
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING count(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;

위 문제를 통해 예제 코드를 만들어 낼 수 있는데, 이것만으로 헷갈려서 좀 더 풀어봐야겠다.

동명 동물 수 찾기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/59041

-- 코드를 입력하세요
SELECT NAME,
       Count(*)
FROM   animal_ins
WHERE  NAME IS NOT NULL
GROUP  BY NAME
HAVING Count(*) >= 2
ORDER  BY NAME

가격대 별 상품 개수 구하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/131530

-- 코드를 입력하세요
SELECT Truncate(price, -4) AS PRICE_GROUP,
       Count(*)            AS PRODUCTS
FROM   product
GROUP  BY price_group
ORDER  BY price_group

TRUNCATE 을 사용하면 숫자 내림이 가능하다.

위 예제를 보면, 만원자리수 대로 셀렉한 애들을 그룹으로 엮어주었다. 신기했다.

진료과별 총 예약 횟수 출력하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/132202

-- 코드를 입력하세요
SELECT mcdp_cd        AS 진료과코드,
       Count(mcdp_cd) AS 5월예약건수
FROM   appointment
WHERE  Month(apnt_ymd) = 5
       AND Year(apnt_ymd) = 2022
GROUP  BY mcdp_cd
ORDER  BY 5월예약건수,
          진료과코드

ORDER BY할 떄 “5월예약건수” 이런식으로 했더니 자꾸 틀리더라. ORDER BY 할 땐 따옴표없이 5월예약건수 해야 된다.

동명 동물 수 찾기

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/59041

-- 코드를 입력하세요
SELECT NAME,
       Count(NAME) AS "COUNT"
FROM   animal_ins
WHERE  NAME IS NOT NULL
GROUP  BY NAME
HAVING Count(NAME) > 1
ORDER  BY NAME;

입양 시각 구하기(1)

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/59412

-- 코드를 입력하세요
SELECT Hour(datetime)   AS HOUR,
       Count(animal_id) AS COUNT
FROM   animal_outs
WHERE  Hour(datetime) >= 9
       AND Hour(datetime) <= 19
GROUP  BY hour
ORDER  BY hour;

궁금점 1: Where 절, Having절 두 방법 모두 조건을 걸 수 있는데, 어떤게 성능적으로 더 좋을까?

답 : HAVING은 SLELECT 한 애들을 그룹화하면서 having으로 조건 거는것,

WHERE은 SELECT할 떄 걸러서 들고 온 애들을 GROUP화하는것

그래서 WHERE로 Row 갯수를 줄인 뒤 다음 작업을 하는게 훨씬 빠르다.

궁금점 2: 조건식과 BETWEEN의 성능 차이는?

출처 : https://velog.io/@ggomjae/Mysql-Query-Between-과-성능-차이-비교-더미데이터-50만

결과 : 부등호가 빠르다.

기존에 알고 있던 상식으로는 = >= 등의 연산자가 BETWEEN IS 등의 연산자보다 빠르다고 알고있었는데, 이유까진 몰랐었다. 지금 읽고 있는 <Real My SQL8.0>을 얼른 다 읽어봐야겠다.

<친절한 SQL 튜닝>도 추천받았던 책인데 읽어봐야겠다.

성분으로 구분한 아이스크림 총 주문량

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/133026

-- 코드를 입력하세요
SELECT I.ingredient_type,
       Sum(total_order) AS TOTAL_ORDER
FROM   first_half AS F
       JOIN icecream_info AS I
         ON F.flavor = I.flavor
GROUP  BY I.ingredient_type
ORDER  BY total_order

댓글